Back to index

glibc  2.9
elf.h
Go to the documentation of this file.
00001 /* This file defines standard ELF types, structures, and macros.
00002    Copyright (C) 1995-2003,2004,2005,2006,2007,2008
00003        Free Software Foundation, Inc.
00004    This file is part of the GNU C Library.
00005 
00006    The GNU C Library is free software; you can redistribute it and/or
00007    modify it under the terms of the GNU Lesser General Public
00008    License as published by the Free Software Foundation; either
00009    version 2.1 of the License, or (at your option) any later version.
00010 
00011    The GNU C Library is distributed in the hope that it will be useful,
00012    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014    Lesser General Public License for more details.
00015 
00016    You should have received a copy of the GNU Lesser General Public
00017    License along with the GNU C Library; if not, write to the Free
00018    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
00019    02111-1307 USA.  */
00020 
00021 #ifndef _ELF_H
00022 #define       _ELF_H 1
00023 
00024 #include <features.h>
00025 
00026 __BEGIN_DECLS
00027 
00028 /* Standard ELF types.  */
00029 
00030 #include <stdint.h>
00031 
00032 /* Type for a 16-bit quantity.  */
00033 typedef uint16_t Elf32_Half;
00034 typedef uint16_t Elf64_Half;
00035 
00036 /* Types for signed and unsigned 32-bit quantities.  */
00037 typedef uint32_t Elf32_Word;
00038 typedef       int32_t  Elf32_Sword;
00039 typedef uint32_t Elf64_Word;
00040 typedef       int32_t  Elf64_Sword;
00041 
00042 /* Types for signed and unsigned 64-bit quantities.  */
00043 typedef uint64_t Elf32_Xword;
00044 typedef       int64_t  Elf32_Sxword;
00045 typedef uint64_t Elf64_Xword;
00046 typedef       int64_t  Elf64_Sxword;
00047 
00048 /* Type of addresses.  */
00049 typedef uint32_t Elf32_Addr;
00050 typedef uint64_t Elf64_Addr;
00051 
00052 /* Type of file offsets.  */
00053 typedef uint32_t Elf32_Off;
00054 typedef uint64_t Elf64_Off;
00055 
00056 /* Type for section indices, which are 16-bit quantities.  */
00057 typedef uint16_t Elf32_Section;
00058 typedef uint16_t Elf64_Section;
00059 
00060 /* Type for version symbol information.  */
00061 typedef Elf32_Half Elf32_Versym;
00062 typedef Elf64_Half Elf64_Versym;
00063 
00064 
00065 /* The ELF file header.  This appears at the start of every ELF file.  */
00066 
00067 #define EI_NIDENT (16)
00068 
00069 typedef struct
00070 {
00071   unsigned char      e_ident[EI_NIDENT];  /* Magic number and other info */
00072   Elf32_Half  e_type;                     /* Object file type */
00073   Elf32_Half  e_machine;           /* Architecture */
00074   Elf32_Word  e_version;           /* Object file version */
00075   Elf32_Addr  e_entry;             /* Entry point virtual address */
00076   Elf32_Off   e_phoff;             /* Program header table file offset */
00077   Elf32_Off   e_shoff;             /* Section header table file offset */
00078   Elf32_Word  e_flags;             /* Processor-specific flags */
00079   Elf32_Half  e_ehsize;            /* ELF header size in bytes */
00080   Elf32_Half  e_phentsize;         /* Program header table entry size */
00081   Elf32_Half  e_phnum;             /* Program header table entry count */
00082   Elf32_Half  e_shentsize;         /* Section header table entry size */
00083   Elf32_Half  e_shnum;             /* Section header table entry count */
00084   Elf32_Half  e_shstrndx;          /* Section header string table index */
00085 } Elf32_Ehdr;
00086 
00087 typedef struct
00088 {
00089   unsigned char      e_ident[EI_NIDENT];  /* Magic number and other info */
00090   Elf64_Half  e_type;                     /* Object file type */
00091   Elf64_Half  e_machine;           /* Architecture */
00092   Elf64_Word  e_version;           /* Object file version */
00093   Elf64_Addr  e_entry;             /* Entry point virtual address */
00094   Elf64_Off   e_phoff;             /* Program header table file offset */
00095   Elf64_Off   e_shoff;             /* Section header table file offset */
00096   Elf64_Word  e_flags;             /* Processor-specific flags */
00097   Elf64_Half  e_ehsize;            /* ELF header size in bytes */
00098   Elf64_Half  e_phentsize;         /* Program header table entry size */
00099   Elf64_Half  e_phnum;             /* Program header table entry count */
00100   Elf64_Half  e_shentsize;         /* Section header table entry size */
00101   Elf64_Half  e_shnum;             /* Section header table entry count */
00102   Elf64_Half  e_shstrndx;          /* Section header string table index */
00103 } Elf64_Ehdr;
00104 
00105 /* Fields in the e_ident array.  The EI_* macros are indices into the
00106    array.  The macros under each EI_* macro are the values the byte
00107    may have.  */
00108 
00109 #define EI_MAG0             0             /* File identification byte 0 index */
00110 #define ELFMAG0             0x7f          /* Magic number byte 0 */
00111 
00112 #define EI_MAG1             1             /* File identification byte 1 index */
00113 #define ELFMAG1             'E'           /* Magic number byte 1 */
00114 
00115 #define EI_MAG2             2             /* File identification byte 2 index */
00116 #define ELFMAG2             'L'           /* Magic number byte 2 */
00117 
00118 #define EI_MAG3             3             /* File identification byte 3 index */
00119 #define ELFMAG3             'F'           /* Magic number byte 3 */
00120 
00121 /* Conglomeration of the identification bytes, for easy testing as a word.  */
00122 #define       ELFMAG        "\177ELF"
00123 #define       SELFMAG              4
00124 
00125 #define EI_CLASS     4             /* File class byte index */
00126 #define ELFCLASSNONE 0             /* Invalid class */
00127 #define ELFCLASS32   1             /* 32-bit objects */
00128 #define ELFCLASS64   2             /* 64-bit objects */
00129 #define ELFCLASSNUM  3
00130 
00131 #define EI_DATA             5             /* Data encoding byte index */
00132 #define ELFDATANONE  0             /* Invalid data encoding */
00133 #define ELFDATA2LSB  1             /* 2's complement, little endian */
00134 #define ELFDATA2MSB  2             /* 2's complement, big endian */
00135 #define ELFDATANUM   3
00136 
00137 #define EI_VERSION   6             /* File version byte index */
00138                                    /* Value must be EV_CURRENT */
00139 
00140 #define EI_OSABI     7             /* OS ABI identification */
00141 #define ELFOSABI_NONE              0      /* UNIX System V ABI */
00142 #define ELFOSABI_SYSV              0      /* Alias.  */
00143 #define ELFOSABI_HPUX              1      /* HP-UX */
00144 #define ELFOSABI_NETBSD            2      /* NetBSD.  */
00145 #define ELFOSABI_LINUX             3      /* Linux.  */
00146 #define ELFOSABI_SOLARIS    6      /* Sun Solaris.  */
00147 #define ELFOSABI_AIX        7      /* IBM AIX.  */
00148 #define ELFOSABI_IRIX              8      /* SGI Irix.  */
00149 #define ELFOSABI_FREEBSD    9      /* FreeBSD.  */
00150 #define ELFOSABI_TRU64             10     /* Compaq TRU64 UNIX.  */
00151 #define ELFOSABI_MODESTO    11     /* Novell Modesto.  */
00152 #define ELFOSABI_OPENBSD    12     /* OpenBSD.  */
00153 #define ELFOSABI_ARM        97     /* ARM */
00154 #define ELFOSABI_STANDALONE 255    /* Standalone (embedded) application */
00155 
00156 #define EI_ABIVERSION       8             /* ABI version */
00157 
00158 #define EI_PAD              9             /* Byte index of padding bytes */
00159 
00160 /* Legal values for e_type (object file type).  */
00161 
00162 #define ET_NONE             0             /* No file type */
00163 #define ET_REL              1             /* Relocatable file */
00164 #define ET_EXEC             2             /* Executable file */
00165 #define ET_DYN              3             /* Shared object file */
00166 #define ET_CORE             4             /* Core file */
00167 #define       ET_NUM        5             /* Number of defined types */
00168 #define ET_LOOS             0xfe00        /* OS-specific range start */
00169 #define ET_HIOS             0xfeff        /* OS-specific range end */
00170 #define ET_LOPROC    0xff00        /* Processor-specific range start */
00171 #define ET_HIPROC    0xffff        /* Processor-specific range end */
00172 
00173 /* Legal values for e_machine (architecture).  */
00174 
00175 #define EM_NONE              0            /* No machine */
00176 #define EM_M32               1            /* AT&T WE 32100 */
00177 #define EM_SPARC      2            /* SUN SPARC */
00178 #define EM_386               3            /* Intel 80386 */
00179 #define EM_68K               4            /* Motorola m68k family */
00180 #define EM_88K               5            /* Motorola m88k family */
00181 #define EM_860               7            /* Intel 80860 */
00182 #define EM_MIPS              8            /* MIPS R3000 big-endian */
00183 #define EM_S370              9            /* IBM System/370 */
00184 #define EM_MIPS_RS3_LE      10            /* MIPS R3000 little-endian */
00185 
00186 #define EM_PARISC    15            /* HPPA */
00187 #define EM_VPP500    17            /* Fujitsu VPP500 */
00188 #define EM_SPARC32PLUS      18            /* Sun's "v8plus" */
00189 #define EM_960              19            /* Intel 80960 */
00190 #define EM_PPC              20            /* PowerPC */
00191 #define EM_PPC64     21            /* PowerPC 64-bit */
00192 #define EM_S390             22            /* IBM S390 */
00193 
00194 #define EM_V800             36            /* NEC V800 series */
00195 #define EM_FR20             37            /* Fujitsu FR20 */
00196 #define EM_RH32             38            /* TRW RH-32 */
00197 #define EM_RCE              39            /* Motorola RCE */
00198 #define EM_ARM              40            /* ARM */
00199 #define EM_FAKE_ALPHA       41            /* Digital Alpha */
00200 #define EM_SH        42            /* Hitachi SH */
00201 #define EM_SPARCV9   43            /* SPARC v9 64-bit */
00202 #define EM_TRICORE   44            /* Siemens Tricore */
00203 #define EM_ARC              45            /* Argonaut RISC Core */
00204 #define EM_H8_300    46            /* Hitachi H8/300 */
00205 #define EM_H8_300H   47            /* Hitachi H8/300H */
00206 #define EM_H8S              48            /* Hitachi H8S */
00207 #define EM_H8_500    49            /* Hitachi H8/500 */
00208 #define EM_IA_64     50            /* Intel Merced */
00209 #define EM_MIPS_X    51            /* Stanford MIPS-X */
00210 #define EM_COLDFIRE  52            /* Motorola Coldfire */
00211 #define EM_68HC12    53            /* Motorola M68HC12 */
00212 #define EM_MMA              54            /* Fujitsu MMA Multimedia Accelerator*/
00213 #define EM_PCP              55            /* Siemens PCP */
00214 #define EM_NCPU             56            /* Sony nCPU embeeded RISC */
00215 #define EM_NDR1             57            /* Denso NDR1 microprocessor */
00216 #define EM_STARCORE  58            /* Motorola Start*Core processor */
00217 #define EM_ME16             59            /* Toyota ME16 processor */
00218 #define EM_ST100     60            /* STMicroelectronic ST100 processor */
00219 #define EM_TINYJ     61            /* Advanced Logic Corp. Tinyj emb.fam*/
00220 #define EM_X86_64    62            /* AMD x86-64 architecture */
00221 #define EM_PDSP             63            /* Sony DSP Processor */
00222 
00223 #define EM_FX66             66            /* Siemens FX66 microcontroller */
00224 #define EM_ST9PLUS   67            /* STMicroelectronics ST9+ 8/16 mc */
00225 #define EM_ST7              68            /* STmicroelectronics ST7 8 bit mc */
00226 #define EM_68HC16    69            /* Motorola MC68HC16 microcontroller */
00227 #define EM_68HC11    70            /* Motorola MC68HC11 microcontroller */
00228 #define EM_68HC08    71            /* Motorola MC68HC08 microcontroller */
00229 #define EM_68HC05    72            /* Motorola MC68HC05 microcontroller */
00230 #define EM_SVX              73            /* Silicon Graphics SVx */
00231 #define EM_ST19             74            /* STMicroelectronics ST19 8 bit mc */
00232 #define EM_VAX              75            /* Digital VAX */
00233 #define EM_CRIS             76            /* Axis Communications 32-bit embedded processor */
00234 #define EM_JAVELIN   77            /* Infineon Technologies 32-bit embedded processor */
00235 #define EM_FIREPATH  78            /* Element 14 64-bit DSP Processor */
00236 #define EM_ZSP              79            /* LSI Logic 16-bit DSP Processor */
00237 #define EM_MMIX             80            /* Donald Knuth's educational 64-bit processor */
00238 #define EM_HUANY     81            /* Harvard University machine-independent object files */
00239 #define EM_PRISM     82            /* SiTera Prism */
00240 #define EM_AVR              83            /* Atmel AVR 8-bit microcontroller */
00241 #define EM_FR30             84            /* Fujitsu FR30 */
00242 #define EM_D10V             85            /* Mitsubishi D10V */
00243 #define EM_D30V             86            /* Mitsubishi D30V */
00244 #define EM_V850             87            /* NEC v850 */
00245 #define EM_M32R             88            /* Mitsubishi M32R */
00246 #define EM_MN10300   89            /* Matsushita MN10300 */
00247 #define EM_MN10200   90            /* Matsushita MN10200 */
00248 #define EM_PJ        91            /* picoJava */
00249 #define EM_OPENRISC  92            /* OpenRISC 32-bit embedded processor */
00250 #define EM_ARC_A5    93            /* ARC Cores Tangent-A5 */
00251 #define EM_XTENSA    94            /* Tensilica Xtensa Architecture */
00252 #define EM_NUM              95
00253 
00254 /* If it is necessary to assign new unofficial EM_* values, please
00255    pick large random numbers (0x8523, 0xa7f2, etc.) to minimize the
00256    chances of collision with official or non-GNU unofficial values.  */
00257 
00258 #define EM_ALPHA     0x9026
00259 
00260 /* Legal values for e_version (version).  */
00261 
00262 #define EV_NONE             0             /* Invalid ELF version */
00263 #define EV_CURRENT   1             /* Current version */
00264 #define EV_NUM              2
00265 
00266 /* Section header.  */
00267 
00268 typedef struct
00269 {
00270   Elf32_Word  sh_name;             /* Section name (string tbl index) */
00271   Elf32_Word  sh_type;             /* Section type */
00272   Elf32_Word  sh_flags;            /* Section flags */
00273   Elf32_Addr  sh_addr;             /* Section virtual addr at execution */
00274   Elf32_Off   sh_offset;           /* Section file offset */
00275   Elf32_Word  sh_size;             /* Section size in bytes */
00276   Elf32_Word  sh_link;             /* Link to another section */
00277   Elf32_Word  sh_info;             /* Additional section information */
00278   Elf32_Word  sh_addralign;        /* Section alignment */
00279   Elf32_Word  sh_entsize;          /* Entry size if section holds table */
00280 } Elf32_Shdr;
00281 
00282 typedef struct
00283 {
00284   Elf64_Word  sh_name;             /* Section name (string tbl index) */
00285   Elf64_Word  sh_type;             /* Section type */
00286   Elf64_Xword sh_flags;            /* Section flags */
00287   Elf64_Addr  sh_addr;             /* Section virtual addr at execution */
00288   Elf64_Off   sh_offset;           /* Section file offset */
00289   Elf64_Xword sh_size;             /* Section size in bytes */
00290   Elf64_Word  sh_link;             /* Link to another section */
00291   Elf64_Word  sh_info;             /* Additional section information */
00292   Elf64_Xword sh_addralign;        /* Section alignment */
00293   Elf64_Xword sh_entsize;          /* Entry size if section holds table */
00294 } Elf64_Shdr;
00295 
00296 /* Special section indices.  */
00297 
00298 #define SHN_UNDEF    0             /* Undefined section */
00299 #define SHN_LORESERVE       0xff00        /* Start of reserved indices */
00300 #define SHN_LOPROC   0xff00        /* Start of processor-specific */
00301 #define SHN_BEFORE   0xff00        /* Order section before all others
00302                                       (Solaris).  */
00303 #define SHN_AFTER    0xff01        /* Order section after all others
00304                                       (Solaris).  */
00305 #define SHN_HIPROC   0xff1f        /* End of processor-specific */
00306 #define SHN_LOOS     0xff20        /* Start of OS-specific */
00307 #define SHN_HIOS     0xff3f        /* End of OS-specific */
00308 #define SHN_ABS             0xfff1        /* Associated symbol is absolute */
00309 #define SHN_COMMON   0xfff2        /* Associated symbol is common */
00310 #define SHN_XINDEX   0xffff        /* Index is in extra table.  */
00311 #define SHN_HIRESERVE       0xffff        /* End of reserved indices */
00312 
00313 /* Legal values for sh_type (section type).  */
00314 
00315 #define SHT_NULL       0           /* Section header table entry unused */
00316 #define SHT_PROGBITS   1           /* Program data */
00317 #define SHT_SYMTAB     2           /* Symbol table */
00318 #define SHT_STRTAB     3           /* String table */
00319 #define SHT_RELA       4           /* Relocation entries with addends */
00320 #define SHT_HASH       5           /* Symbol hash table */
00321 #define SHT_DYNAMIC    6           /* Dynamic linking information */
00322 #define SHT_NOTE       7           /* Notes */
00323 #define SHT_NOBITS     8           /* Program space with no data (bss) */
00324 #define SHT_REL               9           /* Relocation entries, no addends */
00325 #define SHT_SHLIB      10          /* Reserved */
00326 #define SHT_DYNSYM     11          /* Dynamic linker symbol table */
00327 #define SHT_INIT_ARRAY        14          /* Array of constructors */
00328 #define SHT_FINI_ARRAY        15          /* Array of destructors */
00329 #define SHT_PREINIT_ARRAY 16              /* Array of pre-constructors */
00330 #define SHT_GROUP      17          /* Section group */
00331 #define SHT_SYMTAB_SHNDX  18              /* Extended section indeces */
00332 #define       SHT_NUM                19          /* Number of defined types.  */
00333 #define SHT_LOOS       0x60000000  /* Start OS-specific.  */
00334 #define SHT_GNU_ATTRIBUTES 0x6ffffff5     /* Object attributes.  */
00335 #define SHT_GNU_HASH   0x6ffffff6  /* GNU-style hash table.  */
00336 #define SHT_GNU_LIBLIST       0x6ffffff7  /* Prelink library list */
00337 #define SHT_CHECKSUM   0x6ffffff8  /* Checksum for DSO content.  */
00338 #define SHT_LOSUNW     0x6ffffffa  /* Sun-specific low bound.  */
00339 #define SHT_SUNW_move         0x6ffffffa
00340 #define SHT_SUNW_COMDAT   0x6ffffffb
00341 #define SHT_SUNW_syminfo  0x6ffffffc
00342 #define SHT_GNU_verdef        0x6ffffffd  /* Version definition section.  */
00343 #define SHT_GNU_verneed       0x6ffffffe  /* Version needs section.  */
00344 #define SHT_GNU_versym        0x6fffffff  /* Version symbol table.  */
00345 #define SHT_HISUNW     0x6fffffff  /* Sun-specific high bound.  */
00346 #define SHT_HIOS       0x6fffffff  /* End OS-specific type */
00347 #define SHT_LOPROC     0x70000000  /* Start of processor-specific */
00348 #define SHT_HIPROC     0x7fffffff  /* End of processor-specific */
00349 #define SHT_LOUSER     0x80000000  /* Start of application-specific */
00350 #define SHT_HIUSER     0x8fffffff  /* End of application-specific */
00351 
00352 /* Legal values for sh_flags (section flags).  */
00353 
00354 #define SHF_WRITE         (1 << 0) /* Writable */
00355 #define SHF_ALLOC         (1 << 1) /* Occupies memory during execution */
00356 #define SHF_EXECINSTR            (1 << 2) /* Executable */
00357 #define SHF_MERGE         (1 << 4) /* Might be merged */
00358 #define SHF_STRINGS       (1 << 5) /* Contains nul-terminated strings */
00359 #define SHF_INFO_LINK            (1 << 6) /* `sh_info' contains SHT index */
00360 #define SHF_LINK_ORDER           (1 << 7) /* Preserve order after combining */
00361 #define SHF_OS_NONCONFORMING (1 << 8)     /* Non-standard OS specific handling
00362                                       required */
00363 #define SHF_GROUP         (1 << 9) /* Section is member of a group.  */
00364 #define SHF_TLS                  (1 << 10)       /* Section hold thread-local data.  */
00365 #define SHF_MASKOS        0x0ff00000      /* OS-specific.  */
00366 #define SHF_MASKPROC      0xf0000000      /* Processor-specific */
00367 #define SHF_ORDERED       (1 << 30)       /* Special ordering requirement
00368                                       (Solaris).  */
00369 #define SHF_EXCLUDE       (1 << 31)       /* Section is excluded unless
00370                                       referenced or allocated (Solaris).*/
00371 
00372 /* Section group handling.  */
00373 #define GRP_COMDAT   0x1           /* Mark group as COMDAT.  */
00374 
00375 /* Symbol table entry.  */
00376 
00377 typedef struct
00378 {
00379   Elf32_Word  st_name;             /* Symbol name (string tbl index) */
00380   Elf32_Addr  st_value;            /* Symbol value */
00381   Elf32_Word  st_size;             /* Symbol size */
00382   unsigned char      st_info;             /* Symbol type and binding */
00383   unsigned char      st_other;            /* Symbol visibility */
00384   Elf32_Section      st_shndx;            /* Section index */
00385 } Elf32_Sym;
00386 
00387 typedef struct
00388 {
00389   Elf64_Word  st_name;             /* Symbol name (string tbl index) */
00390   unsigned char      st_info;             /* Symbol type and binding */
00391   unsigned char st_other;          /* Symbol visibility */
00392   Elf64_Section      st_shndx;            /* Section index */
00393   Elf64_Addr  st_value;            /* Symbol value */
00394   Elf64_Xword st_size;             /* Symbol size */
00395 } Elf64_Sym;
00396 
00397 /* The syminfo section if available contains additional information about
00398    every dynamic symbol.  */
00399 
00400 typedef struct
00401 {
00402   Elf32_Half si_boundto;           /* Direct bindings, symbol bound to */
00403   Elf32_Half si_flags;                    /* Per symbol flags */
00404 } Elf32_Syminfo;
00405 
00406 typedef struct
00407 {
00408   Elf64_Half si_boundto;           /* Direct bindings, symbol bound to */
00409   Elf64_Half si_flags;                    /* Per symbol flags */
00410 } Elf64_Syminfo;
00411 
00412 /* Possible values for si_boundto.  */
00413 #define SYMINFO_BT_SELF            0xffff /* Symbol bound to self */
00414 #define SYMINFO_BT_PARENT   0xfffe /* Symbol bound to parent */
00415 #define SYMINFO_BT_LOWRESERVE      0xff00 /* Beginning of reserved entries */
00416 
00417 /* Possible bitmasks for si_flags.  */
00418 #define SYMINFO_FLG_DIRECT  0x0001 /* Direct bound symbol */
00419 #define SYMINFO_FLG_PASSTHRU       0x0002 /* Pass-thru symbol for translator */
00420 #define SYMINFO_FLG_COPY    0x0004 /* Symbol is a copy-reloc */
00421 #define SYMINFO_FLG_LAZYLOAD       0x0008 /* Symbol bound to object to be lazy
00422                                       loaded */
00423 /* Syminfo version values.  */
00424 #define SYMINFO_NONE        0
00425 #define SYMINFO_CURRENT            1
00426 #define SYMINFO_NUM         2
00427 
00428 
00429 /* How to extract and insert information held in the st_info field.  */
00430 
00431 #define ELF32_ST_BIND(val)         (((unsigned char) (val)) >> 4)
00432 #define ELF32_ST_TYPE(val)         ((val) & 0xf)
00433 #define ELF32_ST_INFO(bind, type)  (((bind) << 4) + ((type) & 0xf))
00434 
00435 /* Both Elf32_Sym and Elf64_Sym use the same one-byte st_info field.  */
00436 #define ELF64_ST_BIND(val)         ELF32_ST_BIND (val)
00437 #define ELF64_ST_TYPE(val)         ELF32_ST_TYPE (val)
00438 #define ELF64_ST_INFO(bind, type)  ELF32_ST_INFO ((bind), (type))
00439 
00440 /* Legal values for ST_BIND subfield of st_info (symbol binding).  */
00441 
00442 #define STB_LOCAL    0             /* Local symbol */
00443 #define STB_GLOBAL   1             /* Global symbol */
00444 #define STB_WEAK     2             /* Weak symbol */
00445 #define       STB_NUM              3             /* Number of defined types.  */
00446 #define STB_LOOS     10            /* Start of OS-specific */
00447 #define STB_HIOS     12            /* End of OS-specific */
00448 #define STB_LOPROC   13            /* Start of processor-specific */
00449 #define STB_HIPROC   15            /* End of processor-specific */
00450 
00451 /* Legal values for ST_TYPE subfield of st_info (symbol type).  */
00452 
00453 #define STT_NOTYPE   0             /* Symbol type is unspecified */
00454 #define STT_OBJECT   1             /* Symbol is a data object */
00455 #define STT_FUNC     2             /* Symbol is a code object */
00456 #define STT_SECTION  3             /* Symbol associated with a section */
00457 #define STT_FILE     4             /* Symbol's name is file name */
00458 #define STT_COMMON   5             /* Symbol is a common data object */
00459 #define STT_TLS             6             /* Symbol is thread-local data object*/
00460 #define       STT_NUM              7             /* Number of defined types.  */
00461 #define STT_LOOS     10            /* Start of OS-specific */
00462 #define STT_HIOS     12            /* End of OS-specific */
00463 #define STT_LOPROC   13            /* Start of processor-specific */
00464 #define STT_HIPROC   15            /* End of processor-specific */
00465 
00466 
00467 /* Symbol table indices are found in the hash buckets and chain table
00468    of a symbol hash table section.  This special index value indicates
00469    the end of a chain, meaning no further symbols are found in that bucket.  */
00470 
00471 #define STN_UNDEF    0             /* End of a chain.  */
00472 
00473 
00474 /* How to extract and insert information held in the st_other field.  */
00475 
00476 #define ELF32_ST_VISIBILITY(o)     ((o) & 0x03)
00477 
00478 /* For ELF64 the definitions are the same.  */
00479 #define ELF64_ST_VISIBILITY(o)     ELF32_ST_VISIBILITY (o)
00480 
00481 /* Symbol visibility specification encoded in the st_other field.  */
00482 #define STV_DEFAULT  0             /* Default symbol visibility rules */
00483 #define STV_INTERNAL 1             /* Processor specific hidden class */
00484 #define STV_HIDDEN   2             /* Sym unavailable in other modules */
00485 #define STV_PROTECTED       3             /* Not preemptible, not exported */
00486 
00487 
00488 /* Relocation table entry without addend (in section of type SHT_REL).  */
00489 
00490 typedef struct
00491 {
00492   Elf32_Addr  r_offset;            /* Address */
00493   Elf32_Word  r_info;                     /* Relocation type and symbol index */
00494 } Elf32_Rel;
00495 
00496 /* I have seen two different definitions of the Elf64_Rel and
00497    Elf64_Rela structures, so we'll leave them out until Novell (or
00498    whoever) gets their act together.  */
00499 /* The following, at least, is used on Sparc v9, MIPS, and Alpha.  */
00500 
00501 typedef struct
00502 {
00503   Elf64_Addr  r_offset;            /* Address */
00504   Elf64_Xword r_info;                     /* Relocation type and symbol index */
00505 } Elf64_Rel;
00506 
00507 /* Relocation table entry with addend (in section of type SHT_RELA).  */
00508 
00509 typedef struct
00510 {
00511   Elf32_Addr  r_offset;            /* Address */
00512   Elf32_Word  r_info;                     /* Relocation type and symbol index */
00513   Elf32_Sword r_addend;            /* Addend */
00514 } Elf32_Rela;
00515 
00516 typedef struct
00517 {
00518   Elf64_Addr  r_offset;            /* Address */
00519   Elf64_Xword r_info;                     /* Relocation type and symbol index */
00520   Elf64_Sxword       r_addend;            /* Addend */
00521 } Elf64_Rela;
00522 
00523 /* How to extract and insert information held in the r_info field.  */
00524 
00525 #define ELF32_R_SYM(val)           ((val) >> 8)
00526 #define ELF32_R_TYPE(val)          ((val) & 0xff)
00527 #define ELF32_R_INFO(sym, type)           (((sym) << 8) + ((type) & 0xff))
00528 
00529 #define ELF64_R_SYM(i)                    ((i) >> 32)
00530 #define ELF64_R_TYPE(i)                   ((i) & 0xffffffff)
00531 #define ELF64_R_INFO(sym,type)            ((((Elf64_Xword) (sym)) << 32) + (type))
00532 
00533 /* Program segment header.  */
00534 
00535 typedef struct
00536 {
00537   Elf32_Word  p_type;                     /* Segment type */
00538   Elf32_Off   p_offset;            /* Segment file offset */
00539   Elf32_Addr  p_vaddr;             /* Segment virtual address */
00540   Elf32_Addr  p_paddr;             /* Segment physical address */
00541   Elf32_Word  p_filesz;            /* Segment size in file */
00542   Elf32_Word  p_memsz;             /* Segment size in memory */
00543   Elf32_Word  p_flags;             /* Segment flags */
00544   Elf32_Word  p_align;             /* Segment alignment */
00545 } Elf32_Phdr;
00546 
00547 typedef struct
00548 {
00549   Elf64_Word  p_type;                     /* Segment type */
00550   Elf64_Word  p_flags;             /* Segment flags */
00551   Elf64_Off   p_offset;            /* Segment file offset */
00552   Elf64_Addr  p_vaddr;             /* Segment virtual address */
00553   Elf64_Addr  p_paddr;             /* Segment physical address */
00554   Elf64_Xword p_filesz;            /* Segment size in file */
00555   Elf64_Xword p_memsz;             /* Segment size in memory */
00556   Elf64_Xword p_align;             /* Segment alignment */
00557 } Elf64_Phdr;
00558 
00559 /* Legal values for p_type (segment type).  */
00560 
00561 #define       PT_NULL              0             /* Program header table entry unused */
00562 #define PT_LOAD             1             /* Loadable program segment */
00563 #define PT_DYNAMIC   2             /* Dynamic linking information */
00564 #define PT_INTERP    3             /* Program interpreter */
00565 #define PT_NOTE             4             /* Auxiliary information */
00566 #define PT_SHLIB     5             /* Reserved */
00567 #define PT_PHDR             6             /* Entry for header table itself */
00568 #define PT_TLS              7             /* Thread-local storage segment */
00569 #define       PT_NUM        8             /* Number of defined types */
00570 #define PT_LOOS             0x60000000    /* Start of OS-specific */
00571 #define PT_GNU_EH_FRAME     0x6474e550    /* GCC .eh_frame_hdr segment */
00572 #define PT_GNU_STACK 0x6474e551    /* Indicates stack executability */
00573 #define PT_GNU_RELRO 0x6474e552    /* Read-only after relocation */
00574 #define PT_LOSUNW    0x6ffffffa
00575 #define PT_SUNWBSS   0x6ffffffa    /* Sun Specific segment */
00576 #define PT_SUNWSTACK 0x6ffffffb    /* Stack segment */
00577 #define PT_HISUNW    0x6fffffff
00578 #define PT_HIOS             0x6fffffff    /* End of OS-specific */
00579 #define PT_LOPROC    0x70000000    /* Start of processor-specific */
00580 #define PT_HIPROC    0x7fffffff    /* End of processor-specific */
00581 
00582 /* Legal values for p_flags (segment flags).  */
00583 
00584 #define PF_X         (1 << 0)      /* Segment is executable */
00585 #define PF_W         (1 << 1)      /* Segment is writable */
00586 #define PF_R         (1 << 2)      /* Segment is readable */
00587 #define PF_MASKOS    0x0ff00000    /* OS-specific */
00588 #define PF_MASKPROC  0xf0000000    /* Processor-specific */
00589 
00590 /* Legal values for note segment descriptor types for core files. */
00591 
00592 #define NT_PRSTATUS  1             /* Contains copy of prstatus struct */
00593 #define NT_FPREGSET  2             /* Contains copy of fpregset struct */
00594 #define NT_PRPSINFO  3             /* Contains copy of prpsinfo struct */
00595 #define NT_PRXREG    4             /* Contains copy of prxregset struct */
00596 #define NT_TASKSTRUCT       4             /* Contains copy of task structure */
00597 #define NT_PLATFORM  5             /* String from sysinfo(SI_PLATFORM) */
00598 #define NT_AUXV             6             /* Contains copy of auxv array */
00599 #define NT_GWINDOWS  7             /* Contains copy of gwindows struct */
00600 #define NT_ASRS             8             /* Contains copy of asrset struct */
00601 #define NT_PSTATUS   10            /* Contains copy of pstatus struct */
00602 #define NT_PSINFO    13            /* Contains copy of psinfo struct */
00603 #define NT_PRCRED    14            /* Contains copy of prcred struct */
00604 #define NT_UTSNAME   15            /* Contains copy of utsname struct */
00605 #define NT_LWPSTATUS 16            /* Contains copy of lwpstatus struct */
00606 #define NT_LWPSINFO  17            /* Contains copy of lwpinfo struct */
00607 #define NT_PRFPXREG  20            /* Contains copy of fprxregset struct */
00608 #define NT_PRXFPREG  0x46e62b7f    /* Contains copy of user_fxsr_struct */
00609 #define NT_PPC_VMX   0x100         /* PowerPC Altivec/VMX registers */
00610 #define NT_PPC_SPE   0x101         /* PowerPC SPE/EVR registers */
00611 #define NT_386_TLS   0x200         /* i386 TLS slots (struct user_desc) */
00612 
00613 /* Legal values for the note segment descriptor types for object files.  */
00614 
00615 #define NT_VERSION   1             /* Contains a version string.  */
00616 
00617 
00618 /* Dynamic section entry.  */
00619 
00620 typedef struct
00621 {
00622   Elf32_Sword d_tag;               /* Dynamic entry type */
00623   union
00624     {
00625       Elf32_Word d_val;                   /* Integer value */
00626       Elf32_Addr d_ptr;                   /* Address value */
00627     } d_un;
00628 } Elf32_Dyn;
00629 
00630 typedef struct
00631 {
00632   Elf64_Sxword       d_tag;               /* Dynamic entry type */
00633   union
00634     {
00635       Elf64_Xword d_val;           /* Integer value */
00636       Elf64_Addr d_ptr;                   /* Address value */
00637     } d_un;
00638 } Elf64_Dyn;
00639 
00640 /* Legal values for d_tag (dynamic entry type).  */
00641 
00642 #define DT_NULL             0             /* Marks end of dynamic section */
00643 #define DT_NEEDED    1             /* Name of needed library */
00644 #define DT_PLTRELSZ  2             /* Size in bytes of PLT relocs */
00645 #define DT_PLTGOT    3             /* Processor defined value */
00646 #define DT_HASH             4             /* Address of symbol hash table */
00647 #define DT_STRTAB    5             /* Address of string table */
00648 #define DT_SYMTAB    6             /* Address of symbol table */
00649 #define DT_RELA             7             /* Address of Rela relocs */
00650 #define DT_RELASZ    8             /* Total size of Rela relocs */
00651 #define DT_RELAENT   9             /* Size of one Rela reloc */
00652 #define DT_STRSZ     10            /* Size of string table */
00653 #define DT_SYMENT    11            /* Size of one symbol table entry */
00654 #define DT_INIT             12            /* Address of init function */
00655 #define DT_FINI             13            /* Address of termination function */
00656 #define DT_SONAME    14            /* Name of shared object */
00657 #define DT_RPATH     15            /* Library search path (deprecated) */
00658 #define DT_SYMBOLIC  16            /* Start symbol search here */
00659 #define DT_REL              17            /* Address of Rel relocs */
00660 #define DT_RELSZ     18            /* Total size of Rel relocs */
00661 #define DT_RELENT    19            /* Size of one Rel reloc */
00662 #define DT_PLTREL    20            /* Type of reloc in PLT */
00663 #define DT_DEBUG     21            /* For debugging; unspecified */
00664 #define DT_TEXTREL   22            /* Reloc might modify .text */
00665 #define DT_JMPREL    23            /* Address of PLT relocs */
00666 #define       DT_BIND_NOW   24            /* Process relocations of object */
00667 #define       DT_INIT_ARRAY 25            /* Array with addresses of init fct */
00668 #define       DT_FINI_ARRAY 26            /* Array with addresses of fini fct */
00669 #define       DT_INIT_ARRAYSZ      27            /* Size in bytes of DT_INIT_ARRAY */
00670 #define       DT_FINI_ARRAYSZ      28            /* Size in bytes of DT_FINI_ARRAY */
00671 #define DT_RUNPATH   29            /* Library search path */
00672 #define DT_FLAGS     30            /* Flags for the object being loaded */
00673 #define DT_ENCODING  32            /* Start of encoded range */
00674 #define DT_PREINIT_ARRAY 32        /* Array with addresses of preinit fct*/
00675 #define DT_PREINIT_ARRAYSZ 33             /* size in bytes of DT_PREINIT_ARRAY */
00676 #define       DT_NUM        34            /* Number used */
00677 #define DT_LOOS             0x6000000d    /* Start of OS-specific */
00678 #define DT_HIOS             0x6ffff000    /* End of OS-specific */
00679 #define DT_LOPROC    0x70000000    /* Start of processor-specific */
00680 #define DT_HIPROC    0x7fffffff    /* End of processor-specific */
00681 #define       DT_PROCNUM    DT_MIPS_NUM   /* Most used by any processor */
00682 
00683 /* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the
00684    Dyn.d_un.d_val field of the Elf*_Dyn structure.  This follows Sun's
00685    approach.  */
00686 #define DT_VALRNGLO  0x6ffffd00
00687 #define DT_GNU_PRELINKED 0x6ffffdf5       /* Prelinking timestamp */
00688 #define DT_GNU_CONFLICTSZ 0x6ffffdf6      /* Size of conflict section */
00689 #define DT_GNU_LIBLISTSZ 0x6ffffdf7       /* Size of library list */
00690 #define DT_CHECKSUM  0x6ffffdf8
00691 #define DT_PLTPADSZ  0x6ffffdf9
00692 #define DT_MOVEENT   0x6ffffdfa
00693 #define DT_MOVESZ    0x6ffffdfb
00694 #define DT_FEATURE_1 0x6ffffdfc    /* Feature selection (DTF_*).  */
00695 #define DT_POSFLAG_1 0x6ffffdfd    /* Flags for DT_* entries, effecting
00696                                       the following DT_* entry.  */
00697 #define DT_SYMINSZ   0x6ffffdfe    /* Size of syminfo table (in bytes) */
00698 #define DT_SYMINENT  0x6ffffdff    /* Entry size of syminfo */
00699 #define DT_VALRNGHI  0x6ffffdff
00700 #define DT_VALTAGIDX(tag)   (DT_VALRNGHI - (tag))       /* Reverse order! */
00701 #define DT_VALNUM 12
00702 
00703 /* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the
00704    Dyn.d_un.d_ptr field of the Elf*_Dyn structure.
00705 
00706    If any adjustment is made to the ELF object after it has been
00707    built these entries will need to be adjusted.  */
00708 #define DT_ADDRRNGLO 0x6ffffe00
00709 #define DT_GNU_HASH  0x6ffffef5    /* GNU-style hash table.  */
00710 #define DT_TLSDESC_PLT      0x6ffffef6
00711 #define DT_TLSDESC_GOT      0x6ffffef7
00712 #define DT_GNU_CONFLICT     0x6ffffef8    /* Start of conflict section */
00713 #define DT_GNU_LIBLIST      0x6ffffef9    /* Library list */
00714 #define DT_CONFIG    0x6ffffefa    /* Configuration information.  */
00715 #define DT_DEPAUDIT  0x6ffffefb    /* Dependency auditing.  */
00716 #define DT_AUDIT     0x6ffffefc    /* Object auditing.  */
00717 #define       DT_PLTPAD     0x6ffffefd    /* PLT padding.  */
00718 #define       DT_MOVETAB    0x6ffffefe    /* Move table.  */
00719 #define DT_SYMINFO   0x6ffffeff    /* Syminfo table.  */
00720 #define DT_ADDRRNGHI 0x6ffffeff
00721 #define DT_ADDRTAGIDX(tag)  (DT_ADDRRNGHI - (tag))      /* Reverse order! */
00722 #define DT_ADDRNUM 11
00723 
00724 /* The versioning entry types.  The next are defined as part of the
00725    GNU extension.  */
00726 #define DT_VERSYM    0x6ffffff0
00727 
00728 #define DT_RELACOUNT 0x6ffffff9
00729 #define DT_RELCOUNT  0x6ffffffa
00730 
00731 /* These were chosen by Sun.  */
00732 #define DT_FLAGS_1   0x6ffffffb    /* State flags, see DF_1_* below.  */
00733 #define       DT_VERDEF     0x6ffffffc    /* Address of version definition
00734                                       table */
00735 #define       DT_VERDEFNUM  0x6ffffffd    /* Number of version definitions */
00736 #define       DT_VERNEED    0x6ffffffe    /* Address of table with needed
00737                                       versions */
00738 #define       DT_VERNEEDNUM 0x6fffffff    /* Number of needed versions */
00739 #define DT_VERSIONTAGIDX(tag)      (DT_VERNEEDNUM - (tag))     /* Reverse order! */
00740 #define DT_VERSIONTAGNUM 16
00741 
00742 /* Sun added these machine-independent extensions in the "processor-specific"
00743    range.  Be compatible.  */
00744 #define DT_AUXILIARY    0x7ffffffd      /* Shared object to load before self */
00745 #define DT_FILTER       0x7fffffff      /* Shared object to get values from */
00746 #define DT_EXTRATAGIDX(tag) ((Elf32_Word)-((Elf32_Sword) (tag) <<1>>1)-1)
00747 #define DT_EXTRANUM  3
00748 
00749 /* Values of `d_un.d_val' in the DT_FLAGS entry.  */
00750 #define DF_ORIGIN    0x00000001    /* Object may use DF_ORIGIN */
00751 #define DF_SYMBOLIC  0x00000002    /* Symbol resolutions starts here */
00752 #define DF_TEXTREL   0x00000004    /* Object contains text relocations */
00753 #define DF_BIND_NOW  0x00000008    /* No lazy binding for this object */
00754 #define DF_STATIC_TLS       0x00000010    /* Module uses the static TLS model */
00755 
00756 /* State flags selectable in the `d_un.d_val' element of the DT_FLAGS_1
00757    entry in the dynamic section.  */
00758 #define DF_1_NOW     0x00000001    /* Set RTLD_NOW for this object.  */
00759 #define DF_1_GLOBAL  0x00000002    /* Set RTLD_GLOBAL for this object.  */
00760 #define DF_1_GROUP   0x00000004    /* Set RTLD_GROUP for this object.  */
00761 #define DF_1_NODELETE       0x00000008    /* Set RTLD_NODELETE for this object.*/
00762 #define DF_1_LOADFLTR       0x00000010    /* Trigger filtee loading at runtime.*/
00763 #define DF_1_INITFIRST      0x00000020    /* Set RTLD_INITFIRST for this object*/
00764 #define DF_1_NOOPEN  0x00000040    /* Set RTLD_NOOPEN for this object.  */
00765 #define DF_1_ORIGIN  0x00000080    /* $ORIGIN must be handled.  */
00766 #define DF_1_DIRECT  0x00000100    /* Direct binding enabled.  */
00767 #define DF_1_TRANS   0x00000200
00768 #define DF_1_INTERPOSE      0x00000400    /* Object is used to interpose.  */
00769 #define DF_1_NODEFLIB       0x00000800    /* Ignore default lib search path.  */
00770 #define DF_1_NODUMP  0x00001000    /* Object can't be dldump'ed.  */
00771 #define DF_1_CONFALT 0x00002000    /* Configuration alternative created.*/
00772 #define DF_1_ENDFILTEE      0x00004000    /* Filtee terminates filters search. */
00773 #define       DF_1_DISPRELDNE      0x00008000    /* Disp reloc applied at build time. */
00774 #define       DF_1_DISPRELPND      0x00010000    /* Disp reloc applied at run-time.  */
00775 
00776 /* Flags for the feature selection in DT_FEATURE_1.  */
00777 #define DTF_1_PARINIT       0x00000001
00778 #define DTF_1_CONFEXP       0x00000002
00779 
00780 /* Flags in the DT_POSFLAG_1 entry effecting only the next DT_* entry.  */
00781 #define DF_P1_LAZYLOAD      0x00000001    /* Lazyload following object.  */
00782 #define DF_P1_GROUPPERM     0x00000002    /* Symbols from next object are not
00783                                       generally available.  */
00784 
00785 /* Version definition sections.  */
00786 
00787 typedef struct
00788 {
00789   Elf32_Half  vd_version;          /* Version revision */
00790   Elf32_Half  vd_flags;            /* Version information */
00791   Elf32_Half  vd_ndx;                     /* Version Index */
00792   Elf32_Half  vd_cnt;                     /* Number of associated aux entries */
00793   Elf32_Word  vd_hash;             /* Version name hash value */
00794   Elf32_Word  vd_aux;                     /* Offset in bytes to verdaux array */
00795   Elf32_Word  vd_next;             /* Offset in bytes to next verdef
00796                                       entry */
00797 } Elf32_Verdef;
00798 
00799 typedef struct
00800 {
00801   Elf64_Half  vd_version;          /* Version revision */
00802   Elf64_Half  vd_flags;            /* Version information */
00803   Elf64_Half  vd_ndx;                     /* Version Index */
00804   Elf64_Half  vd_cnt;                     /* Number of associated aux entries */
00805   Elf64_Word  vd_hash;             /* Version name hash value */
00806   Elf64_Word  vd_aux;                     /* Offset in bytes to verdaux array */
00807   Elf64_Word  vd_next;             /* Offset in bytes to next verdef
00808                                       entry */
00809 } Elf64_Verdef;
00810 
00811 
00812 /* Legal values for vd_version (version revision).  */
00813 #define VER_DEF_NONE 0             /* No version */
00814 #define VER_DEF_CURRENT     1             /* Current version */
00815 #define VER_DEF_NUM  2             /* Given version number */
00816 
00817 /* Legal values for vd_flags (version information flags).  */
00818 #define VER_FLG_BASE 0x1           /* Version definition of file itself */
00819 #define VER_FLG_WEAK 0x2           /* Weak version identifier */
00820 
00821 /* Versym symbol index values.  */
00822 #define       VER_NDX_LOCAL        0      /* Symbol is local.  */
00823 #define       VER_NDX_GLOBAL              1      /* Symbol is global.  */
00824 #define       VER_NDX_LORESERVE    0xff00 /* Beginning of reserved entries.  */
00825 #define       VER_NDX_ELIMINATE    0xff01 /* Symbol is to be eliminated.  */
00826 
00827 /* Auxialiary version information.  */
00828 
00829 typedef struct
00830 {
00831   Elf32_Word  vda_name;            /* Version or dependency names */
00832   Elf32_Word  vda_next;            /* Offset in bytes to next verdaux
00833                                       entry */
00834 } Elf32_Verdaux;
00835 
00836 typedef struct
00837 {
00838   Elf64_Word  vda_name;            /* Version or dependency names */
00839   Elf64_Word  vda_next;            /* Offset in bytes to next verdaux
00840                                       entry */
00841 } Elf64_Verdaux;
00842 
00843 
00844 /* Version dependency section.  */
00845 
00846 typedef struct
00847 {
00848   Elf32_Half  vn_version;          /* Version of structure */
00849   Elf32_Half  vn_cnt;                     /* Number of associated aux entries */
00850   Elf32_Word  vn_file;             /* Offset of filename for this
00851                                       dependency */
00852   Elf32_Word  vn_aux;                     /* Offset in bytes to vernaux array */
00853   Elf32_Word  vn_next;             /* Offset in bytes to next verneed
00854                                       entry */
00855 } Elf32_Verneed;
00856 
00857 typedef struct
00858 {
00859   Elf64_Half  vn_version;          /* Version of structure */
00860   Elf64_Half  vn_cnt;                     /* Number of associated aux entries */
00861   Elf64_Word  vn_file;             /* Offset of filename for this
00862                                       dependency */
00863   Elf64_Word  vn_aux;                     /* Offset in bytes to vernaux array */
00864   Elf64_Word  vn_next;             /* Offset in bytes to next verneed
00865                                       entry */
00866 } Elf64_Verneed;
00867 
00868 
00869 /* Legal values for vn_version (version revision).  */
00870 #define VER_NEED_NONE        0            /* No version */
00871 #define VER_NEED_CURRENT 1         /* Current version */
00872 #define VER_NEED_NUM  2            /* Given version number */
00873 
00874 /* Auxiliary needed version information.  */
00875 
00876 typedef struct
00877 {
00878   Elf32_Word  vna_hash;            /* Hash value of dependency name */
00879   Elf32_Half  vna_flags;           /* Dependency specific information */
00880   Elf32_Half  vna_other;           /* Unused */
00881   Elf32_Word  vna_name;            /* Dependency name string offset */
00882   Elf32_Word  vna_next;            /* Offset in bytes to next vernaux
00883                                       entry */
00884 } Elf32_Vernaux;
00885 
00886 typedef struct
00887 {
00888   Elf64_Word  vna_hash;            /* Hash value of dependency name */
00889   Elf64_Half  vna_flags;           /* Dependency specific information */
00890   Elf64_Half  vna_other;           /* Unused */
00891   Elf64_Word  vna_name;            /* Dependency name string offset */
00892   Elf64_Word  vna_next;            /* Offset in bytes to next vernaux
00893                                       entry */
00894 } Elf64_Vernaux;
00895 
00896 
00897 /* Legal values for vna_flags.  */
00898 #define VER_FLG_WEAK 0x2           /* Weak version identifier */
00899 
00900 
00901 /* Auxiliary vector.  */
00902 
00903 /* This vector is normally only used by the program interpreter.  The
00904    usual definition in an ABI supplement uses the name auxv_t.  The
00905    vector is not usually defined in a standard <elf.h> file, but it
00906    can't hurt.  We rename it to avoid conflicts.  The sizes of these
00907    types are an arrangement between the exec server and the program
00908    interpreter, so we don't fully specify them here.  */
00909 
00910 typedef struct
00911 {
00912   uint32_t a_type;          /* Entry type */
00913   union
00914     {
00915       uint32_t a_val;              /* Integer value */
00916       /* We use to have pointer elements added here.  We cannot do that,
00917         though, since it does not work when using 32-bit definitions
00918         on 64-bit platforms and vice versa.  */
00919     } a_un;
00920 } Elf32_auxv_t;
00921 
00922 typedef struct
00923 {
00924   uint64_t a_type;          /* Entry type */
00925   union
00926     {
00927       uint64_t a_val;              /* Integer value */
00928       /* We use to have pointer elements added here.  We cannot do that,
00929         though, since it does not work when using 32-bit definitions
00930         on 64-bit platforms and vice versa.  */
00931     } a_un;
00932 } Elf64_auxv_t;
00933 
00934 /* Legal values for a_type (entry type).  */
00935 
00936 #define AT_NULL             0             /* End of vector */
00937 #define AT_IGNORE    1             /* Entry should be ignored */
00938 #define AT_EXECFD    2             /* File descriptor of program */
00939 #define AT_PHDR             3             /* Program headers for program */
00940 #define AT_PHENT     4             /* Size of program header entry */
00941 #define AT_PHNUM     5             /* Number of program headers */
00942 #define AT_PAGESZ    6             /* System page size */
00943 #define AT_BASE             7             /* Base address of interpreter */
00944 #define AT_FLAGS     8             /* Flags */
00945 #define AT_ENTRY     9             /* Entry point of program */
00946 #define AT_NOTELF    10            /* Program is not ELF */
00947 #define AT_UID              11            /* Real uid */
00948 #define AT_EUID             12            /* Effective uid */
00949 #define AT_GID              13            /* Real gid */
00950 #define AT_EGID             14            /* Effective gid */
00951 #define AT_CLKTCK    17            /* Frequency of times() */
00952 
00953 /* Some more special a_type values describing the hardware.  */
00954 #define AT_PLATFORM  15            /* String identifying platform.  */
00955 #define AT_HWCAP     16            /* Machine dependent hints about
00956                                       processor capabilities.  */
00957 
00958 /* This entry gives some information about the FPU initialization
00959    performed by the kernel.  */
00960 #define AT_FPUCW     18            /* Used FPU control word.  */
00961 
00962 /* Cache block sizes.  */
00963 #define AT_DCACHEBSIZE      19            /* Data cache block size.  */
00964 #define AT_ICACHEBSIZE      20            /* Instruction cache block size.  */
00965 #define AT_UCACHEBSIZE      21            /* Unified cache block size.  */
00966 
00967 /* A special ignored value for PPC, used by the kernel to control the
00968    interpretation of the AUXV. Must be > 16.  */
00969 #define AT_IGNOREPPC 22            /* Entry should be ignored.  */
00970 
00971 #define       AT_SECURE     23            /* Boolean, was exec setuid-like?  */
00972 
00973 #define AT_EXECFN    31            /* Filename of executable.  */
00974 
00975 /* Pointer to the global system page used for system calls and other
00976    nice things.  */
00977 #define AT_SYSINFO   32
00978 #define AT_SYSINFO_EHDR     33
00979 
00980 /* Shapes of the caches.  Bits 0-3 contains associativity; bits 4-7 contains
00981    log2 of line size; mask those to get cache size.  */
00982 #define AT_L1I_CACHESHAPE   34
00983 #define AT_L1D_CACHESHAPE   35
00984 #define AT_L2_CACHESHAPE    36
00985 #define AT_L3_CACHESHAPE    37
00986 
00987 /* Note section contents.  Each entry in the note section begins with
00988    a header of a fixed form.  */
00989 
00990 typedef struct
00991 {
00992   Elf32_Word n_namesz;                    /* Length of the note's name.  */
00993   Elf32_Word n_descsz;                    /* Length of the note's descriptor.  */
00994   Elf32_Word n_type;               /* Type of the note.  */
00995 } Elf32_Nhdr;
00996 
00997 typedef struct
00998 {
00999   Elf64_Word n_namesz;                    /* Length of the note's name.  */
01000   Elf64_Word n_descsz;                    /* Length of the note's descriptor.  */
01001   Elf64_Word n_type;               /* Type of the note.  */
01002 } Elf64_Nhdr;
01003 
01004 /* Known names of notes.  */
01005 
01006 /* Solaris entries in the note section have this name.  */
01007 #define ELF_NOTE_SOLARIS    "SUNW Solaris"
01008 
01009 /* Note entries for GNU systems have this name.  */
01010 #define ELF_NOTE_GNU        "GNU"
01011 
01012 
01013 /* Defined types of notes for Solaris.  */
01014 
01015 /* Value of descriptor (one word) is desired pagesize for the binary.  */
01016 #define ELF_NOTE_PAGESIZE_HINT     1
01017 
01018 
01019 /* Defined note types for GNU systems.  */
01020 
01021 /* ABI information.  The descriptor consists of words:
01022    word 0: OS descriptor
01023    word 1: major version of the ABI
01024    word 2: minor version of the ABI
01025    word 3: subminor version of the ABI
01026 */
01027 #define NT_GNU_ABI_TAG      1
01028 #define ELF_NOTE_ABI NT_GNU_ABI_TAG /* Old name.  */
01029 
01030 /* Known OSes.  These values can appear in word 0 of an
01031    NT_GNU_ABI_TAG note section entry.  */
01032 #define ELF_NOTE_OS_LINUX   0
01033 #define ELF_NOTE_OS_GNU            1
01034 #define ELF_NOTE_OS_SOLARIS2       2
01035 #define ELF_NOTE_OS_FREEBSD 3
01036 
01037 /* Synthetic hwcap information.  The descriptor begins with two words:
01038    word 0: number of entries
01039    word 1: bitmask of enabled entries
01040    Then follow variable-length entries, one byte followed by a
01041    '\0'-terminated hwcap name string.  The byte gives the bit
01042    number to test if enabled, (1U << bit) & bitmask.  */
01043 #define NT_GNU_HWCAP 2
01044 
01045 /* Build ID bits as generated by ld --build-id.
01046    The descriptor consists of any nonzero number of bytes.  */
01047 #define NT_GNU_BUILD_ID     3
01048 
01049 
01050 /* Move records.  */
01051 typedef struct
01052 {
01053   Elf32_Xword m_value;             /* Symbol value.  */
01054   Elf32_Word m_info;        /* Size and index.  */
01055   Elf32_Word m_poffset;            /* Symbol offset.  */
01056   Elf32_Half m_repeat;             /* Repeat count.  */
01057   Elf32_Half m_stride;             /* Stride info.  */
01058 } Elf32_Move;
01059 
01060 typedef struct
01061 {
01062   Elf64_Xword m_value;             /* Symbol value.  */
01063   Elf64_Xword m_info;              /* Size and index.  */
01064   Elf64_Xword m_poffset;    /* Symbol offset.  */
01065   Elf64_Half m_repeat;             /* Repeat count.  */
01066   Elf64_Half m_stride;             /* Stride info.  */
01067 } Elf64_Move;
01068 
01069 /* Macro to construct move records.  */
01070 #define ELF32_M_SYM(info)   ((info) >> 8)
01071 #define ELF32_M_SIZE(info)  ((unsigned char) (info))
01072 #define ELF32_M_INFO(sym, size)    (((sym) << 8) + (unsigned char) (size))
01073 
01074 #define ELF64_M_SYM(info)   ELF32_M_SYM (info)
01075 #define ELF64_M_SIZE(info)  ELF32_M_SIZE (info)
01076 #define ELF64_M_INFO(sym, size)    ELF32_M_INFO (sym, size)
01077 
01078 
01079 /* Motorola 68k specific definitions.  */
01080 
01081 /* Values for Elf32_Ehdr.e_flags.  */
01082 #define EF_CPU32     0x00810000
01083 
01084 /* m68k relocs.  */
01085 
01086 #define R_68K_NONE   0             /* No reloc */
01087 #define R_68K_32     1             /* Direct 32 bit  */
01088 #define R_68K_16     2             /* Direct 16 bit  */
01089 #define R_68K_8             3             /* Direct 8 bit  */
01090 #define R_68K_PC32   4             /* PC relative 32 bit */
01091 #define R_68K_PC16   5             /* PC relative 16 bit */
01092 #define R_68K_PC8    6             /* PC relative 8 bit */
01093 #define R_68K_GOT32  7             /* 32 bit PC relative GOT entry */
01094 #define R_68K_GOT16  8             /* 16 bit PC relative GOT entry */
01095 #define R_68K_GOT8   9             /* 8 bit PC relative GOT entry */
01096 #define R_68K_GOT32O 10            /* 32 bit GOT offset */
01097 #define R_68K_GOT16O 11            /* 16 bit GOT offset */
01098 #define R_68K_GOT8O  12            /* 8 bit GOT offset */
01099 #define R_68K_PLT32  13            /* 32 bit PC relative PLT address */
01100 #define R_68K_PLT16  14            /* 16 bit PC relative PLT address */
01101 #define R_68K_PLT8   15            /* 8 bit PC relative PLT address */
01102 #define R_68K_PLT32O 16            /* 32 bit PLT offset */
01103 #define R_68K_PLT16O 17            /* 16 bit PLT offset */
01104 #define R_68K_PLT8O  18            /* 8 bit PLT offset */
01105 #define R_68K_COPY   19            /* Copy symbol at runtime */
01106 #define R_68K_GLOB_DAT      20            /* Create GOT entry */
01107 #define R_68K_JMP_SLOT      21            /* Create PLT entry */
01108 #define R_68K_RELATIVE      22            /* Adjust by program base */
01109 /* Keep this the last entry.  */
01110 #define R_68K_NUM    23
01111 
01112 /* Intel 80386 specific definitions.  */
01113 
01114 /* i386 relocs.  */
01115 
01116 #define R_386_NONE      0          /* No reloc */
01117 #define R_386_32        1          /* Direct 32 bit  */
01118 #define R_386_PC32      2          /* PC relative 32 bit */
01119 #define R_386_GOT32     3          /* 32 bit GOT entry */
01120 #define R_386_PLT32     4          /* 32 bit PLT address */
01121 #define R_386_COPY      5          /* Copy symbol at runtime */
01122 #define R_386_GLOB_DAT         6          /* Create GOT entry */
01123 #define R_386_JMP_SLOT         7          /* Create PLT entry */
01124 #define R_386_RELATIVE         8          /* Adjust by program base */
01125 #define R_386_GOTOFF    9          /* 32 bit offset to GOT */
01126 #define R_386_GOTPC     10         /* 32 bit PC relative offset to GOT */
01127 #define R_386_32PLT     11
01128 #define R_386_TLS_TPOFF        14         /* Offset in static TLS block */
01129 #define R_386_TLS_IE    15         /* Address of GOT entry for static TLS
01130                                       block offset */
01131 #define R_386_TLS_GOTIE        16         /* GOT entry for static TLS block
01132                                       offset */
01133 #define R_386_TLS_LE    17         /* Offset relative to static TLS
01134                                       block */
01135 #define R_386_TLS_GD    18         /* Direct 32 bit for GNU version of
01136                                       general dynamic thread local data */
01137 #define R_386_TLS_LDM          19         /* Direct 32 bit for GNU version of
01138                                       local dynamic thread local data
01139                                       in LE code */
01140 #define R_386_16        20
01141 #define R_386_PC16      21
01142 #define R_386_8                22
01143 #define R_386_PC8       23
01144 #define R_386_TLS_GD_32        24         /* Direct 32 bit for general dynamic
01145                                       thread local data */
01146 #define R_386_TLS_GD_PUSH  25             /* Tag for pushl in GD TLS code */
01147 #define R_386_TLS_GD_CALL  26             /* Relocation for call to
01148                                       __tls_get_addr() */
01149 #define R_386_TLS_GD_POP   27             /* Tag for popl in GD TLS code */
01150 #define R_386_TLS_LDM_32   28             /* Direct 32 bit for local dynamic
01151                                       thread local data in LE code */
01152 #define R_386_TLS_LDM_PUSH 29             /* Tag for pushl in LDM TLS code */
01153 #define R_386_TLS_LDM_CALL 30             /* Relocation for call to
01154                                       __tls_get_addr() in LDM code */
01155 #define R_386_TLS_LDM_POP  31             /* Tag for popl in LDM TLS code */
01156 #define R_386_TLS_LDO_32   32             /* Offset relative to TLS block */
01157 #define R_386_TLS_IE_32        33         /* GOT entry for negated static TLS
01158                                       block offset */
01159 #define R_386_TLS_LE_32        34         /* Negated offset relative to static
01160                                       TLS block */
01161 #define R_386_TLS_DTPMOD32 35             /* ID of module containing symbol */
01162 #define R_386_TLS_DTPOFF32 36             /* Offset in TLS block */
01163 #define R_386_TLS_TPOFF32  37             /* Negated offset in static TLS block */
01164 /* 38? */
01165 #define R_386_TLS_GOTDESC  39             /* GOT offset for TLS descriptor.  */
01166 #define R_386_TLS_DESC_CALL 40            /* Marker of call through TLS
01167                                       descriptor for
01168                                       relaxation.  */
01169 #define R_386_TLS_DESC     41             /* TLS descriptor containing
01170                                       pointer to code and to
01171                                       argument, returning the TLS
01172                                       offset for the symbol.  */
01173 /* Keep this the last entry.  */
01174 #define R_386_NUM       42
01175 
01176 /* SUN SPARC specific definitions.  */
01177 
01178 /* Legal values for ST_TYPE subfield of st_info (symbol type).  */
01179 
01180 #define STT_SPARC_REGISTER  13     /* Global register reserved to app. */
01181 
01182 /* Values for Elf64_Ehdr.e_flags.  */
01183 
01184 #define EF_SPARCV9_MM              3
01185 #define EF_SPARCV9_TSO             0
01186 #define EF_SPARCV9_PSO             1
01187 #define EF_SPARCV9_RMO             2
01188 #define EF_SPARC_LEDATA            0x800000 /* little endian data */
01189 #define EF_SPARC_EXT_MASK   0xFFFF00
01190 #define EF_SPARC_32PLUS            0x000100 /* generic V8+ features */
01191 #define EF_SPARC_SUN_US1    0x000200 /* Sun UltraSPARC1 extensions */
01192 #define EF_SPARC_HAL_R1            0x000400 /* HAL R1 extensions */
01193 #define EF_SPARC_SUN_US3    0x000800 /* Sun UltraSPARCIII extensions */
01194 
01195 /* SPARC relocs.  */
01196 
01197 #define R_SPARC_NONE        0      /* No reloc */
01198 #define R_SPARC_8           1      /* Direct 8 bit */
01199 #define R_SPARC_16          2      /* Direct 16 bit */
01200 #define R_SPARC_32          3      /* Direct 32 bit */
01201 #define R_SPARC_DISP8              4      /* PC relative 8 bit */
01202 #define R_SPARC_DISP16             5      /* PC relative 16 bit */
01203 #define R_SPARC_DISP32             6      /* PC relative 32 bit */
01204 #define R_SPARC_WDISP30            7      /* PC relative 30 bit shifted */
01205 #define R_SPARC_WDISP22            8      /* PC relative 22 bit shifted */
01206 #define R_SPARC_HI22        9      /* High 22 bit */
01207 #define R_SPARC_22          10     /* Direct 22 bit */
01208 #define R_SPARC_13          11     /* Direct 13 bit */
01209 #define R_SPARC_LO10        12     /* Truncated 10 bit */
01210 #define R_SPARC_GOT10              13     /* Truncated 10 bit GOT entry */
01211 #define R_SPARC_GOT13              14     /* 13 bit GOT entry */
01212 #define R_SPARC_GOT22              15     /* 22 bit GOT entry shifted */
01213 #define R_SPARC_PC10        16     /* PC relative 10 bit truncated */
01214 #define R_SPARC_PC22        17     /* PC relative 22 bit shifted */
01215 #define R_SPARC_WPLT30             18     /* 30 bit PC relative PLT address */
01216 #define R_SPARC_COPY        19     /* Copy symbol at runtime */
01217 #define R_SPARC_GLOB_DAT    20     /* Create GOT entry */
01218 #define R_SPARC_JMP_SLOT    21     /* Create PLT entry */
01219 #define R_SPARC_RELATIVE    22     /* Adjust by program base */
01220 #define R_SPARC_UA32        23     /* Direct 32 bit unaligned */
01221 
01222 /* Additional Sparc64 relocs.  */
01223 
01224 #define R_SPARC_PLT32              24     /* Direct 32 bit ref to PLT entry */
01225 #define R_SPARC_HIPLT22            25     /* High 22 bit PLT entry */
01226 #define R_SPARC_LOPLT10            26     /* Truncated 10 bit PLT entry */
01227 #define R_SPARC_PCPLT32            27     /* PC rel 32 bit ref to PLT entry */
01228 #define R_SPARC_PCPLT22            28     /* PC rel high 22 bit PLT entry */
01229 #define R_SPARC_PCPLT10            29     /* PC rel trunc 10 bit PLT entry */
01230 #define R_SPARC_10          30     /* Direct 10 bit */
01231 #define R_SPARC_11          31     /* Direct 11 bit */
01232 #define R_SPARC_64          32     /* Direct 64 bit */
01233 #define R_SPARC_OLO10              33     /* 10bit with secondary 13bit addend */
01234 #define R_SPARC_HH22        34     /* Top 22 bits of direct 64 bit */
01235 #define R_SPARC_HM10        35     /* High middle 10 bits of ... */
01236 #define R_SPARC_LM22        36     /* Low middle 22 bits of ... */
01237 #define R_SPARC_PC_HH22            37     /* Top 22 bits of pc rel 64 bit */
01238 #define R_SPARC_PC_HM10            38     /* High middle 10 bit of ... */
01239 #define R_SPARC_PC_LM22            39     /* Low miggle 22 bits of ... */
01240 #define R_SPARC_WDISP16            40     /* PC relative 16 bit shifted */
01241 #define R_SPARC_WDISP19            41     /* PC relative 19 bit shifted */
01242 #define R_SPARC_7           43     /* Direct 7 bit */
01243 #define R_SPARC_5           44     /* Direct 5 bit */
01244 #define R_SPARC_6           45     /* Direct 6 bit */
01245 #define R_SPARC_DISP64             46     /* PC relative 64 bit */
01246 #define R_SPARC_PLT64              47     /* Direct 64 bit ref to PLT entry */
01247 #define R_SPARC_HIX22              48     /* High 22 bit complemented */
01248 #define R_SPARC_LOX10              49     /* Truncated 11 bit complemented */
01249 #define R_SPARC_H44         50     /* Direct high 12 of 44 bit */
01250 #define R_SPARC_M44         51     /* Direct mid 22 of 44 bit */
01251 #define R_SPARC_L44         52     /* Direct low 10 of 44 bit */
01252 #define R_SPARC_REGISTER    53     /* Global register usage */
01253 #define R_SPARC_UA64        54     /* Direct 64 bit unaligned */
01254 #define R_SPARC_UA16        55     /* Direct 16 bit unaligned */
01255 #define R_SPARC_TLS_GD_HI22 56
01256 #define R_SPARC_TLS_GD_LO10 57
01257 #define R_SPARC_TLS_GD_ADD  58
01258 #define R_SPARC_TLS_GD_CALL 59
01259 #define R_SPARC_TLS_LDM_HI22       60
01260 #define R_SPARC_TLS_LDM_LO10       61
01261 #define R_SPARC_TLS_LDM_ADD 62
01262 #define R_SPARC_TLS_LDM_CALL       63
01263 #define R_SPARC_TLS_LDO_HIX22      64
01264 #define R_SPARC_TLS_LDO_LOX10      65
01265 #define R_SPARC_TLS_LDO_ADD 66
01266 #define R_SPARC_TLS_IE_HI22 67
01267 #define R_SPARC_TLS_IE_LO10 68
01268 #define R_SPARC_TLS_IE_LD   69
01269 #define R_SPARC_TLS_IE_LDX  70
01270 #define R_SPARC_TLS_IE_ADD  71
01271 #define R_SPARC_TLS_LE_HIX22       72
01272 #define R_SPARC_TLS_LE_LOX10       73
01273 #define R_SPARC_TLS_DTPMOD32       74
01274 #define R_SPARC_TLS_DTPMOD64       75
01275 #define R_SPARC_TLS_DTPOFF32       76
01276 #define R_SPARC_TLS_DTPOFF64       77
01277 #define R_SPARC_TLS_TPOFF32 78
01278 #define R_SPARC_TLS_TPOFF64 79
01279 /* Keep this the last entry.  */
01280 #define R_SPARC_NUM         80
01281 
01282 /* For Sparc64, legal values for d_tag of Elf64_Dyn.  */
01283 
01284 #define DT_SPARC_REGISTER 0x70000001
01285 #define DT_SPARC_NUM 2
01286 
01287 /* Bits present in AT_HWCAP on SPARC.  */
01288 
01289 #define HWCAP_SPARC_FLUSH   1      /* The CPU supports flush insn.  */
01290 #define HWCAP_SPARC_STBAR   2
01291 #define HWCAP_SPARC_SWAP    4
01292 #define HWCAP_SPARC_MULDIV  8
01293 #define HWCAP_SPARC_V9             16     /* The CPU is v9, so v8plus is ok.  */
01294 #define HWCAP_SPARC_ULTRA3  32
01295 #define HWCAP_SPARC_BLKINIT 64     /* Sun4v with block-init/load-twin.  */
01296 #define HWCAP_SPARC_N2             128
01297 
01298 /* MIPS R3000 specific definitions.  */
01299 
01300 /* Legal values for e_flags field of Elf32_Ehdr.  */
01301 
01302 #define EF_MIPS_NOREORDER   1             /* A .noreorder directive was used */
01303 #define EF_MIPS_PIC      2         /* Contains PIC code */
01304 #define EF_MIPS_CPIC     4         /* Uses PIC calling sequence */
01305 #define EF_MIPS_XGOT     8
01306 #define EF_MIPS_64BIT_WHIRL 16
01307 #define EF_MIPS_ABI2     32
01308 #define EF_MIPS_ABI_ON32    64
01309 #define EF_MIPS_ARCH     0xf0000000       /* MIPS architecture level */
01310 
01311 /* Legal values for MIPS architecture level.  */
01312 
01313 #define EF_MIPS_ARCH_1          0x00000000       /* -mips1 code.  */
01314 #define EF_MIPS_ARCH_2          0x10000000       /* -mips2 code.  */
01315 #define EF_MIPS_ARCH_3          0x20000000       /* -mips3 code.  */
01316 #define EF_MIPS_ARCH_4          0x30000000       /* -mips4 code.  */
01317 #define EF_MIPS_ARCH_5          0x40000000       /* -mips5 code.  */
01318 #define EF_MIPS_ARCH_32         0x60000000       /* MIPS32 code.  */
01319 #define EF_MIPS_ARCH_64         0x70000000       /* MIPS64 code.  */
01320 
01321 /* The following are non-official names and should not be used.  */
01322 
01323 #define E_MIPS_ARCH_1         0x00000000  /* -mips1 code.  */
01324 #define E_MIPS_ARCH_2         0x10000000  /* -mips2 code.  */
01325 #define E_MIPS_ARCH_3         0x20000000  /* -mips3 code.  */
01326 #define E_MIPS_ARCH_4         0x30000000  /* -mips4 code.  */
01327 #define E_MIPS_ARCH_5         0x40000000  /* -mips5 code.  */
01328 #define E_MIPS_ARCH_32        0x60000000  /* MIPS32 code.  */
01329 #define E_MIPS_ARCH_64        0x70000000  /* MIPS64 code.  */
01330 
01331 /* Special section indices.  */
01332 
01333 #define SHN_MIPS_ACOMMON    0xff00 /* Allocated common symbols */
01334 #define SHN_MIPS_TEXT           0xff01    /* Allocated test symbols.  */
01335 #define SHN_MIPS_DATA           0xff02    /* Allocated data symbols.  */
01336 #define SHN_MIPS_SCOMMON    0xff03 /* Small common symbols */
01337 #define SHN_MIPS_SUNDEFINED 0xff04 /* Small undefined symbols */
01338 
01339 /* Legal values for sh_type field of Elf32_Shdr.  */
01340 
01341 #define SHT_MIPS_LIBLIST       0x70000000 /* Shared objects used in link */
01342 #define SHT_MIPS_MSYM              0x70000001
01343 #define SHT_MIPS_CONFLICT      0x70000002 /* Conflicting symbols */
01344 #define SHT_MIPS_GPTAB             0x70000003 /* Global data area sizes */
01345 #define SHT_MIPS_UCODE             0x70000004 /* Reserved for SGI/MIPS compilers */
01346 #define SHT_MIPS_DEBUG             0x70000005 /* MIPS ECOFF debugging information*/
01347 #define SHT_MIPS_REGINFO       0x70000006 /* Register usage information */
01348 #define SHT_MIPS_PACKAGE       0x70000007
01349 #define SHT_MIPS_PACKSYM       0x70000008
01350 #define SHT_MIPS_RELD              0x70000009
01351 #define SHT_MIPS_IFACE         0x7000000b
01352 #define SHT_MIPS_CONTENT       0x7000000c
01353 #define SHT_MIPS_OPTIONS       0x7000000d /* Miscellaneous options.  */
01354 #define SHT_MIPS_SHDR              0x70000010
01355 #define SHT_MIPS_FDESC             0x70000011
01356 #define SHT_MIPS_EXTSYM            0x70000012
01357 #define SHT_MIPS_DENSE             0x70000013
01358 #define SHT_MIPS_PDESC             0x70000014
01359 #define SHT_MIPS_LOCSYM            0x70000015
01360 #define SHT_MIPS_AUXSYM            0x70000016
01361 #define SHT_MIPS_OPTSYM            0x70000017
01362 #define SHT_MIPS_LOCSTR            0x70000018
01363 #define SHT_MIPS_LINE              0x70000019
01364 #define SHT_MIPS_RFDESC            0x7000001a
01365 #define SHT_MIPS_DELTASYM      0x7000001b
01366 #define SHT_MIPS_DELTAINST     0x7000001c
01367 #define SHT_MIPS_DELTACLASS    0x7000001d
01368 #define SHT_MIPS_DWARF         0x7000001e /* DWARF debugging information.  */
01369 #define SHT_MIPS_DELTADECL     0x7000001f
01370 #define SHT_MIPS_SYMBOL_LIB    0x70000020
01371 #define SHT_MIPS_EVENTS            0x70000021 /* Event section.  */
01372 #define SHT_MIPS_TRANSLATE     0x70000022
01373 #define SHT_MIPS_PIXIE             0x70000023
01374 #define SHT_MIPS_XLATE             0x70000024
01375 #define SHT_MIPS_XLATE_DEBUG   0x70000025
01376 #define SHT_MIPS_WHIRL             0x70000026
01377 #define SHT_MIPS_EH_REGION     0x70000027
01378 #define SHT_MIPS_XLATE_OLD     0x70000028
01379 #define SHT_MIPS_PDR_EXCEPTION 0x70000029
01380 
01381 /* Legal values for sh_flags field of Elf32_Shdr.  */
01382 
01383 #define SHF_MIPS_GPREL       0x10000000   /* Must be part of global data area */
01384 #define SHF_MIPS_MERGE       0x20000000
01385 #define SHF_MIPS_ADDR        0x40000000
01386 #define SHF_MIPS_STRINGS 0x80000000
01387 #define SHF_MIPS_NOSTRIP 0x08000000
01388 #define SHF_MIPS_LOCAL       0x04000000
01389 #define SHF_MIPS_NAMES       0x02000000
01390 #define SHF_MIPS_NODUPE      0x01000000
01391 
01392 
01393 /* Symbol tables.  */
01394 
01395 /* MIPS specific values for `st_other'.  */
01396 #define STO_MIPS_DEFAULT           0x0
01397 #define STO_MIPS_INTERNAL          0x1
01398 #define STO_MIPS_HIDDEN                   0x2
01399 #define STO_MIPS_PROTECTED         0x3
01400 #define STO_MIPS_PLT               0x8
01401 #define STO_MIPS_SC_ALIGN_UNUSED   0xff
01402 
01403 /* MIPS specific values for `st_info'.  */
01404 #define STB_MIPS_SPLIT_COMMON             13
01405 
01406 /* Entries found in sections of type SHT_MIPS_GPTAB.  */
01407 
01408 typedef union
01409 {
01410   struct
01411     {
01412       Elf32_Word gt_current_g_value;      /* -G value used for compilation */
01413       Elf32_Word gt_unused;        /* Not used */
01414     } gt_header;                   /* First entry in section */
01415   struct
01416     {
01417       Elf32_Word gt_g_value;              /* If this value were used for -G */
01418       Elf32_Word gt_bytes;         /* This many bytes would be used */
01419     } gt_entry;                           /* Subsequent entries in section */
01420 } Elf32_gptab;
01421 
01422 /* Entry found in sections of type SHT_MIPS_REGINFO.  */
01423 
01424 typedef struct
01425 {
01426   Elf32_Word  ri_gprmask;          /* General registers used */
01427   Elf32_Word  ri_cprmask[4];              /* Coprocessor registers used */
01428   Elf32_Sword ri_gp_value;         /* $gp register value */
01429 } Elf32_RegInfo;
01430 
01431 /* Entries found in sections of type SHT_MIPS_OPTIONS.  */
01432 
01433 typedef struct
01434 {
01435   unsigned char kind;              /* Determines interpretation of the
01436                                variable part of descriptor.  */
01437   unsigned char size;              /* Size of descriptor, including header.  */
01438   Elf32_Section section;    /* Section header index of section affected,
01439                                0 for global options.  */
01440   Elf32_Word info;          /* Kind-specific information.  */
01441 } Elf_Options;
01442 
01443 /* Values for `kind' field in Elf_Options.  */
01444 
01445 #define ODK_NULL     0      /* Undefined.  */
01446 #define ODK_REGINFO  1      /* Register usage information.  */
01447 #define ODK_EXCEPTIONS      2      /* Exception processing options.  */
01448 #define ODK_PAD             3      /* Section padding options.  */
01449 #define ODK_HWPATCH  4      /* Hardware workarounds performed */
01450 #define ODK_FILL     5      /* record the fill value used by the linker. */
01451 #define ODK_TAGS     6      /* reserve space for desktop tools to write. */
01452 #define ODK_HWAND    7      /* HW workarounds.  'AND' bits when merging. */
01453 #define ODK_HWOR     8      /* HW workarounds.  'OR' bits when merging.  */
01454 
01455 /* Values for `info' in Elf_Options for ODK_EXCEPTIONS entries.  */
01456 
01457 #define OEX_FPU_MIN  0x1f   /* FPE's which MUST be enabled.  */
01458 #define OEX_FPU_MAX  0x1f00 /* FPE's which MAY be enabled.  */
01459 #define OEX_PAGE0    0x10000       /* page zero must be mapped.  */
01460 #define OEX_SMM             0x20000       /* Force sequential memory mode?  */
01461 #define OEX_FPDBUG   0x40000       /* Force floating point debug mode?  */
01462 #define OEX_PRECISEFP       OEX_FPDBUG
01463 #define OEX_DISMISS  0x80000       /* Dismiss invalid address faults?  */
01464 
01465 #define OEX_FPU_INVAL       0x10
01466 #define OEX_FPU_DIV0 0x08
01467 #define OEX_FPU_OFLO 0x04
01468 #define OEX_FPU_UFLO 0x02
01469 #define OEX_FPU_INEX 0x01
01470 
01471 /* Masks for `info' in Elf_Options for an ODK_HWPATCH entry.  */
01472 
01473 #define OHW_R4KEOP   0x1    /* R4000 end-of-page patch.  */
01474 #define OHW_R8KPFETCH       0x2    /* may need R8000 prefetch patch.  */
01475 #define OHW_R5KEOP   0x4    /* R5000 end-of-page patch.  */
01476 #define OHW_R5KCVTL  0x8    /* R5000 cvt.[ds].l bug.  clean=1.  */
01477 
01478 #define OPAD_PREFIX  0x1
01479 #define OPAD_POSTFIX 0x2
01480 #define OPAD_SYMBOL  0x4
01481 
01482 /* Entry found in `.options' section.  */
01483 
01484 typedef struct
01485 {
01486   Elf32_Word hwp_flags1;    /* Extra flags.  */
01487   Elf32_Word hwp_flags2;    /* Extra flags.  */
01488 } Elf_Options_Hw;
01489 
01490 /* Masks for `info' in ElfOptions for ODK_HWAND and ODK_HWOR entries.  */
01491 
01492 #define OHWA0_R4KEOP_CHECKED       0x00000001
01493 #define OHWA1_R4KEOP_CLEAN  0x00000002
01494 
01495 /* MIPS relocs.  */
01496 
01497 #define R_MIPS_NONE         0      /* No reloc */
01498 #define R_MIPS_16           1      /* Direct 16 bit */
01499 #define R_MIPS_32           2      /* Direct 32 bit */
01500 #define R_MIPS_REL32        3      /* PC relative 32 bit */
01501 #define R_MIPS_26           4      /* Direct 26 bit shifted */
01502 #define R_MIPS_HI16         5      /* High 16 bit */
01503 #define R_MIPS_LO16         6      /* Low 16 bit */
01504 #define R_MIPS_GPREL16             7      /* GP relative 16 bit */
01505 #define R_MIPS_LITERAL             8      /* 16 bit literal entry */
01506 #define R_MIPS_GOT16        9      /* 16 bit GOT entry */
01507 #define R_MIPS_PC16         10     /* PC relative 16 bit */
01508 #define R_MIPS_CALL16              11     /* 16 bit GOT entry for function */
01509 #define R_MIPS_GPREL32             12     /* GP relative 32 bit */
01510 
01511 #define R_MIPS_SHIFT5              16
01512 #define R_MIPS_SHIFT6              17
01513 #define R_MIPS_64           18
01514 #define R_MIPS_GOT_DISP            19
01515 #define R_MIPS_GOT_PAGE            20
01516 #define R_MIPS_GOT_OFST            21
01517 #define R_MIPS_GOT_HI16            22
01518 #define R_MIPS_GOT_LO16            23
01519 #define R_MIPS_SUB          24
01520 #define R_MIPS_INSERT_A            25
01521 #define R_MIPS_INSERT_B            26
01522 #define R_MIPS_DELETE              27
01523 #define R_MIPS_HIGHER              28
01524 #define R_MIPS_HIGHEST             29
01525 #define R_MIPS_CALL_HI16    30
01526 #define R_MIPS_CALL_LO16    31
01527 #define R_MIPS_SCN_DISP            32
01528 #define R_MIPS_REL16        33
01529 #define R_MIPS_ADD_IMMEDIATE       34
01530 #define R_MIPS_PJUMP        35
01531 #define R_MIPS_RELGOT              36
01532 #define R_MIPS_JALR         37
01533 #define R_MIPS_TLS_DTPMOD32 38     /* Module number 32 bit */
01534 #define R_MIPS_TLS_DTPREL32 39     /* Module-relative offset 32 bit */
01535 #define R_MIPS_TLS_DTPMOD64 40     /* Module number 64 bit */
01536 #define R_MIPS_TLS_DTPREL64 41     /* Module-relative offset 64 bit */
01537 #define R_MIPS_TLS_GD              42     /* 16 bit GOT offset for GD */
01538 #define R_MIPS_TLS_LDM             43     /* 16 bit GOT offset for LDM */
01539 #define R_MIPS_TLS_DTPREL_HI16     44     /* Module-relative offset, high 16 bits */
01540 #define R_MIPS_TLS_DTPREL_LO16     45     /* Module-relative offset, low 16 bits */
01541 #define R_MIPS_TLS_GOTTPREL 46     /* 16 bit GOT offset for IE */
01542 #define R_MIPS_TLS_TPREL32  47     /* TP-relative offset, 32 bit */
01543 #define R_MIPS_TLS_TPREL64  48     /* TP-relative offset, 64 bit */
01544 #define R_MIPS_TLS_TPREL_HI16      49     /* TP-relative offset, high 16 bits */
01545 #define R_MIPS_TLS_TPREL_LO16      50     /* TP-relative offset, low 16 bits */
01546 #define R_MIPS_GLOB_DAT            51
01547 #define R_MIPS_COPY         126
01548 #define R_MIPS_JUMP_SLOT        127
01549 /* Keep this the last entry.  */
01550 #define R_MIPS_NUM          128
01551 
01552 /* Legal values for p_type field of Elf32_Phdr.  */
01553 
01554 #define PT_MIPS_REGINFO     0x70000000    /* Register usage information */
01555 #define PT_MIPS_RTPROC  0x70000001 /* Runtime procedure table. */
01556 #define PT_MIPS_OPTIONS 0x70000002
01557 
01558 /* Special program header types.  */
01559 
01560 #define PF_MIPS_LOCAL       0x10000000
01561 
01562 /* Legal values for d_tag field of Elf32_Dyn.  */
01563 
01564 #define DT_MIPS_RLD_VERSION  0x70000001   /* Runtime linker interface version */
01565 #define DT_MIPS_TIME_STAMP   0x70000002   /* Timestamp */
01566 #define DT_MIPS_ICHECKSUM    0x70000003   /* Checksum */
01567 #define DT_MIPS_IVERSION     0x70000004   /* Version string (string tbl index) */
01568 #define DT_MIPS_FLAGS            0x70000005      /* Flags */
01569 #define DT_MIPS_BASE_ADDRESS 0x70000006   /* Base address */
01570 #define DT_MIPS_MSYM      0x70000007
01571 #define DT_MIPS_CONFLICT     0x70000008   /* Address of CONFLICT section */
01572 #define DT_MIPS_LIBLIST          0x70000009      /* Address of LIBLIST section */
01573 #define DT_MIPS_LOCAL_GOTNO  0x7000000a   /* Number of local GOT entries */
01574 #define DT_MIPS_CONFLICTNO   0x7000000b   /* Number of CONFLICT entries */
01575 #define DT_MIPS_LIBLISTNO    0x70000010   /* Number of LIBLIST entries */
01576 #define DT_MIPS_SYMTABNO     0x70000011   /* Number of DYNSYM entries */
01577 #define DT_MIPS_UNREFEXTNO   0x70000012   /* First external DYNSYM */
01578 #define DT_MIPS_GOTSYM           0x70000013      /* First GOT entry in DYNSYM */
01579 #define DT_MIPS_HIPAGENO     0x70000014   /* Number of GOT page table entries */
01580 #define DT_MIPS_RLD_MAP          0x70000016      /* Address of run time loader map.  */
01581 #define DT_MIPS_DELTA_CLASS  0x70000017   /* Delta C++ class definition.  */
01582 #define DT_MIPS_DELTA_CLASS_NO    0x70000018 /* Number of entries in
01583                                           DT_MIPS_DELTA_CLASS.  */
01584 #define DT_MIPS_DELTA_INSTANCE    0x70000019 /* Delta C++ class instances.  */
01585 #define DT_MIPS_DELTA_INSTANCE_NO 0x7000001a /* Number of entries in
01586                                           DT_MIPS_DELTA_INSTANCE.  */
01587 #define DT_MIPS_DELTA_RELOC  0x7000001b /* Delta relocations.  */
01588 #define DT_MIPS_DELTA_RELOC_NO 0x7000001c /* Number of entries in
01589                                         DT_MIPS_DELTA_RELOC.  */
01590 #define DT_MIPS_DELTA_SYM    0x7000001d /* Delta symbols that Delta
01591                                       relocations refer to.  */
01592 #define DT_MIPS_DELTA_SYM_NO 0x7000001e /* Number of entries in
01593                                       DT_MIPS_DELTA_SYM.  */
01594 #define DT_MIPS_DELTA_CLASSSYM 0x70000020 /* Delta symbols that hold the
01595                                         class declaration.  */
01596 #define DT_MIPS_DELTA_CLASSSYM_NO 0x70000021 /* Number of entries in
01597                                           DT_MIPS_DELTA_CLASSSYM.  */
01598 #define DT_MIPS_CXX_FLAGS    0x70000022 /* Flags indicating for C++ flavor.  */
01599 #define DT_MIPS_PIXIE_INIT   0x70000023
01600 #define DT_MIPS_SYMBOL_LIB   0x70000024
01601 #define DT_MIPS_LOCALPAGE_GOTIDX 0x70000025
01602 #define DT_MIPS_LOCAL_GOTIDX 0x70000026
01603 #define DT_MIPS_HIDDEN_GOTIDX 0x70000027
01604 #define DT_MIPS_PROTECTED_GOTIDX 0x70000028
01605 #define DT_MIPS_OPTIONS          0x70000029 /* Address of .options.  */
01606 #define DT_MIPS_INTERFACE    0x7000002a /* Address of .interface.  */
01607 #define DT_MIPS_DYNSTR_ALIGN 0x7000002b
01608 #define DT_MIPS_INTERFACE_SIZE 0x7000002c /* Size of the .interface section. */
01609 #define DT_MIPS_RLD_TEXT_RESOLVE_ADDR 0x7000002d /* Address of rld_text_rsolve
01610                                               function stored in GOT.  */
01611 #define DT_MIPS_PERF_SUFFIX  0x7000002e /* Default suffix of dso to be added
01612                                       by rld on dlopen() calls.  */
01613 #define DT_MIPS_COMPACT_SIZE 0x7000002f /* (O32)Size of compact rel section. */
01614 #define DT_MIPS_GP_VALUE     0x70000030 /* GP value for aux GOTs.  */
01615 #define DT_MIPS_AUX_DYNAMIC  0x70000031 /* Address of aux .dynamic.  */
01616 /* The address of .got.plt in an executable using the new non-PIC ABI.  */
01617 #define DT_MIPS_PLTGOT           0x70000032
01618 /* The base of the PLT in an executable using the new non-PIC ABI if that
01619    PLT is writable.  For a non-writable PLT, this is omitted or has a zero
01620    value.  */
01621 #define DT_MIPS_RWPLT        0x70000034
01622 #define DT_MIPS_NUM       0x35
01623 
01624 /* Legal values for DT_MIPS_FLAGS Elf32_Dyn entry.  */
01625 
01626 #define RHF_NONE               0          /* No flags */
01627 #define RHF_QUICKSTART                (1 << 0)   /* Use quickstart */
01628 #define RHF_NOTPOT             (1 << 1)   /* Hash size not power of 2 */
01629 #define RHF_NO_LIBRARY_REPLACEMENT (1 << 2)      /* Ignore LD_LIBRARY_PATH */
01630 #define RHF_NO_MOVE            (1 << 3)
01631 #define RHF_SGI_ONLY           (1 << 4)
01632 #define RHF_GUARANTEE_INIT     (1 << 5)
01633 #define RHF_DELTA_C_PLUS_PLUS         (1 << 6)
01634 #define RHF_GUARANTEE_START_INIT   (1 << 7)
01635 #define RHF_PIXIE              (1 << 8)
01636 #define RHF_DEFAULT_DELAY_LOAD        (1 << 9)
01637 #define RHF_REQUICKSTART       (1 << 10)
01638 #define RHF_REQUICKSTARTED     (1 << 11)
01639 #define RHF_CORD               (1 << 12)
01640 #define RHF_NO_UNRES_UNDEF     (1 << 13)
01641 #define RHF_RLD_ORDER_SAFE     (1 << 14)
01642 
01643 /* Entries found in sections of type SHT_MIPS_LIBLIST.  */
01644 
01645 typedef struct
01646 {
01647   Elf32_Word l_name;        /* Name (string table index) */
01648   Elf32_Word l_time_stamp;  /* Timestamp */
01649   Elf32_Word l_checksum;    /* Checksum */
01650   Elf32_Word l_version;            /* Interface version */
01651   Elf32_Word l_flags;              /* Flags */
01652 } Elf32_Lib;
01653 
01654 typedef struct
01655 {
01656   Elf64_Word l_name;        /* Name (string table index) */
01657   Elf64_Word l_time_stamp;  /* Timestamp */
01658   Elf64_Word l_checksum;    /* Checksum */
01659   Elf64_Word l_version;            /* Interface version */
01660   Elf64_Word l_flags;              /* Flags */
01661 } Elf64_Lib;
01662 
01663 
01664 /* Legal values for l_flags.  */
01665 
01666 #define LL_NONE               0
01667 #define LL_EXACT_MATCH        (1 << 0)    /* Require exact match */
01668 #define LL_IGNORE_INT_VER (1 << 1) /* Ignore interface version */
01669 #define LL_REQUIRE_MINOR  (1 << 2)
01670 #define LL_EXPORTS     (1 << 3)
01671 #define LL_DELAY_LOAD         (1 << 4)
01672 #define LL_DELTA       (1 << 5)
01673 
01674 /* Entries found in sections of type SHT_MIPS_CONFLICT.  */
01675 
01676 typedef Elf32_Addr Elf32_Conflict;
01677 
01678 
01679 /* HPPA specific definitions.  */
01680 
01681 /* Legal values for e_flags field of Elf32_Ehdr.  */
01682 
01683 #define EF_PARISC_TRAPNIL   0x00010000 /* Trap nil pointer dereference.  */
01684 #define EF_PARISC_EXT              0x00020000 /* Program uses arch. extensions. */
01685 #define EF_PARISC_LSB              0x00040000 /* Program expects little endian. */
01686 #define EF_PARISC_WIDE             0x00080000 /* Program expects wide mode.  */
01687 #define EF_PARISC_NO_KABP   0x00100000 /* No kernel assisted branch
01688                                          prediction.  */
01689 #define EF_PARISC_LAZYSWAP  0x00400000 /* Allow lazy swapping.  */
01690 #define EF_PARISC_ARCH             0x0000ffff /* Architecture version.  */
01691 
01692 /* Defined values for `e_flags & EF_PARISC_ARCH' are:  */
01693 
01694 #define EFA_PARISC_1_0                 0x020b /* PA-RISC 1.0 big-endian.  */
01695 #define EFA_PARISC_1_1                 0x0210 /* PA-RISC 1.1 big-endian.  */
01696 #define EFA_PARISC_2_0                 0x0214 /* PA-RISC 2.0 big-endian.  */
01697 
01698 /* Additional section indeces.  */
01699 
01700 #define SHN_PARISC_ANSI_COMMON     0xff00    /* Section for tenatively declared
01701                                          symbols in ANSI C.  */
01702 #define SHN_PARISC_HUGE_COMMON     0xff01    /* Common blocks in huge model.  */
01703 
01704 /* Legal values for sh_type field of Elf32_Shdr.  */
01705 
01706 #define SHT_PARISC_EXT             0x70000000 /* Contains product specific ext. */
01707 #define SHT_PARISC_UNWIND   0x70000001 /* Unwind information.  */
01708 #define SHT_PARISC_DOC             0x70000002 /* Debug info for optimized code. */
01709 
01710 /* Legal values for sh_flags field of Elf32_Shdr.  */
01711 
01712 #define SHF_PARISC_SHORT    0x20000000 /* Section with short addressing. */
01713 #define SHF_PARISC_HUGE            0x40000000 /* Section far from gp.  */
01714 #define SHF_PARISC_SBP             0x80000000 /* Static branch prediction code. */
01715 
01716 /* Legal values for ST_TYPE subfield of st_info (symbol type).  */
01717 
01718 #define STT_PARISC_MILLICODE       13     /* Millicode function entry point.  */
01719 
01720 #define STT_HP_OPAQUE              (STT_LOOS + 0x1)
01721 #define STT_HP_STUB         (STT_LOOS + 0x2)
01722 
01723 /* HPPA relocs.  */
01724 
01725 #define R_PARISC_NONE              0      /* No reloc.  */
01726 #define R_PARISC_DIR32             1      /* Direct 32-bit reference.  */
01727 #define R_PARISC_DIR21L            2      /* Left 21 bits of eff. address.  */
01728 #define R_PARISC_DIR17R            3      /* Right 17 bits of eff. address.  */
01729 #define R_PARISC_DIR17F            4      /* 17 bits of eff. address.  */
01730 #define R_PARISC_DIR14R            6      /* Right 14 bits of eff. address.  */
01731 #define R_PARISC_PCREL32    9      /* 32-bit rel. address.  */
01732 #define R_PARISC_PCREL21L   10     /* Left 21 bits of rel. address.  */
01733 #define R_PARISC_PCREL17R   11     /* Right 17 bits of rel. address.  */
01734 #define R_PARISC_PCREL17F   12     /* 17 bits of rel. address.  */
01735 #define R_PARISC_PCREL14R   14     /* Right 14 bits of rel. address.  */
01736 #define R_PARISC_DPREL21L   18     /* Left 21 bits of rel. address.  */
01737 #define R_PARISC_DPREL14R   22     /* Right 14 bits of rel. address.  */
01738 #define R_PARISC_GPREL21L   26     /* GP-relative, left 21 bits.  */
01739 #define R_PARISC_GPREL14R   30     /* GP-relative, right 14 bits.  */
01740 #define R_PARISC_LTOFF21L   34     /* LT-relative, left 21 bits.  */
01741 #define R_PARISC_LTOFF14R   38     /* LT-relative, right 14 bits.  */
01742 #define R_PARISC_SECREL32   41     /* 32 bits section rel. address.  */
01743 #define R_PARISC_SEGBASE    48     /* No relocation, set segment base.  */
01744 #define R_PARISC_SEGREL32   49     /* 32 bits segment rel. address.  */
01745 #define R_PARISC_PLTOFF21L  50     /* PLT rel. address, left 21 bits.  */
01746 #define R_PARISC_PLTOFF14R  54     /* PLT rel. address, right 14 bits.  */
01747 #define R_PARISC_LTOFF_FPTR32      57     /* 32 bits LT-rel. function pointer. */
01748 #define R_PARISC_LTOFF_FPTR21L     58     /* LT-rel. fct ptr, left 21 bits. */
01749 #define R_PARISC_LTOFF_FPTR14R     62     /* LT-rel. fct ptr, right 14 bits. */
01750 #define R_PARISC_FPTR64            64     /* 64 bits function address.  */
01751 #define R_PARISC_PLABEL32   65     /* 32 bits function address.  */
01752 #define R_PARISC_PLABEL21L  66     /* Left 21 bits of fdesc address.  */
01753 #define R_PARISC_PLABEL14R  70     /* Right 14 bits of fdesc address.  */
01754 #define R_PARISC_PCREL64    72     /* 64 bits PC-rel. address.  */
01755 #define R_PARISC_PCREL22F   74     /* 22 bits PC-rel. address.  */
01756 #define R_PARISC_PCREL14WR  75     /* PC-rel. address, right 14 bits.  */
01757 #define R_PARISC_PCREL14DR  76     /* PC rel. address, right 14 bits.  */
01758 #define R_PARISC_PCREL16F   77     /* 16 bits PC-rel. address.  */
01759 #define R_PARISC_PCREL16WF  78     /* 16 bits PC-rel. address.  */
01760 #define R_PARISC_PCREL16DF  79     /* 16 bits PC-rel. address.  */
01761 #define R_PARISC_DIR64             80     /* 64 bits of eff. address.  */
01762 #define R_PARISC_DIR14WR    83     /* 14 bits of eff. address.  */
01763 #define R_PARISC_DIR14DR    84     /* 14 bits of eff. address.  */
01764 #define R_PARISC_DIR16F            85     /* 16 bits of eff. address.  */
01765 #define R_PARISC_DIR16WF    86     /* 16 bits of eff. address.  */
01766 #define R_PARISC_DIR16DF    87     /* 16 bits of eff. address.  */
01767 #define R_PARISC_GPREL64    88     /* 64 bits of GP-rel. address.  */
01768 #define R_PARISC_GPREL14WR  91     /* GP-rel. address, right 14 bits.  */
01769 #define R_PARISC_GPREL14DR  92     /* GP-rel. address, right 14 bits.  */
01770 #define R_PARISC_GPREL16F   93     /* 16 bits GP-rel. address.  */
01771 #define R_PARISC_GPREL16WF  94     /* 16 bits GP-rel. address.  */
01772 #define R_PARISC_GPREL16DF  95     /* 16 bits GP-rel. address.  */
01773 #define R_PARISC_LTOFF64    96     /* 64 bits LT-rel. address.  */
01774 #define R_PARISC_LTOFF14WR  99     /* LT-rel. address, right 14 bits.  */
01775 #define R_PARISC_LTOFF14DR  100    /* LT-rel. address, right 14 bits.  */
01776 #define R_PARISC_LTOFF16F   101    /* 16 bits LT-rel. address.  */
01777 #define R_PARISC_LTOFF16WF  102    /* 16 bits LT-rel. address.  */
01778 #define R_PARISC_LTOFF16DF  103    /* 16 bits LT-rel. address.  */
01779 #define R_PARISC_SECREL64   104    /* 64 bits section rel. address.  */
01780 #define R_PARISC_SEGREL64   112    /* 64 bits segment rel. address.  */
01781 #define R_PARISC_PLTOFF14WR 115    /* PLT-rel. address, right 14 bits.  */
01782 #define R_PARISC_PLTOFF14DR 116    /* PLT-rel. address, right 14 bits.  */
01783 #define R_PARISC_PLTOFF16F  117    /* 16 bits LT-rel. address.  */
01784 #define R_PARISC_PLTOFF16WF 118    /* 16 bits PLT-rel. address.  */
01785 #define R_PARISC_PLTOFF16DF 119    /* 16 bits PLT-rel. address.  */
01786 #define R_PARISC_LTOFF_FPTR64      120    /* 64 bits LT-rel. function ptr.  */
01787 #define R_PARISC_LTOFF_FPTR14WR    123    /* LT-rel. fct. ptr., right 14 bits. */
01788 #define R_PARISC_LTOFF_FPTR14DR    124    /* LT-rel. fct. ptr., right 14 bits. */
01789 #define R_PARISC_LTOFF_FPTR16F     125    /* 16 bits LT-rel. function ptr.  */
01790 #define R_PARISC_LTOFF_FPTR16WF    126    /* 16 bits LT-rel. function ptr.  */
01791 #define R_PARISC_LTOFF_FPTR16DF    127    /* 16 bits LT-rel. function ptr.  */
01792 #define R_PARISC_LORESERVE  128
01793 #define R_PARISC_COPY              128    /* Copy relocation.  */
01794 #define R_PARISC_IPLT              129    /* Dynamic reloc, imported PLT */
01795 #define R_PARISC_EPLT              130    /* Dynamic reloc, exported PLT */
01796 #define R_PARISC_TPREL32    153    /* 32 bits TP-rel. address.  */
01797 #define R_PARISC_TPREL21L   154    /* TP-rel. address, left 21 bits.  */
01798 #define R_PARISC_TPREL14R   158    /* TP-rel. address, right 14 bits.  */
01799 #define R_PARISC_LTOFF_TP21L       162    /* LT-TP-rel. address, left 21 bits. */
01800 #define R_PARISC_LTOFF_TP14R       166    /* LT-TP-rel. address, right 14 bits.*/
01801 #define R_PARISC_LTOFF_TP14F       167    /* 14 bits LT-TP-rel. address.  */
01802 #define R_PARISC_TPREL64    216    /* 64 bits TP-rel. address.  */
01803 #define R_PARISC_TPREL14WR  219    /* TP-rel. address, right 14 bits.  */
01804 #define R_PARISC_TPREL14DR  220    /* TP-rel. address, right 14 bits.  */
01805 #define R_PARISC_TPREL16F   221    /* 16 bits TP-rel. address.  */
01806 #define R_PARISC_TPREL16WF  222    /* 16 bits TP-rel. address.  */
01807 #define R_PARISC_TPREL16DF  223    /* 16 bits TP-rel. address.  */
01808 #define R_PARISC_LTOFF_TP64 224    /* 64 bits LT-TP-rel. address.  */
01809 #define R_PARISC_LTOFF_TP14WR      227    /* LT-TP-rel. address, right 14 bits.*/
01810 #define R_PARISC_LTOFF_TP14DR      228    /* LT-TP-rel. address, right 14 bits.*/
01811 #define R_PARISC_LTOFF_TP16F       229    /* 16 bits LT-TP-rel. address.  */
01812 #define R_PARISC_LTOFF_TP16WF      230    /* 16 bits LT-TP-rel. address.  */
01813 #define R_PARISC_LTOFF_TP16DF      231    /* 16 bits LT-TP-rel. address.  */
01814 #define R_PARISC_GNU_VTENTRY       232
01815 #define R_PARISC_GNU_VTINHERIT     233
01816 #define R_PARISC_TLS_GD21L  234    /* GD 21-bit left.  */
01817 #define R_PARISC_TLS_GD14R  235    /* GD 14-bit right.  */
01818 #define R_PARISC_TLS_GDCALL 236    /* GD call to __t_g_a.  */
01819 #define R_PARISC_TLS_LDM21L 237    /* LD module 21-bit left.  */
01820 #define R_PARISC_TLS_LDM14R 238    /* LD module 14-bit right.  */
01821 #define R_PARISC_TLS_LDMCALL       239    /* LD module call to __t_g_a.  */
01822 #define R_PARISC_TLS_LDO21L 240    /* LD offset 21-bit left.  */
01823 #define R_PARISC_TLS_LDO14R 241    /* LD offset 14-bit right.  */
01824 #define R_PARISC_TLS_DTPMOD32      242    /* DTP module 32-bit.  */
01825 #define R_PARISC_TLS_DTPMOD64      243    /* DTP module 64-bit.  */
01826 #define R_PARISC_TLS_DTPOFF32      244    /* DTP offset 32-bit.  */
01827 #define R_PARISC_TLS_DTPOFF64      245    /* DTP offset 32-bit.  */
01828 #define R_PARISC_TLS_LE21L  R_PARISC_TPREL21L
01829 #define R_PARISC_TLS_LE14R  R_PARISC_TPREL14R
01830 #define R_PARISC_TLS_IE21L  R_PARISC_LTOFF_TP21L
01831 #define R_PARISC_TLS_IE14R  R_PARISC_LTOFF_TP14R
01832 #define R_PARISC_TLS_TPREL32       R_PARISC_TPREL32
01833 #define R_PARISC_TLS_TPREL64       R_PARISC_TPREL64
01834 #define R_PARISC_HIRESERVE  255
01835 
01836 /* Legal values for p_type field of Elf32_Phdr/Elf64_Phdr.  */
01837 
01838 #define PT_HP_TLS           (PT_LOOS + 0x0)
01839 #define PT_HP_CORE_NONE            (PT_LOOS + 0x1)
01840 #define PT_HP_CORE_VERSION  (PT_LOOS + 0x2)
01841 #define PT_HP_CORE_KERNEL   (PT_LOOS + 0x3)
01842 #define PT_HP_CORE_COMM            (PT_LOOS + 0x4)
01843 #define PT_HP_CORE_PROC            (PT_LOOS + 0x5)
01844 #define PT_HP_CORE_LOADABLE (PT_LOOS + 0x6)
01845 #define PT_HP_CORE_STACK    (PT_LOOS + 0x7)
01846 #define PT_HP_CORE_SHM             (PT_LOOS + 0x8)
01847 #define PT_HP_CORE_MMF             (PT_LOOS + 0x9)
01848 #define PT_HP_PARALLEL             (PT_LOOS + 0x10)
01849 #define PT_HP_FASTBIND             (PT_LOOS + 0x11)
01850 #define PT_HP_OPT_ANNOT            (PT_LOOS + 0x12)
01851 #define PT_HP_HSL_ANNOT            (PT_LOOS + 0x13)
01852 #define PT_HP_STACK         (PT_LOOS + 0x14)
01853 
01854 #define PT_PARISC_ARCHEXT   0x70000000
01855 #define PT_PARISC_UNWIND    0x70000001
01856 
01857 /* Legal values for p_flags field of Elf32_Phdr/Elf64_Phdr.  */
01858 
01859 #define PF_PARISC_SBP              0x08000000
01860 
01861 #define PF_HP_PAGE_SIZE            0x00100000
01862 #define PF_HP_FAR_SHARED    0x00200000
01863 #define PF_HP_NEAR_SHARED   0x00400000
01864 #define PF_HP_CODE          0x01000000
01865 #define PF_HP_MODIFY        0x02000000
01866 #define PF_HP_LAZYSWAP             0x04000000
01867 #define PF_HP_SBP           0x08000000
01868 
01869 
01870 /* Alpha specific definitions.  */
01871 
01872 /* Legal values for e_flags field of Elf64_Ehdr.  */
01873 
01874 #define EF_ALPHA_32BIT             1      /* All addresses must be < 2GB.  */
01875 #define EF_ALPHA_CANRELAX   2      /* Relocations for relaxing exist.  */
01876 
01877 /* Legal values for sh_type field of Elf64_Shdr.  */
01878 
01879 /* These two are primerily concerned with ECOFF debugging info.  */
01880 #define SHT_ALPHA_DEBUG            0x70000001
01881 #define SHT_ALPHA_REGINFO   0x70000002
01882 
01883 /* Legal values for sh_flags field of Elf64_Shdr.  */
01884 
01885 #define SHF_ALPHA_GPREL            0x10000000
01886 
01887 /* Legal values for st_other field of Elf64_Sym.  */
01888 #define STO_ALPHA_NOPV             0x80   /* No PV required.  */
01889 #define STO_ALPHA_STD_GPLOAD       0x88   /* PV only used for initial ldgp.  */
01890 
01891 /* Alpha relocs.  */
01892 
01893 #define R_ALPHA_NONE        0      /* No reloc */
01894 #define R_ALPHA_REFLONG            1      /* Direct 32 bit */
01895 #define R_ALPHA_REFQUAD            2      /* Direct 64 bit */
01896 #define R_ALPHA_GPREL32            3      /* GP relative 32 bit */
01897 #define R_ALPHA_LITERAL            4      /* GP relative 16 bit w/optimization */
01898 #define R_ALPHA_LITUSE             5      /* Optimization hint for LITERAL */
01899 #define R_ALPHA_GPDISP             6      /* Add displacement to GP */
01900 #define R_ALPHA_BRADDR             7      /* PC+4 relative 23 bit shifted */
01901 #define R_ALPHA_HINT        8      /* PC+4 relative 16 bit shifted */
01902 #define R_ALPHA_SREL16             9      /* PC relative 16 bit */
01903 #define R_ALPHA_SREL32             10     /* PC relative 32 bit */
01904 #define R_ALPHA_SREL64             11     /* PC relative 64 bit */
01905 #define R_ALPHA_GPRELHIGH   17     /* GP relative 32 bit, high 16 bits */
01906 #define R_ALPHA_GPRELLOW    18     /* GP relative 32 bit, low 16 bits */
01907 #define R_ALPHA_GPREL16            19     /* GP relative 16 bit */
01908 #define R_ALPHA_COPY        24     /* Copy symbol at runtime */
01909 #define R_ALPHA_GLOB_DAT    25     /* Create GOT entry */
01910 #define R_ALPHA_JMP_SLOT    26     /* Create PLT entry */
01911 #define R_ALPHA_RELATIVE    27     /* Adjust by program base */
01912 #define R_ALPHA_TLS_GD_HI   28
01913 #define R_ALPHA_TLSGD              29
01914 #define R_ALPHA_TLS_LDM            30
01915 #define R_ALPHA_DTPMOD64    31
01916 #define R_ALPHA_GOTDTPREL   32
01917 #define R_ALPHA_DTPREL64    33
01918 #define R_ALPHA_DTPRELHI    34
01919 #define R_ALPHA_DTPRELLO    35
01920 #define R_ALPHA_DTPREL16    36
01921 #define R_ALPHA_GOTTPREL    37
01922 #define R_ALPHA_TPREL64            38
01923 #define R_ALPHA_TPRELHI            39
01924 #define R_ALPHA_TPRELLO            40
01925 #define R_ALPHA_TPREL16            41
01926 /* Keep this the last entry.  */
01927 #define R_ALPHA_NUM         46
01928 
01929 /* Magic values of the LITUSE relocation addend.  */
01930 #define LITUSE_ALPHA_ADDR   0
01931 #define LITUSE_ALPHA_BASE   1
01932 #define LITUSE_ALPHA_BYTOFF 2
01933 #define LITUSE_ALPHA_JSR    3
01934 #define LITUSE_ALPHA_TLS_GD 4
01935 #define LITUSE_ALPHA_TLS_LDM       5
01936 
01937 /* Legal values for d_tag of Elf64_Dyn.  */
01938 #define DT_ALPHA_PLTRO             (DT_LOPROC + 0)
01939 #define DT_ALPHA_NUM        1
01940 
01941 /* PowerPC specific declarations */
01942 
01943 /* Values for Elf32/64_Ehdr.e_flags.  */
01944 #define EF_PPC_EMB          0x80000000    /* PowerPC embedded flag */
01945 
01946 /* Cygnus local bits below */
01947 #define EF_PPC_RELOCATABLE  0x00010000    /* PowerPC -mrelocatable flag*/
01948 #define EF_PPC_RELOCATABLE_LIB     0x00008000    /* PowerPC -mrelocatable-lib
01949                                              flag */
01950 
01951 /* PowerPC relocations defined by the ABIs */
01952 #define R_PPC_NONE          0
01953 #define R_PPC_ADDR32        1      /* 32bit absolute address */
01954 #define R_PPC_ADDR24        2      /* 26bit address, 2 bits ignored.  */
01955 #define R_PPC_ADDR16        3      /* 16bit absolute address */
01956 #define R_PPC_ADDR16_LO            4      /* lower 16bit of absolute address */
01957 #define R_PPC_ADDR16_HI            5      /* high 16bit of absolute address */
01958 #define R_PPC_ADDR16_HA            6      /* adjusted high 16bit */
01959 #define R_PPC_ADDR14        7      /* 16bit address, 2 bits ignored */
01960 #define R_PPC_ADDR14_BRTAKEN       8
01961 #define R_PPC_ADDR14_BRNTAKEN      9
01962 #define R_PPC_REL24         10     /* PC relative 26 bit */
01963 #define R_PPC_REL14         11     /* PC relative 16 bit */
01964 #define R_PPC_REL14_BRTAKEN 12
01965 #define R_PPC_REL14_BRNTAKEN       13
01966 #define R_PPC_GOT16         14
01967 #define R_PPC_GOT16_LO             15
01968 #define R_PPC_GOT16_HI             16
01969 #define R_PPC_GOT16_HA             17
01970 #define R_PPC_PLTREL24             18
01971 #define R_PPC_COPY          19
01972 #define R_PPC_GLOB_DAT             20
01973 #define R_PPC_JMP_SLOT             21
01974 #define R_PPC_RELATIVE             22
01975 #define R_PPC_LOCAL24PC            23
01976 #define R_PPC_UADDR32              24
01977 #define R_PPC_UADDR16              25
01978 #define R_PPC_REL32         26
01979 #define R_PPC_PLT32         27
01980 #define R_PPC_PLTREL32             28
01981 #define R_PPC_PLT16_LO             29
01982 #define R_PPC_PLT16_HI             30
01983 #define R_PPC_PLT16_HA             31
01984 #define R_PPC_SDAREL16             32
01985 #define R_PPC_SECTOFF              33
01986 #define R_PPC_SECTOFF_LO    34
01987 #define R_PPC_SECTOFF_HI    35
01988 #define R_PPC_SECTOFF_HA    36
01989 
01990 /* PowerPC relocations defined for the TLS access ABI.  */
01991 #define R_PPC_TLS           67 /* none    (sym+add)@tls */
01992 #define R_PPC_DTPMOD32             68 /* word32  (sym+add)@dtpmod */
01993 #define R_PPC_TPREL16              69 /* half16* (sym+add)@tprel */
01994 #define R_PPC_TPREL16_LO    70 /* half16  (sym+add)@tprel@l */
01995 #define R_PPC_TPREL16_HI    71 /* half16  (sym+add)@tprel@h */
01996 #define R_PPC_TPREL16_HA    72 /* half16  (sym+add)@tprel@ha */
01997 #define R_PPC_TPREL32              73 /* word32  (sym+add)@tprel */
01998 #define R_PPC_DTPREL16             74 /* half16* (sym+add)@dtprel */
01999 #define R_PPC_DTPREL16_LO   75 /* half16  (sym+add)@dtprel@l */
02000 #define R_PPC_DTPREL16_HI   76 /* half16  (sym+add)@dtprel@h */
02001 #define R_PPC_DTPREL16_HA   77 /* half16  (sym+add)@dtprel@ha */
02002 #define R_PPC_DTPREL32             78 /* word32  (sym+add)@dtprel */
02003 #define R_PPC_GOT_TLSGD16   79 /* half16* (sym+add)@got@tlsgd */
02004 #define R_PPC_GOT_TLSGD16_LO       80 /* half16  (sym+add)@got@tlsgd@l */
02005 #define R_PPC_GOT_TLSGD16_HI       81 /* half16  (sym+add)@got@tlsgd@h */
02006 #define R_PPC_GOT_TLSGD16_HA       82 /* half16  (sym+add)@got@tlsgd@ha */
02007 #define R_PPC_GOT_TLSLD16   83 /* half16* (sym+add)@got@tlsld */
02008 #define R_PPC_GOT_TLSLD16_LO       84 /* half16  (sym+add)@got@tlsld@l */
02009 #define R_PPC_GOT_TLSLD16_HI       85 /* half16  (sym+add)@got@tlsld@h */
02010 #define R_PPC_GOT_TLSLD16_HA       86 /* half16  (sym+add)@got@tlsld@ha */
02011 #define R_PPC_GOT_TPREL16   87 /* half16* (sym+add)@got@tprel */
02012 #define R_PPC_GOT_TPREL16_LO       88 /* half16  (sym+add)@got@tprel@l */
02013 #define R_PPC_GOT_TPREL16_HI       89 /* half16  (sym+add)@got@tprel@h */
02014 #define R_PPC_GOT_TPREL16_HA       90 /* half16  (sym+add)@got@tprel@ha */
02015 #define R_PPC_GOT_DTPREL16  91 /* half16* (sym+add)@got@dtprel */
02016 #define R_PPC_GOT_DTPREL16_LO      92 /* half16* (sym+add)@got@dtprel@l */
02017 #define R_PPC_GOT_DTPREL16_HI      93 /* half16* (sym+add)@got@dtprel@h */
02018 #define R_PPC_GOT_DTPREL16_HA      94 /* half16* (sym+add)@got@dtprel@ha */
02019 
02020 /* Keep this the last entry.  */
02021 #define R_PPC_NUM           95
02022 
02023 /* The remaining relocs are from the Embedded ELF ABI, and are not
02024    in the SVR4 ELF ABI.  */
02025 #define R_PPC_EMB_NADDR32   101
02026 #define R_PPC_EMB_NADDR16   102
02027 #define R_PPC_EMB_NADDR16_LO       103
02028 #define R_PPC_EMB_NADDR16_HI       104
02029 #define R_PPC_EMB_NADDR16_HA       105
02030 #define R_PPC_EMB_SDAI16    106
02031 #define R_PPC_EMB_SDA2I16   107
02032 #define R_PPC_EMB_SDA2REL   108
02033 #define R_PPC_EMB_SDA21            109    /* 16 bit offset in SDA */
02034 #define R_PPC_EMB_MRKREF    110
02035 #define R_PPC_EMB_RELSEC16  111
02036 #define R_PPC_EMB_RELST_LO  112
02037 #define R_PPC_EMB_RELST_HI  113
02038 #define R_PPC_EMB_RELST_HA  114
02039 #define R_PPC_EMB_BIT_FLD   115
02040 #define R_PPC_EMB_RELSDA    116    /* 16 bit relative offset in SDA */
02041 
02042 /* Diab tool relocations.  */
02043 #define R_PPC_DIAB_SDA21_LO 180    /* like EMB_SDA21, but lower 16 bit */
02044 #define R_PPC_DIAB_SDA21_HI 181    /* like EMB_SDA21, but high 16 bit */
02045 #define R_PPC_DIAB_SDA21_HA 182    /* like EMB_SDA21, adjusted high 16 */
02046 #define R_PPC_DIAB_RELSDA_LO       183    /* like EMB_RELSDA, but lower 16 bit */
02047 #define R_PPC_DIAB_RELSDA_HI       184    /* like EMB_RELSDA, but high 16 bit */
02048 #define R_PPC_DIAB_RELSDA_HA       185    /* like EMB_RELSDA, adjusted high 16 */
02049 
02050 /* GNU relocs used in PIC code sequences.  */
02051 #define R_PPC_REL16         249    /* word32   (sym-.) */
02052 #define R_PPC_REL16_LO             250    /* half16   (sym-.)@l */
02053 #define R_PPC_REL16_HI             251    /* half16   (sym-.)@h */
02054 #define R_PPC_REL16_HA             252    /* half16   (sym-.)@ha */
02055 
02056 /* This is a phony reloc to handle any old fashioned TOC16 references
02057    that may still be in object files.  */
02058 #define R_PPC_TOC16         255
02059 
02060 /* PowerPC specific values for the Dyn d_tag field.  */
02061 #define DT_PPC_GOT          (DT_LOPROC + 0)
02062 #define DT_PPC_NUM          1
02063 
02064 /* PowerPC64 relocations defined by the ABIs */
02065 #define R_PPC64_NONE        R_PPC_NONE
02066 #define R_PPC64_ADDR32             R_PPC_ADDR32 /* 32bit absolute address */
02067 #define R_PPC64_ADDR24             R_PPC_ADDR24 /* 26bit address, word aligned */
02068 #define R_PPC64_ADDR16             R_PPC_ADDR16 /* 16bit absolute address */
02069 #define R_PPC64_ADDR16_LO   R_PPC_ADDR16_LO      /* lower 16bits of address */
02070 #define R_PPC64_ADDR16_HI   R_PPC_ADDR16_HI      /* high 16bits of address. */
02071 #define R_PPC64_ADDR16_HA   R_PPC_ADDR16_HA /* adjusted high 16bits.  */
02072 #define R_PPC64_ADDR14             R_PPC_ADDR14 /* 16bit address, word aligned */
02073 #define R_PPC64_ADDR14_BRTAKEN     R_PPC_ADDR14_BRTAKEN
02074 #define R_PPC64_ADDR14_BRNTAKEN    R_PPC_ADDR14_BRNTAKEN
02075 #define R_PPC64_REL24              R_PPC_REL24 /* PC-rel. 26 bit, word aligned */
02076 #define R_PPC64_REL14              R_PPC_REL14 /* PC relative 16 bit */
02077 #define R_PPC64_REL14_BRTAKEN      R_PPC_REL14_BRTAKEN
02078 #define R_PPC64_REL14_BRNTAKEN     R_PPC_REL14_BRNTAKEN
02079 #define R_PPC64_GOT16              R_PPC_GOT16
02080 #define R_PPC64_GOT16_LO    R_PPC_GOT16_LO
02081 #define R_PPC64_GOT16_HI    R_PPC_GOT16_HI
02082 #define R_PPC64_GOT16_HA    R_PPC_GOT16_HA
02083 
02084 #define R_PPC64_COPY        R_PPC_COPY
02085 #define R_PPC64_GLOB_DAT    R_PPC_GLOB_DAT
02086 #define R_PPC64_JMP_SLOT    R_PPC_JMP_SLOT
02087 #define R_PPC64_RELATIVE    R_PPC_RELATIVE
02088 
02089 #define R_PPC64_UADDR32            R_PPC_UADDR32
02090 #define R_PPC64_UADDR16            R_PPC_UADDR16
02091 #define R_PPC64_REL32              R_PPC_REL32
02092 #define R_PPC64_PLT32              R_PPC_PLT32
02093 #define R_PPC64_PLTREL32    R_PPC_PLTREL32
02094 #define R_PPC64_PLT16_LO    R_PPC_PLT16_LO
02095 #define R_PPC64_PLT16_HI    R_PPC_PLT16_HI
02096 #define R_PPC64_PLT16_HA    R_PPC_PLT16_HA
02097 
02098 #define R_PPC64_SECTOFF            R_PPC_SECTOFF
02099 #define R_PPC64_SECTOFF_LO  R_PPC_SECTOFF_LO
02100 #define R_PPC64_SECTOFF_HI  R_PPC_SECTOFF_HI
02101 #define R_PPC64_SECTOFF_HA  R_PPC_SECTOFF_HA
02102 #define R_PPC64_ADDR30             37 /* word30 (S + A - P) >> 2 */
02103 #define R_PPC64_ADDR64             38 /* doubleword64 S + A */
02104 #define R_PPC64_ADDR16_HIGHER      39 /* half16 #higher(S + A) */
02105 #define R_PPC64_ADDR16_HIGHERA     40 /* half16 #highera(S + A) */
02106 #define R_PPC64_ADDR16_HIGHEST     41 /* half16 #highest(S + A) */
02107 #define R_PPC64_ADDR16_HIGHESTA    42 /* half16 #highesta(S + A) */
02108 #define R_PPC64_UADDR64            43 /* doubleword64 S + A */
02109 #define R_PPC64_REL64              44 /* doubleword64 S + A - P */
02110 #define R_PPC64_PLT64              45 /* doubleword64 L + A */
02111 #define R_PPC64_PLTREL64    46 /* doubleword64 L + A - P */
02112 #define R_PPC64_TOC16              47 /* half16* S + A - .TOC */
02113 #define R_PPC64_TOC16_LO    48 /* half16 #lo(S + A - .TOC.) */
02114 #define R_PPC64_TOC16_HI    49 /* half16 #hi(S + A - .TOC.) */
02115 #define R_PPC64_TOC16_HA    50 /* half16 #ha(S + A - .TOC.) */
02116 #define R_PPC64_TOC         51 /* doubleword64 .TOC */
02117 #define R_PPC64_PLTGOT16    52 /* half16* M + A */
02118 #define R_PPC64_PLTGOT16_LO 53 /* half16 #lo(M + A) */
02119 #define R_PPC64_PLTGOT16_HI 54 /* half16 #hi(M + A) */
02120 #define R_PPC64_PLTGOT16_HA 55 /* half16 #ha(M + A) */
02121 
02122 #define R_PPC64_ADDR16_DS   56 /* half16ds* (S + A) >> 2 */
02123 #define R_PPC64_ADDR16_LO_DS       57 /* half16ds  #lo(S + A) >> 2 */
02124 #define R_PPC64_GOT16_DS    58 /* half16ds* (G + A) >> 2 */
02125 #define R_PPC64_GOT16_LO_DS 59 /* half16ds  #lo(G + A) >> 2 */
02126 #define R_PPC64_PLT16_LO_DS 60 /* half16ds  #lo(L + A) >> 2 */
02127 #define R_PPC64_SECTOFF_DS  61 /* half16ds* (R + A) >> 2 */
02128 #define R_PPC64_SECTOFF_LO_DS      62 /* half16ds  #lo(R + A) >> 2 */
02129 #define R_PPC64_TOC16_DS    63 /* half16ds* (S + A - .TOC.) >> 2 */
02130 #define R_PPC64_TOC16_LO_DS 64 /* half16ds  #lo(S + A - .TOC.) >> 2 */
02131 #define R_PPC64_PLTGOT16_DS 65 /* half16ds* (M + A) >> 2 */
02132 #define R_PPC64_PLTGOT16_LO_DS     66 /* half16ds  #lo(M + A) >> 2 */
02133 
02134 /* PowerPC64 relocations defined for the TLS access ABI.  */
02135 #define R_PPC64_TLS         67 /* none    (sym+add)@tls */
02136 #define R_PPC64_DTPMOD64    68 /* doubleword64 (sym+add)@dtpmod */
02137 #define R_PPC64_TPREL16            69 /* half16* (sym+add)@tprel */
02138 #define R_PPC64_TPREL16_LO  70 /* half16  (sym+add)@tprel@l */
02139 #define R_PPC64_TPREL16_HI  71 /* half16  (sym+add)@tprel@h */
02140 #define R_PPC64_TPREL16_HA  72 /* half16  (sym+add)@tprel@ha */
02141 #define R_PPC64_TPREL64            73 /* doubleword64 (sym+add)@tprel */
02142 #define R_PPC64_DTPREL16    74 /* half16* (sym+add)@dtprel */
02143 #define R_PPC64_DTPREL16_LO 75 /* half16  (sym+add)@dtprel@l */
02144 #define R_PPC64_DTPREL16_HI 76 /* half16  (sym+add)@dtprel@h */
02145 #define R_PPC64_DTPREL16_HA 77 /* half16  (sym+add)@dtprel@ha */
02146 #define R_PPC64_DTPREL64    78 /* doubleword64 (sym+add)@dtprel */
02147 #define R_PPC64_GOT_TLSGD16 79 /* half16* (sym+add)@got@tlsgd */
02148 #define R_PPC64_GOT_TLSGD16_LO     80 /* half16  (sym+add)@got@tlsgd@l */
02149 #define R_PPC64_GOT_TLSGD16_HI     81 /* half16  (sym+add)@got@tlsgd@h */
02150 #define R_PPC64_GOT_TLSGD16_HA     82 /* half16  (sym+add)@got@tlsgd@ha */
02151 #define R_PPC64_GOT_TLSLD16 83 /* half16* (sym+add)@got@tlsld */
02152 #define R_PPC64_GOT_TLSLD16_LO     84 /* half16  (sym+add)@got@tlsld@l */
02153 #define R_PPC64_GOT_TLSLD16_HI     85 /* half16  (sym+add)@got@tlsld@h */
02154 #define R_PPC64_GOT_TLSLD16_HA     86 /* half16  (sym+add)@got@tlsld@ha */
02155 #define R_PPC64_GOT_TPREL16_DS     87 /* half16ds*      (sym+add)@got@tprel */
02156 #define R_PPC64_GOT_TPREL16_LO_DS 88 /* half16ds (sym+add)@got@tprel@l */
02157 #define R_PPC64_GOT_TPREL16_HI     89 /* half16  (sym+add)@got@tprel@h */
02158 #define R_PPC64_GOT_TPREL16_HA     90 /* half16  (sym+add)@got@tprel@ha */
02159 #define R_PPC64_GOT_DTPREL16_DS    91 /* half16ds*      (sym+add)@got@dtprel */
02160 #define R_PPC64_GOT_DTPREL16_LO_DS 92 /* half16ds (sym+add)@got@dtprel@l */
02161 #define R_PPC64_GOT_DTPREL16_HI    93 /* half16  (sym+add)@got@dtprel@h */
02162 #define R_PPC64_GOT_DTPREL16_HA    94 /* half16  (sym+add)@got@dtprel@ha */
02163 #define R_PPC64_TPREL16_DS  95 /* half16ds*      (sym+add)@tprel */
02164 #define R_PPC64_TPREL16_LO_DS      96 /* half16ds       (sym+add)@tprel@l */
02165 #define R_PPC64_TPREL16_HIGHER     97 /* half16  (sym+add)@tprel@higher */
02166 #define R_PPC64_TPREL16_HIGHERA    98 /* half16  (sym+add)@tprel@highera */
02167 #define R_PPC64_TPREL16_HIGHEST    99 /* half16  (sym+add)@tprel@highest */
02168 #define R_PPC64_TPREL16_HIGHESTA 100 /* half16   (sym+add)@tprel@highesta */
02169 #define R_PPC64_DTPREL16_DS 101 /* half16ds* (sym+add)@dtprel */
02170 #define R_PPC64_DTPREL16_LO_DS     102 /* half16ds      (sym+add)@dtprel@l */
02171 #define R_PPC64_DTPREL16_HIGHER    103 /* half16 (sym+add)@dtprel@higher */
02172 #define R_PPC64_DTPREL16_HIGHERA 104 /* half16   (sym+add)@dtprel@highera */
02173 #define R_PPC64_DTPREL16_HIGHEST 105 /* half16   (sym+add)@dtprel@highest */
02174 #define R_PPC64_DTPREL16_HIGHESTA 106 /* half16  (sym+add)@dtprel@highesta */
02175 
02176 /* Keep this the last entry.  */
02177 #define R_PPC64_NUM         107
02178 
02179 /* PowerPC64 specific values for the Dyn d_tag field.  */
02180 #define DT_PPC64_GLINK  (DT_LOPROC + 0)
02181 #define DT_PPC64_OPD (DT_LOPROC + 1)
02182 #define DT_PPC64_OPDSZ      (DT_LOPROC + 2)
02183 #define DT_PPC64_NUM    3
02184 
02185 
02186 /* ARM specific declarations */
02187 
02188 /* Processor specific flags for the ELF header e_flags field.  */
02189 #define EF_ARM_RELEXEC     0x01
02190 #define EF_ARM_HASENTRY    0x02
02191 #define EF_ARM_INTERWORK   0x04
02192 #define EF_ARM_APCS_26     0x08
02193 #define EF_ARM_APCS_FLOAT  0x10
02194 #define EF_ARM_PIC         0x20
02195 #define EF_ARM_ALIGN8      0x40           /* 8-bit structure alignment is in use */
02196 #define EF_ARM_NEW_ABI     0x80
02197 #define EF_ARM_OLD_ABI     0x100
02198 
02199 /* Other constants defined in the ARM ELF spec. version B-01.  */
02200 /* NB. These conflict with values defined above.  */
02201 #define EF_ARM_SYMSARESORTED       0x04
02202 #define EF_ARM_DYNSYMSUSESEGIDX 0x08
02203 #define EF_ARM_MAPSYMSFIRST 0x10
02204 #define EF_ARM_EABIMASK            0XFF000000
02205 
02206 #define EF_ARM_EABI_VERSION(flags) ((flags) & EF_ARM_EABIMASK)
02207 #define EF_ARM_EABI_UNKNOWN  0x00000000
02208 #define EF_ARM_EABI_VER1     0x01000000
02209 #define EF_ARM_EABI_VER2     0x02000000
02210 
02211 /* Additional symbol types for Thumb */
02212 #define STT_ARM_TFUNC      0xd
02213 
02214 /* ARM-specific values for sh_flags */
02215 #define SHF_ARM_ENTRYSECT  0x10000000   /* Section contains an entry point */
02216 #define SHF_ARM_COMDEF     0x80000000   /* Section may be multiply defined
02217                                       in the input to a link step */
02218 
02219 /* ARM-specific program header flags */
02220 #define PF_ARM_SB          0x10000000   /* Segment contains the location
02221                                       addressed by the static base */
02222 
02223 /* Processor specific values for the Phdr p_type field.  */
02224 #define PT_ARM_EXIDX 0x70000001    /* .ARM.exidx segment */
02225 
02226 /* ARM relocs.  */
02227 
02228 #define R_ARM_NONE          0      /* No reloc */
02229 #define R_ARM_PC24          1      /* PC relative 26 bit branch */
02230 #define R_ARM_ABS32         2      /* Direct 32 bit  */
02231 #define R_ARM_REL32         3      /* PC relative 32 bit */
02232 #define R_ARM_PC13          4
02233 #define R_ARM_ABS16         5      /* Direct 16 bit */
02234 #define R_ARM_ABS12         6      /* Direct 12 bit */
02235 #define R_ARM_THM_ABS5             7
02236 #define R_ARM_ABS8          8      /* Direct 8 bit */
02237 #define R_ARM_SBREL32              9
02238 #define R_ARM_THM_PC22             10
02239 #define R_ARM_THM_PC8              11
02240 #define R_ARM_AMP_VCALL9    12
02241 #define R_ARM_SWI24         13
02242 #define R_ARM_THM_SWI8             14
02243 #define R_ARM_XPC25         15
02244 #define R_ARM_THM_XPC22            16
02245 #define R_ARM_TLS_DTPMOD32  17     /* ID of module containing symbol */
02246 #define R_ARM_TLS_DTPOFF32  18     /* Offset in TLS block */
02247 #define R_ARM_TLS_TPOFF32   19     /* Offset in static TLS block */
02248 #define R_ARM_COPY          20     /* Copy symbol at runtime */
02249 #define R_ARM_GLOB_DAT             21     /* Create GOT entry */
02250 #define R_ARM_JUMP_SLOT            22     /* Create PLT entry */
02251 #define R_ARM_RELATIVE             23     /* Adjust by program base */
02252 #define R_ARM_GOTOFF        24     /* 32 bit offset to GOT */
02253 #define R_ARM_GOTPC         25     /* 32 bit PC relative offset to GOT */
02254 #define R_ARM_GOT32         26     /* 32 bit GOT entry */
02255 #define R_ARM_PLT32         27     /* 32 bit PLT address */
02256 #define R_ARM_ALU_PCREL_7_0 32
02257 #define R_ARM_ALU_PCREL_15_8       33
02258 #define R_ARM_ALU_PCREL_23_15      34
02259 #define R_ARM_LDR_SBREL_11_0       35
02260 #define R_ARM_ALU_SBREL_19_12      36
02261 #define R_ARM_ALU_SBREL_27_20      37
02262 #define R_ARM_GNU_VTENTRY   100
02263 #define R_ARM_GNU_VTINHERIT 101
02264 #define R_ARM_THM_PC11             102    /* thumb unconditional branch */
02265 #define R_ARM_THM_PC9              103    /* thumb conditional branch */
02266 #define R_ARM_TLS_GD32             104    /* PC-rel 32 bit for global dynamic
02267                                       thread local data */
02268 #define R_ARM_TLS_LDM32            105    /* PC-rel 32 bit for local dynamic
02269                                       thread local data */
02270 #define R_ARM_TLS_LDO32            106    /* 32 bit offset relative to TLS
02271                                       block */
02272 #define R_ARM_TLS_IE32             107    /* PC-rel 32 bit for GOT entry of
02273                                       static TLS block offset */
02274 #define R_ARM_TLS_LE32             108    /* 32 bit offset relative to static
02275                                       TLS block */
02276 #define R_ARM_RXPC25        249
02277 #define R_ARM_RSBREL32             250
02278 #define R_ARM_THM_RPC22            251
02279 #define R_ARM_RREL32        252
02280 #define R_ARM_RABS22        253
02281 #define R_ARM_RPC24         254
02282 #define R_ARM_RBASE         255
02283 /* Keep this the last entry.  */
02284 #define R_ARM_NUM           256
02285 
02286 /* IA-64 specific declarations.  */
02287 
02288 /* Processor specific flags for the Ehdr e_flags field.  */
02289 #define EF_IA_64_MASKOS            0x0000000f    /* os-specific flags */
02290 #define EF_IA_64_ABI64             0x00000010    /* 64-bit ABI */
02291 #define EF_IA_64_ARCH              0xff000000    /* arch. version mask */
02292 
02293 /* Processor specific values for the Phdr p_type field.  */
02294 #define PT_IA_64_ARCHEXT    (PT_LOPROC + 0)      /* arch extension bits */
02295 #define PT_IA_64_UNWIND            (PT_LOPROC + 1)      /* ia64 unwind bits */
02296 #define PT_IA_64_HP_OPT_ANOT       (PT_LOOS + 0x12)
02297 #define PT_IA_64_HP_HSL_ANOT       (PT_LOOS + 0x13)
02298 #define PT_IA_64_HP_STACK   (PT_LOOS + 0x14)
02299 
02300 /* Processor specific flags for the Phdr p_flags field.  */
02301 #define PF_IA_64_NORECOV    0x80000000    /* spec insns w/o recovery */
02302 
02303 /* Processor specific values for the Shdr sh_type field.  */
02304 #define SHT_IA_64_EXT              (SHT_LOPROC + 0) /* extension bits */
02305 #define SHT_IA_64_UNWIND    (SHT_LOPROC + 1) /* unwind bits */
02306 
02307 /* Processor specific flags for the Shdr sh_flags field.  */
02308 #define SHF_IA_64_SHORT            0x10000000    /* section near gp */
02309 #define SHF_IA_64_NORECOV   0x20000000    /* spec insns w/o recovery */
02310 
02311 /* Processor specific values for the Dyn d_tag field.  */
02312 #define DT_IA_64_PLT_RESERVE       (DT_LOPROC + 0)
02313 #define DT_IA_64_NUM        1
02314 
02315 /* IA-64 relocations.  */
02316 #define R_IA64_NONE         0x00   /* none */
02317 #define R_IA64_IMM14        0x21   /* symbol + addend, add imm14 */
02318 #define R_IA64_IMM22        0x22   /* symbol + addend, add imm22 */
02319 #define R_IA64_IMM64        0x23   /* symbol + addend, mov imm64 */
02320 #define R_IA64_DIR32MSB            0x24   /* symbol + addend, data4 MSB */
02321 #define R_IA64_DIR32LSB            0x25   /* symbol + addend, data4 LSB */
02322 #define R_IA64_DIR64MSB            0x26   /* symbol + addend, data8 MSB */
02323 #define R_IA64_DIR64LSB            0x27   /* symbol + addend, data8 LSB */
02324 #define R_IA64_GPREL22             0x2a   /* @gprel(sym + add), add imm22 */
02325 #define R_IA64_GPREL64I            0x2b   /* @gprel(sym + add), mov imm64 */
02326 #define R_IA64_GPREL32MSB   0x2c   /* @gprel(sym + add), data4 MSB */
02327 #define R_IA64_GPREL32LSB   0x2d   /* @gprel(sym + add), data4 LSB */
02328 #define R_IA64_GPREL64MSB   0x2e   /* @gprel(sym + add), data8 MSB */
02329 #define R_IA64_GPREL64LSB   0x2f   /* @gprel(sym + add), data8 LSB */
02330 #define R_IA64_LTOFF22             0x32   /* @ltoff(sym + add), add imm22 */
02331 #define R_IA64_LTOFF64I            0x33   /* @ltoff(sym + add), mov imm64 */
02332 #define R_IA64_PLTOFF22            0x3a   /* @pltoff(sym + add), add imm22 */
02333 #define R_IA64_PLTOFF64I    0x3b   /* @pltoff(sym + add), mov imm64 */
02334 #define R_IA64_PLTOFF64MSB  0x3e   /* @pltoff(sym + add), data8 MSB */
02335 #define R_IA64_PLTOFF64LSB  0x3f   /* @pltoff(sym + add), data8 LSB */
02336 #define R_IA64_FPTR64I             0x43   /* @fptr(sym + add), mov imm64 */
02337 #define R_IA64_FPTR32MSB    0x44   /* @fptr(sym + add), data4 MSB */
02338 #define R_IA64_FPTR32LSB    0x45   /* @fptr(sym + add), data4 LSB */
02339 #define R_IA64_FPTR64MSB    0x46   /* @fptr(sym + add), data8 MSB */
02340 #define R_IA64_FPTR64LSB    0x47   /* @fptr(sym + add), data8 LSB */
02341 #define R_IA64_PCREL60B            0x48   /* @pcrel(sym + add), brl */
02342 #define R_IA64_PCREL21B            0x49   /* @pcrel(sym + add), ptb, call */
02343 #define R_IA64_PCREL21M            0x4a   /* @pcrel(sym + add), chk.s */
02344 #define R_IA64_PCREL21F            0x4b   /* @pcrel(sym + add), fchkf */
02345 #define R_IA64_PCREL32MSB   0x4c   /* @pcrel(sym + add), data4 MSB */
02346 #define R_IA64_PCREL32LSB   0x4d   /* @pcrel(sym + add), data4 LSB */
02347 #define R_IA64_PCREL64MSB   0x4e   /* @pcrel(sym + add), data8 MSB */
02348 #define R_IA64_PCREL64LSB   0x4f   /* @pcrel(sym + add), data8 LSB */
02349 #define R_IA64_LTOFF_FPTR22 0x52   /* @ltoff(@fptr(s+a)), imm22 */
02350 #define R_IA64_LTOFF_FPTR64I       0x53   /* @ltoff(@fptr(s+a)), imm64 */
02351 #define R_IA64_LTOFF_FPTR32MSB     0x54   /* @ltoff(@fptr(s+a)), data4 MSB */
02352 #define R_IA64_LTOFF_FPTR32LSB     0x55   /* @ltoff(@fptr(s+a)), data4 LSB */
02353 #define R_IA64_LTOFF_FPTR64MSB     0x56   /* @ltoff(@fptr(s+a)), data8 MSB */
02354 #define R_IA64_LTOFF_FPTR64LSB     0x57   /* @ltoff(@fptr(s+a)), data8 LSB */
02355 #define R_IA64_SEGREL32MSB  0x5c   /* @segrel(sym + add), data4 MSB */
02356 #define R_IA64_SEGREL32LSB  0x5d   /* @segrel(sym + add), data4 LSB */
02357 #define R_IA64_SEGREL64MSB  0x5e   /* @segrel(sym + add), data8 MSB */
02358 #define R_IA64_SEGREL64LSB  0x5f   /* @segrel(sym + add), data8 LSB */
02359 #define R_IA64_SECREL32MSB  0x64   /* @secrel(sym + add), data4 MSB */
02360 #define R_IA64_SECREL32LSB  0x65   /* @secrel(sym + add), data4 LSB */
02361 #define R_IA64_SECREL64MSB  0x66   /* @secrel(sym + add), data8 MSB */
02362 #define R_IA64_SECREL64LSB  0x67   /* @secrel(sym + add), data8 LSB */
02363 #define R_IA64_REL32MSB            0x6c   /* data 4 + REL */
02364 #define R_IA64_REL32LSB            0x6d   /* data 4 + REL */
02365 #define R_IA64_REL64MSB            0x6e   /* data 8 + REL */
02366 #define R_IA64_REL64LSB            0x6f   /* data 8 + REL */
02367 #define R_IA64_LTV32MSB            0x74   /* symbol + addend, data4 MSB */
02368 #define R_IA64_LTV32LSB            0x75   /* symbol + addend, data4 LSB */
02369 #define R_IA64_LTV64MSB            0x76   /* symbol + addend, data8 MSB */
02370 #define R_IA64_LTV64LSB            0x77   /* symbol + addend, data8 LSB */
02371 #define R_IA64_PCREL21BI    0x79   /* @pcrel(sym + add), 21bit inst */
02372 #define R_IA64_PCREL22             0x7a   /* @pcrel(sym + add), 22bit inst */
02373 #define R_IA64_PCREL64I            0x7b   /* @pcrel(sym + add), 64bit inst */
02374 #define R_IA64_IPLTMSB             0x80   /* dynamic reloc, imported PLT, MSB */
02375 #define R_IA64_IPLTLSB             0x81   /* dynamic reloc, imported PLT, LSB */
02376 #define R_IA64_COPY         0x84   /* copy relocation */
02377 #define R_IA64_SUB          0x85   /* Addend and symbol difference */
02378 #define R_IA64_LTOFF22X            0x86   /* LTOFF22, relaxable.  */
02379 #define R_IA64_LDXMOV              0x87   /* Use of LTOFF22X.  */
02380 #define R_IA64_TPREL14             0x91   /* @tprel(sym + add), imm14 */
02381 #define R_IA64_TPREL22             0x92   /* @tprel(sym + add), imm22 */
02382 #define R_IA64_TPREL64I            0x93   /* @tprel(sym + add), imm64 */
02383 #define R_IA64_TPREL64MSB   0x96   /* @tprel(sym + add), data8 MSB */
02384 #define R_IA64_TPREL64LSB   0x97   /* @tprel(sym + add), data8 LSB */
02385 #define R_IA64_LTOFF_TPREL22       0x9a   /* @ltoff(@tprel(s+a)), imm2 */
02386 #define R_IA64_DTPMOD64MSB  0xa6   /* @dtpmod(sym + add), data8 MSB */
02387 #define R_IA64_DTPMOD64LSB  0xa7   /* @dtpmod(sym + add), data8 LSB */
02388 #define R_IA64_LTOFF_DTPMOD22      0xaa   /* @ltoff(@dtpmod(sym + add)), imm22 */
02389 #define R_IA64_DTPREL14            0xb1   /* @dtprel(sym + add), imm14 */
02390 #define R_IA64_DTPREL22            0xb2   /* @dtprel(sym + add), imm22 */
02391 #define R_IA64_DTPREL64I    0xb3   /* @dtprel(sym + add), imm64 */
02392 #define R_IA64_DTPREL32MSB  0xb4   /* @dtprel(sym + add), data4 MSB */
02393 #define R_IA64_DTPREL32LSB  0xb5   /* @dtprel(sym + add), data4 LSB */
02394 #define R_IA64_DTPREL64MSB  0xb6   /* @dtprel(sym + add), data8 MSB */
02395 #define R_IA64_DTPREL64LSB  0xb7   /* @dtprel(sym + add), data8 LSB */
02396 #define R_IA64_LTOFF_DTPREL22      0xba   /* @ltoff(@dtprel(s+a)), imm22 */
02397 
02398 /* SH specific declarations */
02399 
02400 /* SH relocs.  */
02401 #define       R_SH_NONE            0
02402 #define       R_SH_DIR32           1
02403 #define       R_SH_REL32           2
02404 #define       R_SH_DIR8WPN         3
02405 #define       R_SH_IND12W          4
02406 #define       R_SH_DIR8WPL         5
02407 #define       R_SH_DIR8WPZ         6
02408 #define       R_SH_DIR8BP          7
02409 #define       R_SH_DIR8W           8
02410 #define       R_SH_DIR8L           9
02411 #define       R_SH_SWITCH16        25
02412 #define       R_SH_SWITCH32        26
02413 #define       R_SH_USES            27
02414 #define       R_SH_COUNT           28
02415 #define       R_SH_ALIGN           29
02416 #define       R_SH_CODE            30
02417 #define       R_SH_DATA            31
02418 #define       R_SH_LABEL           32
02419 #define       R_SH_SWITCH8         33
02420 #define       R_SH_GNU_VTINHERIT   34
02421 #define       R_SH_GNU_VTENTRY     35
02422 #define       R_SH_TLS_GD_32              144
02423 #define       R_SH_TLS_LD_32              145
02424 #define       R_SH_TLS_LDO_32             146
02425 #define       R_SH_TLS_IE_32              147
02426 #define       R_SH_TLS_LE_32              148
02427 #define       R_SH_TLS_DTPMOD32    149
02428 #define       R_SH_TLS_DTPOFF32    150
02429 #define       R_SH_TLS_TPOFF32     151
02430 #define       R_SH_GOT32           160
02431 #define       R_SH_PLT32           161
02432 #define       R_SH_COPY            162
02433 #define       R_SH_GLOB_DAT        163
02434 #define       R_SH_JMP_SLOT        164
02435 #define       R_SH_RELATIVE        165
02436 #define       R_SH_GOTOFF          166
02437 #define       R_SH_GOTPC           167
02438 /* Keep this the last entry.  */
02439 #define       R_SH_NUM             256
02440 
02441 /* Additional s390 relocs */
02442 
02443 #define R_390_NONE          0      /* No reloc.  */
02444 #define R_390_8                    1      /* Direct 8 bit.  */
02445 #define R_390_12            2      /* Direct 12 bit.  */
02446 #define R_390_16            3      /* Direct 16 bit.  */
02447 #define R_390_32            4      /* Direct 32 bit.  */
02448 #define R_390_PC32          5      /* PC relative 32 bit.      */
02449 #define R_390_GOT12         6      /* 12 bit GOT offset.  */
02450 #define R_390_GOT32         7      /* 32 bit GOT offset.  */
02451 #define R_390_PLT32         8      /* 32 bit PC relative PLT address.  */
02452 #define R_390_COPY          9      /* Copy symbol at runtime.  */
02453 #define R_390_GLOB_DAT             10     /* Create GOT entry.  */
02454 #define R_390_JMP_SLOT             11     /* Create PLT entry.  */
02455 #define R_390_RELATIVE             12     /* Adjust by program base.  */
02456 #define R_390_GOTOFF32             13     /* 32 bit offset to GOT.     */
02457 #define R_390_GOTPC         14     /* 32 bit PC relative offset to GOT.  */
02458 #define R_390_GOT16         15     /* 16 bit GOT offset.  */
02459 #define R_390_PC16          16     /* PC relative 16 bit.      */
02460 #define R_390_PC16DBL              17     /* PC relative 16 bit shifted by 1.  */
02461 #define R_390_PLT16DBL             18     /* 16 bit PC rel. PLT shifted by 1.  */
02462 #define R_390_PC32DBL              19     /* PC relative 32 bit shifted by 1.  */
02463 #define R_390_PLT32DBL             20     /* 32 bit PC rel. PLT shifted by 1.  */
02464 #define R_390_GOTPCDBL             21     /* 32 bit PC rel. GOT shifted by 1.  */
02465 #define R_390_64            22     /* Direct 64 bit.  */
02466 #define R_390_PC64          23     /* PC relative 64 bit.      */
02467 #define R_390_GOT64         24     /* 64 bit GOT offset.  */
02468 #define R_390_PLT64         25     /* 64 bit PC relative PLT address.  */
02469 #define R_390_GOTENT        26     /* 32 bit PC rel. to GOT entry >> 1. */
02470 #define R_390_GOTOFF16             27     /* 16 bit offset to GOT. */
02471 #define R_390_GOTOFF64             28     /* 64 bit offset to GOT. */
02472 #define R_390_GOTPLT12             29     /* 12 bit offset to jump slot.     */
02473 #define R_390_GOTPLT16             30     /* 16 bit offset to jump slot.     */
02474 #define R_390_GOTPLT32             31     /* 32 bit offset to jump slot.     */
02475 #define R_390_GOTPLT64             32     /* 64 bit offset to jump slot.     */
02476 #define R_390_GOTPLTENT            33     /* 32 bit rel. offset to jump slot.  */
02477 #define R_390_PLTOFF16             34     /* 16 bit offset from GOT to PLT. */
02478 #define R_390_PLTOFF32             35     /* 32 bit offset from GOT to PLT. */
02479 #define R_390_PLTOFF64             36     /* 16 bit offset from GOT to PLT. */
02480 #define R_390_TLS_LOAD             37     /* Tag for load insn in TLS code.  */
02481 #define R_390_TLS_GDCALL    38     /* Tag for function call in general
02482                                       dynamic TLS code. */
02483 #define R_390_TLS_LDCALL    39     /* Tag for function call in local
02484                                       dynamic TLS code. */
02485 #define R_390_TLS_GD32             40     /* Direct 32 bit for general dynamic
02486                                       thread local data.  */
02487 #define R_390_TLS_GD64             41     /* Direct 64 bit for general dynamic
02488                                      thread local data.  */
02489 #define R_390_TLS_GOTIE12   42     /* 12 bit GOT offset for static TLS
02490                                       block offset.  */
02491 #define R_390_TLS_GOTIE32   43     /* 32 bit GOT offset for static TLS
02492                                       block offset.  */
02493 #define R_390_TLS_GOTIE64   44     /* 64 bit GOT offset for static TLS
02494                                       block offset. */
02495 #define R_390_TLS_LDM32            45     /* Direct 32 bit for local dynamic
02496                                       thread local data in LE code.  */
02497 #define R_390_TLS_LDM64            46     /* Direct 64 bit for local dynamic
02498                                       thread local data in LE code.  */
02499 #define R_390_TLS_IE32             47     /* 32 bit address of GOT entry for
02500                                       negated static TLS block offset.  */
02501 #define R_390_TLS_IE64             48     /* 64 bit address of GOT entry for
02502                                       negated static TLS block offset.  */
02503 #define R_390_TLS_IEENT            49     /* 32 bit rel. offset to GOT entry for
02504                                       negated static TLS block offset.  */
02505 #define R_390_TLS_LE32             50     /* 32 bit negated offset relative to
02506                                       static TLS block.  */
02507 #define R_390_TLS_LE64             51     /* 64 bit negated offset relative to
02508                                       static TLS block.  */
02509 #define R_390_TLS_LDO32            52     /* 32 bit offset relative to TLS
02510                                       block.  */
02511 #define R_390_TLS_LDO64            53     /* 64 bit offset relative to TLS
02512                                       block.  */
02513 #define R_390_TLS_DTPMOD    54     /* ID of module containing symbol.  */
02514 #define R_390_TLS_DTPOFF    55     /* Offset in TLS block.      */
02515 #define R_390_TLS_TPOFF            56     /* Negated offset in static TLS
02516                                       block.  */
02517 #define R_390_20            57     /* Direct 20 bit.  */
02518 #define R_390_GOT20         58     /* 20 bit GOT offset.  */
02519 #define R_390_GOTPLT20             59     /* 20 bit offset to jump slot.  */
02520 #define R_390_TLS_GOTIE20   60     /* 20 bit GOT offset for static TLS
02521                                       block offset.  */
02522 /* Keep this the last entry.  */
02523 #define R_390_NUM           61
02524 
02525 
02526 /* CRIS relocations.  */
02527 #define R_CRIS_NONE         0
02528 #define R_CRIS_8            1
02529 #define R_CRIS_16           2
02530 #define R_CRIS_32           3
02531 #define R_CRIS_8_PCREL             4
02532 #define R_CRIS_16_PCREL            5
02533 #define R_CRIS_32_PCREL            6
02534 #define R_CRIS_GNU_VTINHERIT       7
02535 #define R_CRIS_GNU_VTENTRY  8
02536 #define R_CRIS_COPY         9
02537 #define R_CRIS_GLOB_DAT            10
02538 #define R_CRIS_JUMP_SLOT    11
02539 #define R_CRIS_RELATIVE            12
02540 #define R_CRIS_16_GOT              13
02541 #define R_CRIS_32_GOT              14
02542 #define R_CRIS_16_GOTPLT    15
02543 #define R_CRIS_32_GOTPLT    16
02544 #define R_CRIS_32_GOTREL    17
02545 #define R_CRIS_32_PLT_GOTREL       18
02546 #define R_CRIS_32_PLT_PCREL 19
02547 
02548 #define R_CRIS_NUM          20
02549 
02550 
02551 /* AMD x86-64 relocations.  */
02552 #define R_X86_64_NONE              0      /* No reloc */
02553 #define R_X86_64_64         1      /* Direct 64 bit  */
02554 #define R_X86_64_PC32              2      /* PC relative 32 bit signed */
02555 #define R_X86_64_GOT32             3      /* 32 bit GOT entry */
02556 #define R_X86_64_PLT32             4      /* 32 bit PLT address */
02557 #define R_X86_64_COPY              5      /* Copy symbol at runtime */
02558 #define R_X86_64_GLOB_DAT   6      /* Create GOT entry */
02559 #define R_X86_64_JUMP_SLOT  7      /* Create PLT entry */
02560 #define R_X86_64_RELATIVE   8      /* Adjust by program base */
02561 #define R_X86_64_GOTPCREL   9      /* 32 bit signed PC relative
02562                                       offset to GOT */
02563 #define R_X86_64_32         10     /* Direct 32 bit zero extended */
02564 #define R_X86_64_32S        11     /* Direct 32 bit sign extended */
02565 #define R_X86_64_16         12     /* Direct 16 bit zero extended */
02566 #define R_X86_64_PC16              13     /* 16 bit sign extended pc relative */
02567 #define R_X86_64_8          14     /* Direct 8 bit sign extended  */
02568 #define R_X86_64_PC8        15     /* 8 bit sign extended pc relative */
02569 #define R_X86_64_DTPMOD64   16     /* ID of module containing symbol */
02570 #define R_X86_64_DTPOFF64   17     /* Offset in module's TLS block */
02571 #define R_X86_64_TPOFF64    18     /* Offset in initial TLS block */
02572 #define R_X86_64_TLSGD             19     /* 32 bit signed PC relative offset
02573                                       to two GOT entries for GD symbol */
02574 #define R_X86_64_TLSLD             20     /* 32 bit signed PC relative offset
02575                                       to two GOT entries for LD symbol */
02576 #define R_X86_64_DTPOFF32   21     /* Offset in TLS block */
02577 #define R_X86_64_GOTTPOFF   22     /* 32 bit signed PC relative offset
02578                                       to GOT entry for IE symbol */
02579 #define R_X86_64_TPOFF32    23     /* Offset in initial TLS block */
02580 #define R_X86_64_PC64              24     /* PC relative 64 bit */
02581 #define R_X86_64_GOTOFF64   25     /* 64 bit offset to GOT */
02582 #define R_X86_64_GOTPC32    26     /* 32 bit signed pc relative
02583                                       offset to GOT */
02584 /* 27 .. 33 */
02585 #define R_X86_64_GOTPC32_TLSDESC 34       /* GOT offset for TLS descriptor.  */
02586 #define R_X86_64_TLSDESC_CALL   35 /* Marker for call through TLS
02587                                       descriptor.  */
02588 #define R_X86_64_TLSDESC        36 /* TLS descriptor.  */
02589 
02590 #define R_X86_64_NUM        37
02591 
02592 
02593 /* AM33 relocations.  */
02594 #define R_MN10300_NONE             0      /* No reloc.  */
02595 #define R_MN10300_32        1      /* Direct 32 bit.  */
02596 #define R_MN10300_16        2      /* Direct 16 bit.  */
02597 #define R_MN10300_8         3      /* Direct 8 bit.  */
02598 #define R_MN10300_PCREL32   4      /* PC-relative 32-bit.  */
02599 #define R_MN10300_PCREL16   5      /* PC-relative 16-bit signed.  */
02600 #define R_MN10300_PCREL8    6      /* PC-relative 8-bit signed.  */
02601 #define R_MN10300_GNU_VTINHERIT    7      /* Ancient C++ vtable garbage... */
02602 #define R_MN10300_GNU_VTENTRY      8      /* ... collection annotation.  */
02603 #define R_MN10300_24        9      /* Direct 24 bit.  */
02604 #define R_MN10300_GOTPC32   10     /* 32-bit PCrel offset to GOT.  */
02605 #define R_MN10300_GOTPC16   11     /* 16-bit PCrel offset to GOT.  */
02606 #define R_MN10300_GOTOFF32  12     /* 32-bit offset from GOT.  */
02607 #define R_MN10300_GOTOFF24  13     /* 24-bit offset from GOT.  */
02608 #define R_MN10300_GOTOFF16  14     /* 16-bit offset from GOT.  */
02609 #define R_MN10300_PLT32            15     /* 32-bit PCrel to PLT entry.  */
02610 #define R_MN10300_PLT16            16     /* 16-bit PCrel to PLT entry.  */
02611 #define R_MN10300_GOT32            17     /* 32-bit offset to GOT entry.  */
02612 #define R_MN10300_GOT24            18     /* 24-bit offset to GOT entry.  */
02613 #define R_MN10300_GOT16            19     /* 16-bit offset to GOT entry.  */
02614 #define R_MN10300_COPY             20     /* Copy symbol at runtime.  */
02615 #define R_MN10300_GLOB_DAT  21     /* Create GOT entry.  */
02616 #define R_MN10300_JMP_SLOT  22     /* Create PLT entry.  */
02617 #define R_MN10300_RELATIVE  23     /* Adjust by program base.  */
02618 
02619 #define R_MN10300_NUM              24
02620 
02621 
02622 /* M32R relocs.  */
02623 #define R_M32R_NONE         0      /* No reloc. */
02624 #define R_M32R_16           1      /* Direct 16 bit. */
02625 #define R_M32R_32           2      /* Direct 32 bit. */
02626 #define R_M32R_24           3      /* Direct 24 bit. */
02627 #define R_M32R_10_PCREL            4      /* PC relative 10 bit shifted. */
02628 #define R_M32R_18_PCREL            5      /* PC relative 18 bit shifted. */
02629 #define R_M32R_26_PCREL            6      /* PC relative 26 bit shifted. */
02630 #define R_M32R_HI16_ULO            7      /* High 16 bit with unsigned low. */
02631 #define R_M32R_HI16_SLO            8      /* High 16 bit with signed low. */
02632 #define R_M32R_LO16         9      /* Low 16 bit. */
02633 #define R_M32R_SDA16        10     /* 16 bit offset in SDA. */
02634 #define R_M32R_GNU_VTINHERIT       11
02635 #define R_M32R_GNU_VTENTRY  12
02636 /* M32R relocs use SHT_RELA.  */
02637 #define R_M32R_16_RELA             33     /* Direct 16 bit. */
02638 #define R_M32R_32_RELA             34     /* Direct 32 bit. */
02639 #define R_M32R_24_RELA             35     /* Direct 24 bit. */
02640 #define R_M32R_10_PCREL_RELA       36     /* PC relative 10 bit shifted. */
02641 #define R_M32R_18_PCREL_RELA       37     /* PC relative 18 bit shifted. */
02642 #define R_M32R_26_PCREL_RELA       38     /* PC relative 26 bit shifted. */
02643 #define R_M32R_HI16_ULO_RELA       39     /* High 16 bit with unsigned low */
02644 #define R_M32R_HI16_SLO_RELA       40     /* High 16 bit with signed low */
02645 #define R_M32R_LO16_RELA    41     /* Low 16 bit */
02646 #define R_M32R_SDA16_RELA   42     /* 16 bit offset in SDA */
02647 #define R_M32R_RELA_GNU_VTINHERIT  43
02648 #define R_M32R_RELA_GNU_VTENTRY    44
02649 #define R_M32R_REL32        45     /* PC relative 32 bit.  */
02650 
02651 #define R_M32R_GOT24        48     /* 24 bit GOT entry */
02652 #define R_M32R_26_PLTREL    49     /* 26 bit PC relative to PLT shifted */
02653 #define R_M32R_COPY         50     /* Copy symbol at runtime */
02654 #define R_M32R_GLOB_DAT            51     /* Create GOT entry */
02655 #define R_M32R_JMP_SLOT            52     /* Create PLT entry */
02656 #define R_M32R_RELATIVE            53     /* Adjust by program base */
02657 #define R_M32R_GOTOFF              54     /* 24 bit offset to GOT */
02658 #define R_M32R_GOTPC24             55     /* 24 bit PC relative offset to GOT */
02659 #define R_M32R_GOT16_HI_ULO 56     /* High 16 bit GOT entry with unsigned
02660                                       low */
02661 #define R_M32R_GOT16_HI_SLO 57     /* High 16 bit GOT entry with signed
02662                                       low */
02663 #define R_M32R_GOT16_LO            58     /* Low 16 bit GOT entry */
02664 #define R_M32R_GOTPC_HI_ULO 59     /* High 16 bit PC relative offset to
02665                                       GOT with unsigned low */
02666 #define R_M32R_GOTPC_HI_SLO 60     /* High 16 bit PC relative offset to
02667                                       GOT with signed low */
02668 #define R_M32R_GOTPC_LO            61     /* Low 16 bit PC relative offset to
02669                                       GOT */
02670 #define R_M32R_GOTOFF_HI_ULO       62     /* High 16 bit offset to GOT
02671                                       with unsigned low */
02672 #define R_M32R_GOTOFF_HI_SLO       63     /* High 16 bit offset to GOT
02673                                       with signed low */
02674 #define R_M32R_GOTOFF_LO    64     /* Low 16 bit offset to GOT */
02675 #define R_M32R_NUM          256    /* Keep this the last entry. */
02676 
02677 
02678 __END_DECLS
02679 
02680 #endif /* elf.h */