github.com/ccccaoqing/test@v0.0.0-20220510085219-3985d23445c0/src/cmd/ld/elf.h (about)

     1  /*
     2   * Derived from:
     3   * $FreeBSD: src/sys/sys/elf32.h,v 1.8.14.1 2005/12/30 22:13:58 marcel Exp $
     4   * $FreeBSD: src/sys/sys/elf64.h,v 1.10.14.1 2005/12/30 22:13:58 marcel Exp $
     5   * $FreeBSD: src/sys/sys/elf_common.h,v 1.15.8.1 2005/12/30 22:13:58 marcel Exp $
     6   * $FreeBSD: src/sys/alpha/include/elf.h,v 1.14 2003/09/25 01:10:22 peter Exp $
     7   * $FreeBSD: src/sys/amd64/include/elf.h,v 1.18 2004/08/03 08:21:48 dfr Exp $
     8   * $FreeBSD: src/sys/arm/include/elf.h,v 1.5.2.1 2006/06/30 21:42:52 cognet Exp $
     9   * $FreeBSD: src/sys/i386/include/elf.h,v 1.16 2004/08/02 19:12:17 dfr Exp $
    10   * $FreeBSD: src/sys/powerpc/include/elf.h,v 1.7 2004/11/02 09:47:01 ssouhlal Exp $
    11   * $FreeBSD: src/sys/sparc64/include/elf.h,v 1.12 2003/09/25 01:10:26 peter Exp $
    12   *
    13   * Copyright (c) 1996-1998 John D. Polstra.  All rights reserved.
    14   * Copyright (c) 2001 David E. O'Brien
    15   * Portions Copyright 2009 The Go Authors.  All rights reserved.
    16   *
    17   * Redistribution and use in source and binary forms, with or without
    18   * modification, are permitted provided that the following conditions
    19   * are met:
    20   * 1. Redistributions of source code must retain the above copyright
    21   *    notice, this list of conditions and the following disclaimer.
    22   * 2. Redistributions in binary form must reproduce the above copyright
    23   *    notice, this list of conditions and the following disclaimer in the
    24   *    documentation and/or other materials provided with the distribution.
    25   *
    26   * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
    27   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
    28   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
    29   * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
    30   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
    31   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
    32   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
    33   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
    34   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
    35   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
    36   * SUCH DAMAGE.
    37   *
    38   */
    39  
    40  /*
    41   * ELF definitions that are independent of architecture or word size.
    42   */
    43  
    44  /*
    45   * Note header.  The ".note" section contains an array of notes.  Each
    46   * begins with this header, aligned to a word boundary.  Immediately
    47   * following the note header is n_namesz bytes of name, padded to the
    48   * next word boundary.  Then comes n_descsz bytes of descriptor, again
    49   * padded to a word boundary.  The values of n_namesz and n_descsz do
    50   * not include the padding.
    51   */
    52  
    53  typedef struct {
    54  	uint32	n_namesz;	/* Length of name. */
    55  	uint32	n_descsz;	/* Length of descriptor. */
    56  	uint32	n_type;		/* Type of this note. */
    57  } Elf_Note;
    58  
    59  /* Indexes into the e_ident array.  Keep synced with
    60     http://www.sco.com/developer/gabi/ch4.eheader.html */
    61  #define EI_MAG0		0	/* Magic number, byte 0. */
    62  #define EI_MAG1		1	/* Magic number, byte 1. */
    63  #define EI_MAG2		2	/* Magic number, byte 2. */
    64  #define EI_MAG3		3	/* Magic number, byte 3. */
    65  #define EI_CLASS	4	/* Class of machine. */
    66  #define EI_DATA		5	/* Data format. */
    67  #define EI_VERSION	6	/* ELF format version. */
    68  #define EI_OSABI	7	/* Operating system / ABI identification */
    69  #define EI_ABIVERSION	8	/* ABI version */
    70  #define OLD_EI_BRAND	8	/* Start of architecture identification. */
    71  #define EI_PAD		9	/* Start of padding (per SVR4 ABI). */
    72  #define EI_NIDENT	16	/* Size of e_ident array. */
    73  
    74  /* Values for the magic number bytes. */
    75  #define ELFMAG0		0x7f
    76  #define ELFMAG1		'E'
    77  #define ELFMAG2		'L'
    78  #define ELFMAG3		'F'
    79  #define ELFMAG		"\177ELF"	/* magic string */
    80  #define SELFMAG		4		/* magic string size */
    81  
    82  /* Values for e_ident[EI_VERSION] and e_version. */
    83  #define EV_NONE		0
    84  #define EV_CURRENT	1
    85  
    86  /* Values for e_ident[EI_CLASS]. */
    87  #define ELFCLASSNONE	0	/* Unknown class. */
    88  #define ELFCLASS32	1	/* 32-bit architecture. */
    89  #define ELFCLASS64	2	/* 64-bit architecture. */
    90  
    91  /* Values for e_ident[EI_DATA]. */
    92  #define ELFDATANONE	0	/* Unknown data format. */
    93  #define ELFDATA2LSB	1	/* 2's complement little-endian. */
    94  #define ELFDATA2MSB	2	/* 2's complement big-endian. */
    95  
    96  /* Values for e_ident[EI_OSABI]. */
    97  #define ELFOSABI_NONE		0	/* UNIX System V ABI */
    98  #define ELFOSABI_HPUX		1	/* HP-UX operating system */
    99  #define ELFOSABI_NETBSD		2	/* NetBSD */
   100  #define ELFOSABI_LINUX		3	/* GNU/Linux */
   101  #define ELFOSABI_HURD		4	/* GNU/Hurd */
   102  #define ELFOSABI_86OPEN		5	/* 86Open common IA32 ABI */
   103  #define ELFOSABI_SOLARIS	6	/* Solaris */
   104  #define ELFOSABI_AIX		7	/* AIX */
   105  #define ELFOSABI_IRIX		8	/* IRIX */
   106  #define ELFOSABI_FREEBSD	9	/* FreeBSD */
   107  #define ELFOSABI_TRU64		10	/* TRU64 UNIX */
   108  #define ELFOSABI_MODESTO	11	/* Novell Modesto */
   109  #define ELFOSABI_OPENBSD	12	/* OpenBSD */
   110  #define ELFOSABI_OPENVMS	13	/* Open VMS */
   111  #define ELFOSABI_NSK		14	/* HP Non-Stop Kernel */
   112  #define ELFOSABI_ARM		97	/* ARM */
   113  #define ELFOSABI_STANDALONE	255	/* Standalone (embedded) application */
   114  
   115  #define ELFOSABI_SYSV		ELFOSABI_NONE	/* symbol used in old spec */
   116  #define ELFOSABI_MONTEREY	ELFOSABI_AIX	/* Monterey */
   117  
   118  /* e_ident */
   119  #define IS_ELF(ehdr)	((ehdr).e_ident[EI_MAG0] == ELFMAG0 && \
   120  			 (ehdr).e_ident[EI_MAG1] == ELFMAG1 && \
   121  			 (ehdr).e_ident[EI_MAG2] == ELFMAG2 && \
   122  			 (ehdr).e_ident[EI_MAG3] == ELFMAG3)
   123  
   124  /* Values for e_type. */
   125  #define ET_NONE		0	/* Unknown type. */
   126  #define ET_REL		1	/* Relocatable. */
   127  #define ET_EXEC		2	/* Executable. */
   128  #define ET_DYN		3	/* Shared object. */
   129  #define ET_CORE		4	/* Core file. */
   130  #define ET_LOOS		0xfe00	/* First operating system specific. */
   131  #define ET_HIOS		0xfeff	/* Last operating system-specific. */
   132  #define ET_LOPROC	0xff00	/* First processor-specific. */
   133  #define ET_HIPROC	0xffff	/* Last processor-specific. */
   134  
   135  /* Values for e_machine. */
   136  #define EM_NONE		0	/* Unknown machine. */
   137  #define EM_M32		1	/* AT&T WE32100. */
   138  #define EM_SPARC	2	/* Sun SPARC. */
   139  #define EM_386		3	/* Intel i386. */
   140  #define EM_68K		4	/* Motorola 68000. */
   141  #define EM_88K		5	/* Motorola 88000. */
   142  #define EM_860		7	/* Intel i860. */
   143  #define EM_MIPS		8	/* MIPS R3000 Big-Endian only. */
   144  #define EM_S370		9	/* IBM System/370. */
   145  #define EM_MIPS_RS3_LE	10	/* MIPS R3000 Little-Endian. */
   146  #define EM_PARISC	15	/* HP PA-RISC. */
   147  #define EM_VPP500	17	/* Fujitsu VPP500. */
   148  #define EM_SPARC32PLUS	18	/* SPARC v8plus. */
   149  #define EM_960		19	/* Intel 80960. */
   150  #define EM_PPC		20	/* PowerPC 32-bit. */
   151  #define EM_PPC64	21	/* PowerPC 64-bit. */
   152  #define EM_S390		22	/* IBM System/390. */
   153  #define EM_V800		36	/* NEC V800. */
   154  #define EM_FR20		37	/* Fujitsu FR20. */
   155  #define EM_RH32		38	/* TRW RH-32. */
   156  #define EM_RCE		39	/* Motorola RCE. */
   157  #define EM_ARM		40	/* ARM. */
   158  #define EM_SH		42	/* Hitachi SH. */
   159  #define EM_SPARCV9	43	/* SPARC v9 64-bit. */
   160  #define EM_TRICORE	44	/* Siemens TriCore embedded processor. */
   161  #define EM_ARC		45	/* Argonaut RISC Core. */
   162  #define EM_H8_300	46	/* Hitachi H8/300. */
   163  #define EM_H8_300H	47	/* Hitachi H8/300H. */
   164  #define EM_H8S		48	/* Hitachi H8S. */
   165  #define EM_H8_500	49	/* Hitachi H8/500. */
   166  #define EM_IA_64	50	/* Intel IA-64 Processor. */
   167  #define EM_MIPS_X	51	/* Stanford MIPS-X. */
   168  #define EM_COLDFIRE	52	/* Motorola ColdFire. */
   169  #define EM_68HC12	53	/* Motorola M68HC12. */
   170  #define EM_MMA		54	/* Fujitsu MMA. */
   171  #define EM_PCP		55	/* Siemens PCP. */
   172  #define EM_NCPU		56	/* Sony nCPU. */
   173  #define EM_NDR1		57	/* Denso NDR1 microprocessor. */
   174  #define EM_STARCORE	58	/* Motorola Star*Core processor. */
   175  #define EM_ME16		59	/* Toyota ME16 processor. */
   176  #define EM_ST100	60	/* STMicroelectronics ST100 processor. */
   177  #define EM_TINYJ	61	/* Advanced Logic Corp. TinyJ processor. */
   178  #define EM_X86_64	62	/* Advanced Micro Devices x86-64 */
   179  
   180  /* Non-standard or deprecated. */
   181  #define EM_486		6	/* Intel i486. */
   182  #define EM_MIPS_RS4_BE	10	/* MIPS R4000 Big-Endian */
   183  #define EM_ALPHA_STD	41	/* Digital Alpha (standard value). */
   184  #define EM_ALPHA	0x9026	/* Alpha (written in the absence of an ABI) */
   185  
   186  /* Special section indexes. */
   187  #define SHN_UNDEF	     0		/* Undefined, missing, irrelevant. */
   188  #define SHN_LORESERVE	0xff00		/* First of reserved range. */
   189  #define SHN_LOPROC	0xff00		/* First processor-specific. */
   190  #define SHN_HIPROC	0xff1f		/* Last processor-specific. */
   191  #define SHN_LOOS	0xff20		/* First operating system-specific. */
   192  #define SHN_HIOS	0xff3f		/* Last operating system-specific. */
   193  #define SHN_ABS		0xfff1		/* Absolute values. */
   194  #define SHN_COMMON	0xfff2		/* Common data. */
   195  #define SHN_XINDEX	0xffff		/* Escape -- index stored elsewhere. */
   196  #define SHN_HIRESERVE	0xffff		/* Last of reserved range. */
   197  
   198  /* sh_type */
   199  #define SHT_NULL		0	/* inactive */
   200  #define SHT_PROGBITS		1	/* program defined information */
   201  #define SHT_SYMTAB		2	/* symbol table section */
   202  #define SHT_STRTAB		3	/* string table section */
   203  #define SHT_RELA		4	/* relocation section with addends */
   204  #define SHT_HASH		5	/* symbol hash table section */
   205  #define SHT_DYNAMIC		6	/* dynamic section */
   206  #define SHT_NOTE		7	/* note section */
   207  #define SHT_NOBITS		8	/* no space section */
   208  #define SHT_REL			9	/* relocation section - no addends */
   209  #define SHT_SHLIB		10	/* reserved - purpose unknown */
   210  #define SHT_DYNSYM		11	/* dynamic symbol table section */
   211  #define SHT_INIT_ARRAY		14	/* Initialization function pointers. */
   212  #define SHT_FINI_ARRAY		15	/* Termination function pointers. */
   213  #define SHT_PREINIT_ARRAY	16	/* Pre-initialization function ptrs. */
   214  #define SHT_GROUP		17	/* Section group. */
   215  #define SHT_SYMTAB_SHNDX	18	/* Section indexes (see SHN_XINDEX). */
   216  #define SHT_LOOS	0x60000000	/* First of OS specific semantics */
   217  #define SHT_HIOS	0x6fffffff	/* Last of OS specific semantics */
   218  #define SHT_GNU_VERDEF	0x6ffffffd
   219  #define SHT_GNU_VERNEED	0x6ffffffe
   220  #define SHT_GNU_VERSYM	0x6fffffff
   221  #define SHT_LOPROC	0x70000000	/* reserved range for processor */
   222  #define SHT_HIPROC	0x7fffffff	/* specific section header types */
   223  #define SHT_LOUSER	0x80000000	/* reserved range for application */
   224  #define SHT_HIUSER	0xffffffff	/* specific indexes */
   225  
   226  /* Flags for sh_flags. */
   227  #define SHF_WRITE		0x1	/* Section contains writable data. */
   228  #define SHF_ALLOC		0x2	/* Section occupies memory. */
   229  #define SHF_EXECINSTR		0x4	/* Section contains instructions. */
   230  #define SHF_MERGE		0x10	/* Section may be merged. */
   231  #define SHF_STRINGS		0x20	/* Section contains strings. */
   232  #define SHF_INFO_LINK		0x40	/* sh_info holds section index. */
   233  #define SHF_LINK_ORDER		0x80	/* Special ordering requirements. */
   234  #define SHF_OS_NONCONFORMING	0x100	/* OS-specific processing required. */
   235  #define SHF_GROUP		0x200	/* Member of section group. */
   236  #define SHF_TLS			0x400	/* Section contains TLS data. */
   237  #define SHF_MASKOS	0x0ff00000	/* OS-specific semantics. */
   238  #define SHF_MASKPROC	0xf0000000	/* Processor-specific semantics. */
   239  
   240  /* Values for p_type. */
   241  #define PT_NULL		0	/* Unused entry. */
   242  #define PT_LOAD		1	/* Loadable segment. */
   243  #define PT_DYNAMIC	2	/* Dynamic linking information segment. */
   244  #define PT_INTERP	3	/* Pathname of interpreter. */
   245  #define PT_NOTE		4	/* Auxiliary information. */
   246  #define PT_SHLIB	5	/* Reserved (not used). */
   247  #define PT_PHDR		6	/* Location of program header itself. */
   248  #define PT_TLS		7	/* Thread local storage segment */
   249  #define PT_LOOS		0x60000000	/* First OS-specific. */
   250  #define PT_HIOS		0x6fffffff	/* Last OS-specific. */
   251  #define PT_LOPROC	0x70000000	/* First processor-specific type. */
   252  #define PT_HIPROC	0x7fffffff	/* Last processor-specific type. */
   253  #define PT_GNU_STACK	0x6474e551
   254  #define PT_PAX_FLAGS	0x65041580
   255  
   256  /* Values for p_flags. */
   257  #define PF_X		0x1		/* Executable. */
   258  #define PF_W		0x2		/* Writable. */
   259  #define PF_R		0x4		/* Readable. */
   260  #define PF_MASKOS	0x0ff00000	/* Operating system-specific. */
   261  #define PF_MASKPROC	0xf0000000	/* Processor-specific. */
   262  
   263  /* Values for d_tag. */
   264  #define DT_NULL		0	/* Terminating entry. */
   265  /* String table offset of a needed shared library. */
   266  #define DT_NEEDED	1
   267  #define DT_PLTRELSZ	2	/* Total size in bytes of PLT relocations. */
   268  #define DT_PLTGOT	3	/* Processor-dependent address. */
   269  #define DT_HASH		4	/* Address of symbol hash table. */
   270  #define DT_STRTAB	5	/* Address of string table. */
   271  #define DT_SYMTAB	6	/* Address of symbol table. */
   272  #define DT_RELA		7	/* Address of ElfNN_Rela relocations. */
   273  #define DT_RELASZ	8	/* Total size of ElfNN_Rela relocations. */
   274  #define DT_RELAENT	9	/* Size of each ElfNN_Rela relocation entry. */
   275  #define DT_STRSZ	10	/* Size of string table. */
   276  #define DT_SYMENT	11	/* Size of each symbol table entry. */
   277  #define DT_INIT		12	/* Address of initialization function. */
   278  #define DT_FINI		13	/* Address of finalization function. */
   279  /* String table offset of shared object name. */
   280  #define DT_SONAME	14
   281  #define DT_RPATH	15	/* String table offset of library path. [sup] */
   282  #define DT_SYMBOLIC	16	/* Indicates "symbolic" linking. [sup] */
   283  #define DT_REL		17	/* Address of ElfNN_Rel relocations. */
   284  #define DT_RELSZ	18	/* Total size of ElfNN_Rel relocations. */
   285  #define DT_RELENT	19	/* Size of each ElfNN_Rel relocation. */
   286  #define DT_PLTREL	20	/* Type of relocation used for PLT. */
   287  #define DT_DEBUG	21	/* Reserved (not used). */
   288  /* Indicates there may be relocations in non-writable segments. [sup] */
   289  #define DT_TEXTREL	22
   290  #define DT_JMPREL	23	/* Address of PLT relocations. */
   291  #define	DT_BIND_NOW	24	/* [sup] */
   292  /* Address of the array of pointers to initialization functions */
   293  #define	DT_INIT_ARRAY	25
   294  /* Address of the array of pointers to termination functions */
   295  #define	DT_FINI_ARRAY	26
   296  /* Size in bytes of the array of initialization functions. */
   297  #define	DT_INIT_ARRAYSZ	27
   298  /* Size in bytes of the array of terminationfunctions. */
   299  #define	DT_FINI_ARRAYSZ	28
   300  /* String table offset of a null-terminated library search path string. */
   301  #define	DT_RUNPATH	29
   302  #define	DT_FLAGS	30	/* Object specific flag values. */
   303  /*	Values greater than or equal to DT_ENCODING and less than
   304  	DT_LOOS follow the rules for the interpretation of the d_un
   305  	union as follows: even == 'd_ptr', even == 'd_val' or none */
   306  #define	DT_ENCODING	32
   307  /* Address of the array of pointers to pre-initialization functions. */
   308  #define	DT_PREINIT_ARRAY 32
   309  /* Size in bytes of the array of pre-initialization functions. */
   310  #define	DT_PREINIT_ARRAYSZ 33
   311  #define	DT_LOOS		0x6000000d	/* First OS-specific */
   312  #define	DT_HIOS		0x6ffff000	/* Last OS-specific */
   313  #define	DT_LOPROC	0x70000000	/* First processor-specific type. */
   314  #define	DT_HIPROC	0x7fffffff	/* Last processor-specific type. */
   315  
   316  #define	DT_VERNEED	0x6ffffffe
   317  #define	DT_VERNEEDNUM	0x6fffffff
   318  #define	DT_VERSYM	0x6ffffff0
   319  
   320  /* Values for DT_FLAGS */
   321  /*	Indicates that the object being loaded may make reference to
   322  	the $ORIGIN substitution string */
   323  #define	DF_ORIGIN	0x0001
   324  #define	DF_SYMBOLIC	0x0002	/* Indicates "symbolic" linking. */
   325  /* Indicates there may be relocations in non-writable segments. */
   326  #define	DF_TEXTREL	0x0004
   327  /*	Indicates that the dynamic linker should process all
   328  	relocations for the object containing this entry before
   329  	transferring control to the program.  */
   330  #define	DF_BIND_NOW	0x0008
   331  /*	Indicates that the shared object or executable contains code
   332  	using a static thread-local storage scheme.  */
   333  #define	DF_STATIC_TLS	0x0010
   334  
   335  /* Values for n_type.  Used in core files. */
   336  #define NT_PRSTATUS	1	/* Process status. */
   337  #define NT_FPREGSET	2	/* Floating point registers. */
   338  #define NT_PRPSINFO	3	/* Process state info. */
   339  
   340  /* Symbol Binding - ELFNN_ST_BIND - st_info */
   341  #define STB_LOCAL	0	/* Local symbol */
   342  #define STB_GLOBAL	1	/* Global symbol */
   343  #define STB_WEAK	2	/* like global - lower precedence */
   344  #define STB_LOOS	10	/* Reserved range for operating system */
   345  #define STB_HIOS	12	/*   specific semantics. */
   346  #define STB_LOPROC	13	/* reserved range for processor */
   347  #define STB_HIPROC	15	/*   specific semantics. */
   348  
   349  /* Symbol type - ELFNN_ST_TYPE - st_info */
   350  #define STT_NOTYPE	0	/* Unspecified type. */
   351  #define STT_OBJECT	1	/* Data object. */
   352  #define STT_FUNC	2	/* Function. */
   353  #define STT_SECTION	3	/* Section. */
   354  #define STT_FILE	4	/* Source file. */
   355  #define STT_COMMON	5	/* Uninitialized common block. */
   356  #define STT_TLS		6	/* TLS object. */
   357  #define STT_LOOS	10	/* Reserved range for operating system */
   358  #define STT_HIOS	12	/*   specific semantics. */
   359  #define STT_LOPROC	13	/* reserved range for processor */
   360  #define STT_HIPROC	15	/*   specific semantics. */
   361  
   362  /* Symbol visibility - ELFNN_ST_VISIBILITY - st_other */
   363  #define STV_DEFAULT	0x0	/* Default visibility (see binding). */
   364  #define STV_INTERNAL	0x1	/* Special meaning in relocatable objects. */
   365  #define STV_HIDDEN	0x2	/* Not visible. */
   366  #define STV_PROTECTED	0x3	/* Visible but not preemptible. */
   367  
   368  /* Special symbol table indexes. */
   369  #define STN_UNDEF	0	/* Undefined symbol index. */
   370  
   371  /*
   372   * ELF definitions common to all 32-bit architectures.
   373   */
   374  
   375  typedef uint32	Elf32_Addr;
   376  typedef uint16	Elf32_Half;
   377  typedef uint32	Elf32_Off;
   378  typedef int32		Elf32_Sword;
   379  typedef uint32	Elf32_Word;
   380  
   381  typedef Elf32_Word	Elf32_Hashelt;
   382  
   383  /* Non-standard class-dependent datatype used for abstraction. */
   384  typedef Elf32_Word	Elf32_Size;
   385  typedef Elf32_Sword	Elf32_Ssize;
   386  
   387  /*
   388   * ELF header.
   389   */
   390  
   391  typedef struct {
   392  	unsigned char	ident[EI_NIDENT];	/* File identification. */
   393  	Elf32_Half	type;		/* File type. */
   394  	Elf32_Half	machine;	/* Machine architecture. */
   395  	Elf32_Word	version;	/* ELF format version. */
   396  	Elf32_Addr	entry;	/* Entry point. */
   397  	Elf32_Off	phoff;	/* Program header file offset. */
   398  	Elf32_Off	shoff;	/* Section header file offset. */
   399  	Elf32_Word	flags;	/* Architecture-specific flags. */
   400  	Elf32_Half	ehsize;	/* Size of ELF header in bytes. */
   401  	Elf32_Half	phentsize;	/* Size of program header entry. */
   402  	Elf32_Half	phnum;	/* Number of program header entries. */
   403  	Elf32_Half	shentsize;	/* Size of section header entry. */
   404  	Elf32_Half	shnum;	/* Number of section header entries. */
   405  	Elf32_Half	shstrndx;	/* Section name strings section. */
   406  } Elf32_Ehdr;
   407  
   408  /*
   409   * Section header.
   410   */
   411  
   412  typedef struct {
   413  	Elf32_Word	name;	/* Section name (index into the
   414  					   section header string table). */
   415  	Elf32_Word	type;	/* Section type. */
   416  	Elf32_Word	flags;	/* Section flags. */
   417  	Elf32_Addr	vaddr;	/* Address in memory image. */
   418  	Elf32_Off	off;	/* Offset in file. */
   419  	Elf32_Word	size;	/* Size in bytes. */
   420  	Elf32_Word	link;	/* Index of a related section. */
   421  	Elf32_Word	info;	/* Depends on section type. */
   422  	Elf32_Word	addralign;	/* Alignment in bytes. */
   423  	Elf32_Word	entsize;	/* Size of each entry in section. */
   424  } Elf32_Shdr;
   425  
   426  /*
   427   * Program header.
   428   */
   429  
   430  typedef struct {
   431  	Elf32_Word	type;		/* Entry type. */
   432  	Elf32_Off	off;	/* File offset of contents. */
   433  	Elf32_Addr	vaddr;	/* Virtual address in memory image. */
   434  	Elf32_Addr	paddr;	/* Physical address (not used). */
   435  	Elf32_Word	filesz;	/* Size of contents in file. */
   436  	Elf32_Word	memsz;	/* Size of contents in memory. */
   437  	Elf32_Word	flags;	/* Access permission flags. */
   438  	Elf32_Word	align;	/* Alignment in memory and file. */
   439  } Elf32_Phdr;
   440  
   441  /*
   442   * Dynamic structure.  The ".dynamic" section contains an array of them.
   443   */
   444  
   445  typedef struct {
   446  	Elf32_Sword	d_tag;		/* Entry type. */
   447  	union {
   448  		Elf32_Word	d_val;	/* Integer value. */
   449  		Elf32_Addr	d_ptr;	/* Address value. */
   450  	} d_un;
   451  } Elf32_Dyn;
   452  
   453  /*
   454   * Relocation entries.
   455   */
   456  
   457  /* Relocations that don't need an addend field. */
   458  typedef struct {
   459  	Elf32_Addr	off;	/* Location to be relocated. */
   460  	Elf32_Word	info;		/* Relocation type and symbol index. */
   461  } Elf32_Rel;
   462  
   463  /* Relocations that need an addend field. */
   464  typedef struct {
   465  	Elf32_Addr	off;	/* Location to be relocated. */
   466  	Elf32_Word	info;		/* Relocation type and symbol index. */
   467  	Elf32_Sword	addend;	/* Addend. */
   468  } Elf32_Rela;
   469  
   470  /* Macros for accessing the fields of r_info. */
   471  #define ELF32_R_SYM(info)	((info) >> 8)
   472  #define ELF32_R_TYPE(info)	((unsigned char)(info))
   473  
   474  /* Macro for constructing r_info from field values. */
   475  #define ELF32_R_INFO(sym, type)	(((sym) << 8) + (unsigned char)(type))
   476  
   477  /*
   478   * Relocation types.
   479   */
   480  
   481  #define	R_X86_64_NONE	0	/* No relocation. */
   482  #define	R_X86_64_64	1	/* Add 64 bit symbol value. */
   483  #define	R_X86_64_PC32	2	/* PC-relative 32 bit signed sym value. */
   484  #define	R_X86_64_GOT32	3	/* PC-relative 32 bit GOT offset. */
   485  #define	R_X86_64_PLT32	4	/* PC-relative 32 bit PLT offset. */
   486  #define	R_X86_64_COPY	5	/* Copy data from shared object. */
   487  #define	R_X86_64_GLOB_DAT 6	/* Set GOT entry to data address. */
   488  #define	R_X86_64_JMP_SLOT 7	/* Set GOT entry to code address. */
   489  #define	R_X86_64_RELATIVE 8	/* Add load address of shared object. */
   490  #define	R_X86_64_GOTPCREL 9	/* Add 32 bit signed pcrel offset to GOT. */
   491  #define	R_X86_64_32	10	/* Add 32 bit zero extended symbol value */
   492  #define	R_X86_64_32S	11	/* Add 32 bit sign extended symbol value */
   493  #define	R_X86_64_16	12	/* Add 16 bit zero extended symbol value */
   494  #define	R_X86_64_PC16	13	/* Add 16 bit signed extended pc relative symbol value */
   495  #define	R_X86_64_8	14	/* Add 8 bit zero extended symbol value */
   496  #define	R_X86_64_PC8	15	/* Add 8 bit signed extended pc relative symbol value */
   497  #define	R_X86_64_DTPMOD64 16	/* ID of module containing symbol */
   498  #define	R_X86_64_DTPOFF64 17	/* Offset in TLS block */
   499  #define	R_X86_64_TPOFF64 18	/* Offset in static TLS block */
   500  #define	R_X86_64_TLSGD	19	/* PC relative offset to GD GOT entry */
   501  #define	R_X86_64_TLSLD	20	/* PC relative offset to LD GOT entry */
   502  #define	R_X86_64_DTPOFF32 21	/* Offset in TLS block */
   503  #define	R_X86_64_GOTTPOFF 22	/* PC relative offset to IE GOT entry */
   504  #define	R_X86_64_TPOFF32 23	/* Offset in static TLS block */
   505  #define	R_X86_64_GOTPCRELX	41
   506  #define	R_X86_64_REX_GOTPCRELX	42
   507  #define	R_X86_64_COUNT	26	/* Count of defined relocation types. */
   508  
   509  
   510  #define	R_ALPHA_NONE		0	/* No reloc */
   511  #define	R_ALPHA_REFLONG		1	/* Direct 32 bit */
   512  #define	R_ALPHA_REFQUAD		2	/* Direct 64 bit */
   513  #define	R_ALPHA_GPREL32		3	/* GP relative 32 bit */
   514  #define	R_ALPHA_LITERAL		4	/* GP relative 16 bit w/optimization */
   515  #define	R_ALPHA_LITUSE		5	/* Optimization hint for LITERAL */
   516  #define	R_ALPHA_GPDISP		6	/* Add displacement to GP */
   517  #define	R_ALPHA_BRADDR		7	/* PC+4 relative 23 bit shifted */
   518  #define	R_ALPHA_HINT		8	/* PC+4 relative 16 bit shifted */
   519  #define	R_ALPHA_SREL16		9	/* PC relative 16 bit */
   520  #define	R_ALPHA_SREL32		10	/* PC relative 32 bit */
   521  #define	R_ALPHA_SREL64		11	/* PC relative 64 bit */
   522  #define	R_ALPHA_OP_PUSH		12	/* OP stack push */
   523  #define	R_ALPHA_OP_STORE	13	/* OP stack pop and store */
   524  #define	R_ALPHA_OP_PSUB		14	/* OP stack subtract */
   525  #define	R_ALPHA_OP_PRSHIFT	15	/* OP stack right shift */
   526  #define	R_ALPHA_GPVALUE		16
   527  #define	R_ALPHA_GPRELHIGH	17
   528  #define	R_ALPHA_GPRELLOW	18
   529  #define	R_ALPHA_IMMED_GP_16	19
   530  #define	R_ALPHA_IMMED_GP_HI32	20
   531  #define	R_ALPHA_IMMED_SCN_HI32	21
   532  #define	R_ALPHA_IMMED_BR_HI32	22
   533  #define	R_ALPHA_IMMED_LO32	23
   534  #define	R_ALPHA_COPY		24	/* Copy symbol at runtime */
   535  #define	R_ALPHA_GLOB_DAT	25	/* Create GOT entry */
   536  #define	R_ALPHA_JMP_SLOT	26	/* Create PLT entry */
   537  #define	R_ALPHA_RELATIVE	27	/* Adjust by program base */
   538  
   539  #define	R_ALPHA_COUNT		28
   540  
   541  
   542  #define	R_ARM_NONE		0	/* No relocation. */
   543  #define	R_ARM_PC24		1
   544  #define	R_ARM_ABS32		2
   545  #define	R_ARM_REL32		3
   546  #define	R_ARM_PC13		4
   547  #define	R_ARM_ABS16		5
   548  #define	R_ARM_ABS12		6
   549  #define	R_ARM_THM_ABS5		7
   550  #define	R_ARM_ABS8		8
   551  #define	R_ARM_SBREL32		9
   552  #define	R_ARM_THM_PC22		10
   553  #define	R_ARM_THM_PC8		11
   554  #define	R_ARM_AMP_VCALL9	12
   555  #define	R_ARM_SWI24		13
   556  #define	R_ARM_THM_SWI8		14
   557  #define	R_ARM_XPC25		15
   558  #define	R_ARM_THM_XPC22		16
   559  #define	R_ARM_COPY		20	/* Copy data from shared object. */
   560  #define	R_ARM_GLOB_DAT		21	/* Set GOT entry to data address. */
   561  #define	R_ARM_JUMP_SLOT		22	/* Set GOT entry to code address. */
   562  #define	R_ARM_RELATIVE		23	/* Add load address of shared object. */
   563  #define	R_ARM_GOTOFF		24	/* Add GOT-relative symbol address. */
   564  #define	R_ARM_GOTPC		25	/* Add PC-relative GOT table address. */
   565  #define	R_ARM_GOT32		26	/* Add PC-relative GOT offset. */
   566  #define	R_ARM_PLT32		27	/* Add PC-relative PLT offset. */
   567  #define	R_ARM_CALL		28
   568  #define	R_ARM_JUMP24	29
   569  #define	R_ARM_V4BX		40
   570  #define	R_ARM_GOT_PREL		96
   571  #define	R_ARM_GNU_VTENTRY	100
   572  #define	R_ARM_GNU_VTINHERIT	101
   573  #define	R_ARM_TLS_IE32		107
   574  #define	R_ARM_TLS_LE32		108
   575  #define	R_ARM_RSBREL32		250
   576  #define	R_ARM_THM_RPC22		251
   577  #define	R_ARM_RREL32		252
   578  #define	R_ARM_RABS32		253
   579  #define	R_ARM_RPC24		254
   580  #define	R_ARM_RBASE		255
   581  
   582  #define	R_ARM_COUNT		38	/* Count of defined relocation types. */
   583  
   584  
   585  #define	R_386_NONE	0	/* No relocation. */
   586  #define	R_386_32	1	/* Add symbol value. */
   587  #define	R_386_PC32	2	/* Add PC-relative symbol value. */
   588  #define	R_386_GOT32	3	/* Add PC-relative GOT offset. */
   589  #define	R_386_PLT32	4	/* Add PC-relative PLT offset. */
   590  #define	R_386_COPY	5	/* Copy data from shared object. */
   591  #define	R_386_GLOB_DAT	6	/* Set GOT entry to data address. */
   592  #define	R_386_JMP_SLOT	7	/* Set GOT entry to code address. */
   593  #define	R_386_RELATIVE	8	/* Add load address of shared object. */
   594  #define	R_386_GOTOFF	9	/* Add GOT-relative symbol address. */
   595  #define	R_386_GOTPC	10	/* Add PC-relative GOT table address. */
   596  #define	R_386_TLS_TPOFF	14	/* Negative offset in static TLS block */
   597  #define	R_386_TLS_IE	15	/* Absolute address of GOT for -ve static TLS */
   598  #define	R_386_TLS_GOTIE	16	/* GOT entry for negative static TLS block */
   599  #define	R_386_TLS_LE	17	/* Negative offset relative to static TLS */
   600  #define	R_386_TLS_GD	18	/* 32 bit offset to GOT (index,off) pair */
   601  #define	R_386_TLS_LDM	19	/* 32 bit offset to GOT (index,zero) pair */
   602  #define	R_386_TLS_GD_32	24	/* 32 bit offset to GOT (index,off) pair */
   603  #define	R_386_TLS_GD_PUSH 25	/* pushl instruction for Sun ABI GD sequence */
   604  #define	R_386_TLS_GD_CALL 26	/* call instruction for Sun ABI GD sequence */
   605  #define	R_386_TLS_GD_POP 27	/* popl instruction for Sun ABI GD sequence */
   606  #define	R_386_TLS_LDM_32 28	/* 32 bit offset to GOT (index,zero) pair */
   607  #define	R_386_TLS_LDM_PUSH 29	/* pushl instruction for Sun ABI LD sequence */
   608  #define	R_386_TLS_LDM_CALL 30	/* call instruction for Sun ABI LD sequence */
   609  #define	R_386_TLS_LDM_POP 31	/* popl instruction for Sun ABI LD sequence */
   610  #define	R_386_TLS_LDO_32 32	/* 32 bit offset from start of TLS block */
   611  #define	R_386_TLS_IE_32	33	/* 32 bit offset to GOT static TLS offset entry */
   612  #define	R_386_TLS_LE_32	34	/* 32 bit offset within static TLS block */
   613  #define	R_386_TLS_DTPMOD32 35	/* GOT entry containing TLS index */
   614  #define	R_386_TLS_DTPOFF32 36	/* GOT entry containing TLS offset */
   615  #define	R_386_TLS_TPOFF32 37	/* GOT entry of -ve static TLS offset */
   616  #define	R_386_GOT32X 43
   617  
   618  #define	R_386_COUNT	39	/* Count of defined relocation types. */
   619  
   620  #define	R_PPC_NONE		0	/* No relocation. */
   621  #define	R_PPC_ADDR32		1
   622  #define	R_PPC_ADDR24		2
   623  #define	R_PPC_ADDR16		3
   624  #define	R_PPC_ADDR16_LO		4
   625  #define	R_PPC_ADDR16_HI		5
   626  #define	R_PPC_ADDR16_HA		6
   627  #define	R_PPC_ADDR14		7
   628  #define	R_PPC_ADDR14_BRTAKEN	8
   629  #define	R_PPC_ADDR14_BRNTAKEN	9
   630  #define	R_PPC_REL24		10
   631  #define	R_PPC_REL14		11
   632  #define	R_PPC_REL14_BRTAKEN	12
   633  #define	R_PPC_REL14_BRNTAKEN	13
   634  #define	R_PPC_GOT16		14
   635  #define	R_PPC_GOT16_LO		15
   636  #define	R_PPC_GOT16_HI		16
   637  #define	R_PPC_GOT16_HA		17
   638  #define	R_PPC_PLTREL24		18
   639  #define	R_PPC_COPY		19
   640  #define	R_PPC_GLOB_DAT		20
   641  #define	R_PPC_JMP_SLOT		21
   642  #define	R_PPC_RELATIVE		22
   643  #define	R_PPC_LOCAL24PC		23
   644  #define	R_PPC_UADDR32		24
   645  #define	R_PPC_UADDR16		25
   646  #define	R_PPC_REL32		26
   647  #define	R_PPC_PLT32		27
   648  #define	R_PPC_PLTREL32		28
   649  #define	R_PPC_PLT16_LO		29
   650  #define	R_PPC_PLT16_HI		30
   651  #define	R_PPC_PLT16_HA		31
   652  #define	R_PPC_SDAREL16		32
   653  #define	R_PPC_SECTOFF		33
   654  #define	R_PPC_SECTOFF_LO	34
   655  #define	R_PPC_SECTOFF_HI	35
   656  #define	R_PPC_SECTOFF_HA	36
   657  
   658  #define	R_PPC_COUNT		37	/* Count of defined relocation types. */
   659  
   660  #define R_PPC_TLS		67
   661  #define R_PPC_DTPMOD32		68
   662  #define R_PPC_TPREL16		69
   663  #define R_PPC_TPREL16_LO	70
   664  #define R_PPC_TPREL16_HI	71
   665  #define R_PPC_TPREL16_HA	72
   666  #define R_PPC_TPREL32		73
   667  #define R_PPC_DTPREL16		74
   668  #define R_PPC_DTPREL16_LO	75
   669  #define R_PPC_DTPREL16_HI	76
   670  #define R_PPC_DTPREL16_HA	77
   671  #define R_PPC_DTPREL32		78
   672  #define R_PPC_GOT_TLSGD16	79
   673  #define R_PPC_GOT_TLSGD16_LO	80
   674  #define R_PPC_GOT_TLSGD16_HI	81
   675  #define R_PPC_GOT_TLSGD16_HA	82
   676  #define R_PPC_GOT_TLSLD16	83
   677  #define R_PPC_GOT_TLSLD16_LO	84
   678  #define R_PPC_GOT_TLSLD16_HI	85
   679  #define R_PPC_GOT_TLSLD16_HA	86
   680  #define R_PPC_GOT_TPREL16	87
   681  #define R_PPC_GOT_TPREL16_LO	88
   682  #define R_PPC_GOT_TPREL16_HI	89
   683  #define R_PPC_GOT_TPREL16_HA	90
   684  
   685  #define	R_PPC_EMB_NADDR32	101
   686  #define	R_PPC_EMB_NADDR16	102
   687  #define	R_PPC_EMB_NADDR16_LO	103
   688  #define	R_PPC_EMB_NADDR16_HI	104
   689  #define	R_PPC_EMB_NADDR16_HA	105
   690  #define	R_PPC_EMB_SDAI16	106
   691  #define	R_PPC_EMB_SDA2I16	107
   692  #define	R_PPC_EMB_SDA2REL	108
   693  #define	R_PPC_EMB_SDA21		109
   694  #define	R_PPC_EMB_MRKREF	110
   695  #define	R_PPC_EMB_RELSEC16	111
   696  #define	R_PPC_EMB_RELST_LO	112
   697  #define	R_PPC_EMB_RELST_HI	113
   698  #define	R_PPC_EMB_RELST_HA	114
   699  #define	R_PPC_EMB_BIT_FLD	115
   700  #define	R_PPC_EMB_RELSDA	116
   701  
   702  					/* Count of defined relocation types. */
   703  #define	R_PPC_EMB_COUNT		(R_PPC_EMB_RELSDA - R_PPC_EMB_NADDR32 + 1)
   704  
   705  
   706  #define R_SPARC_NONE		0
   707  #define R_SPARC_8		1
   708  #define R_SPARC_16		2
   709  #define R_SPARC_32		3
   710  #define R_SPARC_DISP8		4
   711  #define R_SPARC_DISP16		5
   712  #define R_SPARC_DISP32		6
   713  #define R_SPARC_WDISP30		7
   714  #define R_SPARC_WDISP22		8
   715  #define R_SPARC_HI22		9
   716  #define R_SPARC_22		10
   717  #define R_SPARC_13		11
   718  #define R_SPARC_LO10		12
   719  #define R_SPARC_GOT10		13
   720  #define R_SPARC_GOT13		14
   721  #define R_SPARC_GOT22		15
   722  #define R_SPARC_PC10		16
   723  #define R_SPARC_PC22		17
   724  #define R_SPARC_WPLT30		18
   725  #define R_SPARC_COPY		19
   726  #define R_SPARC_GLOB_DAT	20
   727  #define R_SPARC_JMP_SLOT	21
   728  #define R_SPARC_RELATIVE	22
   729  #define R_SPARC_UA32		23
   730  #define R_SPARC_PLT32		24
   731  #define R_SPARC_HIPLT22		25
   732  #define R_SPARC_LOPLT10		26
   733  #define R_SPARC_PCPLT32		27
   734  #define R_SPARC_PCPLT22		28
   735  #define R_SPARC_PCPLT10		29
   736  #define R_SPARC_10		30
   737  #define R_SPARC_11		31
   738  #define R_SPARC_64		32
   739  #define R_SPARC_OLO10		33
   740  #define R_SPARC_HH22		34
   741  #define R_SPARC_HM10		35
   742  #define R_SPARC_LM22		36
   743  #define R_SPARC_PC_HH22		37
   744  #define R_SPARC_PC_HM10		38
   745  #define R_SPARC_PC_LM22		39
   746  #define R_SPARC_WDISP16		40
   747  #define R_SPARC_WDISP19		41
   748  #define R_SPARC_GLOB_JMP	42
   749  #define R_SPARC_7		43
   750  #define R_SPARC_5		44
   751  #define R_SPARC_6		45
   752  #define	R_SPARC_DISP64		46
   753  #define	R_SPARC_PLT64		47
   754  #define	R_SPARC_HIX22		48
   755  #define	R_SPARC_LOX10		49
   756  #define	R_SPARC_H44		50
   757  #define	R_SPARC_M44		51
   758  #define	R_SPARC_L44		52
   759  #define	R_SPARC_REGISTER	53
   760  #define	R_SPARC_UA64		54
   761  #define	R_SPARC_UA16		55
   762  
   763  
   764  /*
   765   * Magic number for the elf trampoline, chosen wisely to be an immediate
   766   * value.
   767   */
   768  #define ARM_MAGIC_TRAMP_NUMBER	0x5c000003
   769  
   770  
   771  /*
   772   * Symbol table entries.
   773   */
   774  
   775  typedef struct {
   776  	Elf32_Word	name;	/* String table index of name. */
   777  	Elf32_Addr	value;	/* Symbol value. */
   778  	Elf32_Word	size;	/* Size of associated object. */
   779  	unsigned char	info;	/* Type and binding information. */
   780  	unsigned char	other;	/* Reserved (not used). */
   781  	Elf32_Half	shndx;	/* Section index of symbol. */
   782  } Elf32_Sym;
   783  
   784  /* Macros for accessing the fields of st_info. */
   785  #define ELF32_ST_BIND(info)		((info) >> 4)
   786  #define ELF32_ST_TYPE(info)		((info) & 0xf)
   787  
   788  /* Macro for constructing st_info from field values. */
   789  #define ELF32_ST_INFO(bind, type)	(((bind) << 4) + ((type) & 0xf))
   790  
   791  /* Macro for accessing the fields of st_other. */
   792  #define ELF32_ST_VISIBILITY(oth)	((oth) & 0x3)
   793  
   794  /*
   795   * ELF definitions common to all 64-bit architectures.
   796   */
   797  
   798  typedef uint64	Elf64_Addr;
   799  typedef uint16	Elf64_Half;
   800  typedef uint64	Elf64_Off;
   801  typedef int32		Elf64_Sword;
   802  typedef int64		Elf64_Sxword;
   803  typedef uint32	Elf64_Word;
   804  typedef uint64	Elf64_Xword;
   805  
   806  /*
   807   * Types of dynamic symbol hash table bucket and chain elements.
   808   *
   809   * This is inconsistent among 64 bit architectures, so a machine dependent
   810   * typedef is required.
   811   */
   812  
   813  #ifdef __alpha__
   814  typedef Elf64_Off	Elf64_Hashelt;
   815  #else
   816  typedef Elf64_Word	Elf64_Hashelt;
   817  #endif
   818  
   819  /* Non-standard class-dependent datatype used for abstraction. */
   820  typedef Elf64_Xword	Elf64_Size;
   821  typedef Elf64_Sxword	Elf64_Ssize;
   822  
   823  /*
   824   * ELF header.
   825   */
   826  
   827  typedef struct {
   828  	unsigned char	ident[EI_NIDENT];	/* File identification. */
   829  	Elf64_Half	type;		/* File type. */
   830  	Elf64_Half	machine;	/* Machine architecture. */
   831  	Elf64_Word	version;	/* ELF format version. */
   832  	Elf64_Addr	entry;	/* Entry point. */
   833  	Elf64_Off	phoff;	/* Program header file offset. */
   834  	Elf64_Off	shoff;	/* Section header file offset. */
   835  	Elf64_Word	flags;	/* Architecture-specific flags. */
   836  	Elf64_Half	ehsize;	/* Size of ELF header in bytes. */
   837  	Elf64_Half	phentsize;	/* Size of program header entry. */
   838  	Elf64_Half	phnum;	/* Number of program header entries. */
   839  	Elf64_Half	shentsize;	/* Size of section header entry. */
   840  	Elf64_Half	shnum;	/* Number of section header entries. */
   841  	Elf64_Half	shstrndx;	/* Section name strings section. */
   842  } Elf64_Ehdr;
   843  
   844  /*
   845   * Section header.
   846   */
   847  
   848  typedef struct Elf64_Shdr Elf64_Shdr;
   849  struct Elf64_Shdr {
   850  	Elf64_Word	name;	/* Section name (index into the
   851  					   section header string table). */
   852  	Elf64_Word	type;	/* Section type. */
   853  	Elf64_Xword	flags;	/* Section flags. */
   854  	Elf64_Addr	addr;	/* Address in memory image. */
   855  	Elf64_Off	off;	/* Offset in file. */
   856  	Elf64_Xword	size;	/* Size in bytes. */
   857  	Elf64_Word	link;	/* Index of a related section. */
   858  	Elf64_Word	info;	/* Depends on section type. */
   859  	Elf64_Xword	addralign;	/* Alignment in bytes. */
   860  	Elf64_Xword	entsize;	/* Size of each entry in section. */
   861  	
   862  	int	shnum;  /* section number, not stored on disk */
   863  	LSym*	secsym; /* section symbol, if needed; not on disk */
   864  };
   865  
   866  /*
   867   * Program header.
   868   */
   869  
   870  typedef struct {
   871  	Elf64_Word	type;		/* Entry type. */
   872  	Elf64_Word	flags;	/* Access permission flags. */
   873  	Elf64_Off	off;	/* File offset of contents. */
   874  	Elf64_Addr	vaddr;	/* Virtual address in memory image. */
   875  	Elf64_Addr	paddr;	/* Physical address (not used). */
   876  	Elf64_Xword	filesz;	/* Size of contents in file. */
   877  	Elf64_Xword	memsz;	/* Size of contents in memory. */
   878  	Elf64_Xword	align;	/* Alignment in memory and file. */
   879  } Elf64_Phdr;
   880  
   881  /*
   882   * Dynamic structure.  The ".dynamic" section contains an array of them.
   883   */
   884  
   885  typedef struct {
   886  	Elf64_Sxword	d_tag;		/* Entry type. */
   887  	union {
   888  		Elf64_Xword	d_val;	/* Integer value. */
   889  		Elf64_Addr	d_ptr;	/* Address value. */
   890  	} d_un;
   891  } Elf64_Dyn;
   892  
   893  /*
   894   * Relocation entries.
   895   */
   896  
   897  /* Relocations that don't need an addend field. */
   898  typedef struct {
   899  	Elf64_Addr	off;	/* Location to be relocated. */
   900  	Elf64_Xword	info;		/* Relocation type and symbol index. */
   901  } Elf64_Rel;
   902  
   903  /* Relocations that need an addend field. */
   904  typedef struct {
   905  	Elf64_Addr	off;	/* Location to be relocated. */
   906  	Elf64_Xword	info;		/* Relocation type and symbol index. */
   907  	Elf64_Sxword	addend;	/* Addend. */
   908  } Elf64_Rela;
   909  
   910  /* Macros for accessing the fields of r_info. */
   911  #define ELF64_R_SYM(info)	((info) >> 32)
   912  #define ELF64_R_TYPE(info)	((info) & 0xffffffffL)
   913  
   914  /* Macro for constructing r_info from field values. */
   915  #define ELF64_R_INFO(sym, type)	((((uint64)(sym)) << 32) + (((uint64)(type)) & 0xffffffffULL))
   916  
   917  /*
   918   * Symbol table entries.
   919   */
   920  
   921  typedef struct {
   922  	Elf64_Word	name;	/* String table index of name. */
   923  	unsigned char	info;	/* Type and binding information. */
   924  	unsigned char	other;	/* Reserved (not used). */
   925  	Elf64_Half	shndx;	/* Section index of symbol. */
   926  	Elf64_Addr	value;	/* Symbol value. */
   927  	Elf64_Xword	size;	/* Size of associated object. */
   928  } Elf64_Sym;
   929  
   930  /* Macros for accessing the fields of st_info. */
   931  #define ELF64_ST_BIND(info)		((info) >> 4)
   932  #define ELF64_ST_TYPE(info)		((info) & 0xf)
   933  
   934  /* Macro for constructing st_info from field values. */
   935  #define ELF64_ST_INFO(bind, type)	(((bind) << 4) + ((type) & 0xf))
   936  
   937  /* Macro for accessing the fields of st_other. */
   938  #define ELF64_ST_VISIBILITY(oth)	((oth) & 0x3)
   939  
   940  /*
   941   * Go linker interface
   942   */
   943  
   944  #define	ELF64HDRSIZE	64
   945  #define	ELF64PHDRSIZE	56
   946  #define	ELF64SHDRSIZE	64
   947  #define	ELF64RELSIZE	16
   948  #define	ELF64RELASIZE	24
   949  #define	ELF64SYMSIZE	sizeof(Elf64_Sym)
   950  
   951  #define	ELF32HDRSIZE	sizeof(Elf32_Ehdr)
   952  #define	ELF32PHDRSIZE	sizeof(Elf32_Phdr)
   953  #define	ELF32SHDRSIZE	sizeof(Elf32_Shdr)
   954  #define	ELF32SYMSIZE	sizeof(Elf32_Sym)
   955  #define	ELF32RELSIZE	8
   956  
   957  /*
   958   * The interface uses the 64-bit structures always,
   959   * to avoid code duplication.  The writers know how to
   960   * marshal a 32-bit representation from the 64-bit structure.
   961   */
   962  typedef Elf64_Ehdr ElfEhdr;
   963  typedef Elf64_Shdr ElfShdr;
   964  typedef Elf64_Phdr ElfPhdr;
   965  
   966  void	elfinit(void);
   967  ElfEhdr	*getElfEhdr(void);
   968  ElfShdr	*newElfShdr(vlong);
   969  ElfPhdr	*newElfPhdr(void);
   970  uint32	elfwritehdr(void);
   971  uint32	elfwritephdrs(void);
   972  uint32	elfwriteshdrs(void);
   973  void	elfwritedynent(LSym*, int, uint64);
   974  void	elfwritedynentsym(LSym*, int, LSym*);
   975  void	elfwritedynentsymsize(LSym*, int, LSym*);
   976  uint32	elfhash(uchar*);
   977  uint64	startelf(void);
   978  uint64	endelf(void);
   979  extern	int	numelfphdr;
   980  extern	int	numelfshdr;
   981  extern	int	iself;
   982  extern	int	elfverneed;
   983  int	elfinterp(ElfShdr*, uint64, uint64, char*);
   984  int	elfwriteinterp(void);
   985  int	elfnetbsdsig(ElfShdr*, uint64, uint64);
   986  int	elfwritenetbsdsig(void);
   987  int	elfopenbsdsig(ElfShdr*, uint64, uint64);
   988  int	elfwriteopenbsdsig(void);
   989  void	addbuildinfo(char*);
   990  int	elfbuildinfo(ElfShdr*, uint64, uint64);
   991  int	elfwritebuildinfo(void);
   992  void	elfdynhash(void);
   993  ElfPhdr* elfphload(Segment*);
   994  ElfShdr* elfshbits(Section*);
   995  ElfShdr* elfshalloc(Section*);
   996  ElfShdr* elfshname(char*);
   997  ElfShdr* elfshreloc(Section*);
   998  void	elfsetstring(char*, int);
   999  void	elfaddverneed(LSym*);
  1000  void	elfemitreloc(void);
  1001  void	shsym(ElfShdr*, LSym*);
  1002  void	phsh(ElfPhdr*, ElfShdr*);
  1003  void	doelf(void);
  1004  void	elfsetupplt(void);
  1005  void	dwarfaddshstrings(LSym*);
  1006  void	dwarfaddelfsectionsyms(void);
  1007  void	dwarfaddelfheaders(void);
  1008  void	asmbelf(vlong symo);
  1009  void	asmbelfsetup(void);
  1010  extern char linuxdynld[];
  1011  extern char freebsddynld[];
  1012  extern char netbsddynld[];
  1013  extern char openbsddynld[];
  1014  extern char dragonflydynld[];
  1015  extern char solarisdynld[];
  1016  int	elfreloc1(Reloc*, vlong sectoff);
  1017  void	putelfsectionsyms(void);
  1018  
  1019  EXTERN	int	elfstrsize;
  1020  EXTERN	char*	elfstrdat;
  1021  EXTERN	int	buildinfolen;
  1022  
  1023  /*
  1024   * Total amount of space to reserve at the start of the file
  1025   * for Header, PHeaders, SHeaders, and interp.
  1026   * May waste some.
  1027   * On FreeBSD, cannot be larger than a page.
  1028   */
  1029  #define	ELFRESERVE	3072