| 1 | /* $Id: elf.h,v 1.5 2000-02-26 00:46:30 bird Exp $ | 
|---|
| 2 | * | 
|---|
| 3 | * ELF stuff. | 
|---|
| 4 | * | 
|---|
| 5 | * Copyright (c) 1999-2000 knut st. osmundsen (knut.stange.osmundsen@pmsc.no) | 
|---|
| 6 | * | 
|---|
| 7 | * Project Odin Software License can be found in LICENSE.TXT | 
|---|
| 8 | * | 
|---|
| 9 | */ | 
|---|
| 10 |  | 
|---|
| 11 |  | 
|---|
| 12 | #ifndef _elf_h_ | 
|---|
| 13 | #define _elf_h_ | 
|---|
| 14 |  | 
|---|
| 15 | //#pragma pack(1) | 
|---|
| 16 |  | 
|---|
| 17 | /* | 
|---|
| 18 | * Basic ELF types. | 
|---|
| 19 | */ | 
|---|
| 20 | typedef unsigned long   Elf32_Addr;   /* Unsigned program address. */ | 
|---|
| 21 | typedef unsigned short  Elf32_Half;   /* Unsigned medium integer.  */ | 
|---|
| 22 | typedef signed long     Elf32_Off;    /* Unsigned file offset.     */ | 
|---|
| 23 | typedef signed long     Elf32_Sword;  /* Signed large interger.    */ | 
|---|
| 24 | typedef unsigned long   Elf32_Word;   /* Unsigned large integer.   */ | 
|---|
| 25 | /*                      unsigned char    Unsigned small integer.   */ | 
|---|
| 26 |  | 
|---|
| 27 |  | 
|---|
| 28 |  | 
|---|
| 29 | /* | 
|---|
| 30 | * ELF Header | 
|---|
| 31 | */ | 
|---|
| 32 | #define EI_INDENT         0x10 | 
|---|
| 33 |  | 
|---|
| 34 | typedef struct                          /* 0x34 */ | 
|---|
| 35 | { | 
|---|
| 36 | unsigned char   e_ident[EI_INDENT]; /* 0x00  ELF Indentification */ | 
|---|
| 37 | Elf32_Half      e_type;             /* 0x10  Object file type */ | 
|---|
| 38 | Elf32_Half      e_machine;          /* 0x12  Machine type */ | 
|---|
| 39 | Elf32_Word      e_version;          /* 0x14  ELF format version */ | 
|---|
| 40 | Elf32_Addr      e_entry;            /* 0x18  Entry point address */ | 
|---|
| 41 | Elf32_Off       e_phoff;            /* 0x1c  File offset of the program header table */ | 
|---|
| 42 | Elf32_Off       e_shoff;            /* 0x20  File offset of the section header table */ | 
|---|
| 43 | Elf32_Word      e_flags;            /* 0x24  Processor specific flags */ | 
|---|
| 44 | Elf32_Half      e_ehsize;           /* 0x28  Size of the Elf Header (this structure) */ | 
|---|
| 45 | Elf32_Half      e_phentsize;        /* 0x2a  Size of one entry in the program header table */ | 
|---|
| 46 | Elf32_Half      e_phnum;            /* 0x2c  Number of entries in the program header table */ | 
|---|
| 47 | Elf32_Half      e_shentsize;        /* 0x2e  Size of one entry in the section header table */ | 
|---|
| 48 | Elf32_Half      e_shnum;            /* 0x30  Number of entries in the section header table */ | 
|---|
| 49 | Elf32_Half      e_shstrndx;         /* 0x32  Section header table index of the string table */ | 
|---|
| 50 | } Elf32_Ehdr; | 
|---|
| 51 |  | 
|---|
| 52 | /* e_idnet - ELF Identification */ | 
|---|
| 53 | #define EI_MAG0         0               /* File identificator */ | 
|---|
| 54 | #define EI_MAG1         1               /* File identificator */ | 
|---|
| 55 | #define EI_MAG2         2               /* File identificator */ | 
|---|
| 56 | #define EI_MAG3         3               /* File identificator */ | 
|---|
| 57 | #define EI_CLASS        4               /* File class */ | 
|---|
| 58 | #define EI_DATA         5               /* Data encoding */ | 
|---|
| 59 | #define EI_VERSION      6               /* File version */ | 
|---|
| 60 | #define EI_PAD          7               /* Start of padding bytes */ | 
|---|
| 61 | /* EI_MAG[0-4] */ | 
|---|
| 62 | #define ELFMAG0         0x7f | 
|---|
| 63 | #define ELFMAG1         'E' | 
|---|
| 64 | #define ELFMAG2         'L' | 
|---|
| 65 | #define ELFMAG3         'F' | 
|---|
| 66 | #define ELFMAGICLSB     ( 0x7f        | ('E' <<  8) | ('L' << 16) | ('F' << 24)) | 
|---|
| 67 | #define ELFMAGICMSB     ((0x7f << 24) | ('E' << 16) | ('L' <<  8) |  'F'       ) | 
|---|
| 68 | /* EI_CLASS */ | 
|---|
| 69 | #define ELFCLASSNONE    0               /* Invalid class */ | 
|---|
| 70 | #define ELFCLASS32      1               /* 32-bit objects */ | 
|---|
| 71 | #define ELFCLASS64      2               /* 64-bit objects */ | 
|---|
| 72 | #define ELFCLASSNUM     3               /* ? */ | 
|---|
| 73 | /* EI_DATA */ | 
|---|
| 74 | #define ELFDATANONE     0               /* Invalid data encoding */ | 
|---|
| 75 | #define ELFDATA2LSB     1               /* Little endian encoding */ | 
|---|
| 76 | #define ELFDATA2MSB     2               /* Big endian encoding */ | 
|---|
| 77 |  | 
|---|
| 78 | /* e_type contents */ | 
|---|
| 79 | #define ET_NONE         0x0000          /* No file type */ | 
|---|
| 80 | #define ET_REL          0x0001          /* Relocatable file */ | 
|---|
| 81 | #define ET_EXEC         0x0002          /* Executable file */ | 
|---|
| 82 | #define ET_DYN          0x0003          /* Shared object file */ | 
|---|
| 83 | #define ET_CORE         0x0004          /* Core file */ | 
|---|
| 84 | #define ET_LOPROC       0xff00          /* Processor-specific - currect value? */ | 
|---|
| 85 | #define ET_HIPROC       0xffff          /* Processor-specific - currect value? */ | 
|---|
| 86 |  | 
|---|
| 87 | /* e_machine contents */ | 
|---|
| 88 | #define EM_NONE         0               /* No machine */ | 
|---|
| 89 | #define EM_M32          1               /* AT&T WE 32100 */ | 
|---|
| 90 | #define EM_SPARC        2               /* SPARC */ | 
|---|
| 91 | #define EM_386          3               /* Intel 80386 */ | 
|---|
| 92 | #define EM_68K          4               /* Motorola 680000 */ | 
|---|
| 93 | #define EM_88K          5               /* Motorola 880000 */ | 
|---|
| 94 | #define EM_486          6               /* Intel 80486 - disused? */ | 
|---|
| 95 | #define EM_860          7               /* Intel 80860 */ | 
|---|
| 96 | #define EM_MIPS         8               /* MIPS RS3000 (big endian...) */ | 
|---|
| 97 | #define EM_MIPS_RS4_BE  10              /* MIPS RS4000 (big endian) */ | 
|---|
| 98 | #define EM_SPARC64      11              /* SPARC v9 (not official) 64-bit */ | 
|---|
| 99 | #define EM_PARISC       15              /* HPPA */ | 
|---|
| 100 | #define EM_SPARC32PLUS  18              /* SUN's "v8plus" */ | 
|---|
| 101 | #define EM_PPC          20              /* PowerPC */ | 
|---|
| 102 | #define EM_ALPHA        0x9026          /* Digital Alpha - NB! Interim number */ | 
|---|
| 103 |  | 
|---|
| 104 | /* e_version contents */ | 
|---|
| 105 | #define EV_NONE         0               /* Invalid version */ | 
|---|
| 106 | #define EV_CURRENT      1               /* Current version */ | 
|---|
| 107 | #define EV_NUM          2               /* ? */ | 
|---|
| 108 |  | 
|---|
| 109 | /* e_flags - Machine Information */ | 
|---|
| 110 | #define EF_386_NONE     0               /* Intel 80386 has no flags defined */ | 
|---|
| 111 | #define EF_486_NONE     0               /* Intel 80486 has no flags defined */ | 
|---|
| 112 |  | 
|---|
| 113 |  | 
|---|
| 114 | /* | 
|---|
| 115 | * ELF Sections | 
|---|
| 116 | */ | 
|---|
| 117 | typedef struct                          /* 0x28 */ | 
|---|
| 118 | { | 
|---|
| 119 | Elf32_Word      sh_name;            /* 0x00  Section name. Index into the section header string table section. */ | 
|---|
| 120 | Elf32_Word      sh_type;            /* 0x04  Section type. Categorizes the contents and semantics. */ | 
|---|
| 121 | Elf32_Word      sh_flags;           /* 0x08  Section flags. */ | 
|---|
| 122 | Elf32_Addr      sh_addr;            /* 0x0c  Address to where in memory the section should reside.  */ | 
|---|
| 123 | Elf32_Off       sh_offset;          /* 0x10  Offset into the file of the section's data. */ | 
|---|
| 124 | Elf32_Word      sh_size;            /* 0x14  Section's size in bytes. */ | 
|---|
| 125 | Elf32_Word      sh_link;            /* 0x18  Section header table index link. */ | 
|---|
| 126 | Elf32_Word      sh_info;            /* 0x1c  Extra information. */ | 
|---|
| 127 | Elf32_Word      sh_addralign;       /* 0x20  Section alignment. */ | 
|---|
| 128 | Elf32_Word      sh_entsize;         /* 0x24  Entry size of some evtentual fixed-sized table entries. */ | 
|---|
| 129 | } Elf32_Shdr; | 
|---|
| 130 |  | 
|---|
| 131 | /* section indexes (section references) */ | 
|---|
| 132 | #define SHN_UNDEF       0               /* Undefined/missing/irrelevant/meaningless section reference. */ | 
|---|
| 133 | #define SHN_LORESERVE   0xff00          /* Lower bound of the reserved indexes. */ | 
|---|
| 134 | #define SHN_LOPROC      0xff00          /* Processor-specific semantics lower bound. */ | 
|---|
| 135 | #define SHN_HIPROC      0xff1f          /* Processor-specific semantics upper bound. */ | 
|---|
| 136 | #define SHN_ABS         0xfff1          /* Absolute values for the corresponding reference. */ | 
|---|
| 137 | #define SHN_COMMON      0xfff2          /* Symbols defined relative to this section are common symbols. */ | 
|---|
| 138 | #define SHN_HIRESERVE   0xffff          /* Upper bound of the reserved indexes. */ | 
|---|
| 139 |  | 
|---|
| 140 | /* sh_type */ | 
|---|
| 141 | #define SHT_NULL        0               /* Inactive section header. All other members have undefined contents. */ | 
|---|
| 142 | #define SHT_PROGBITS    1               /* Program defined information. */ | 
|---|
| 143 | #define SHT_SYMTAB      2               /* Symboltable. */ | 
|---|
| 144 | #define SHT_STRTAB      3               /* Stringtable. */ | 
|---|
| 145 | #define SHT_RELA        4               /* Relocations with explicit addends. */ | 
|---|
| 146 | #define SHT_HASH        5               /* Symbol has table. */ | 
|---|
| 147 | #define SHT_DYNAMIC     6               /* Dynamic linking information. */ | 
|---|
| 148 | #define SHT_NOTE        7               /* Information tat marks the file in some way. */ | 
|---|
| 149 | #define SHT_NOBITS      8               /* Occupies no space in the file. */ | 
|---|
| 150 | #define SHT_REL         9               /* Relocations. */ | 
|---|
| 151 | #define SHT_SHLIB       10              /* reserved. */ | 
|---|
| 152 | #define SHT_DYNSYM      11              /* Symboltable used for dynamic loading. */ | 
|---|
| 153 | #define SHT_NUM         12              /* ? */ | 
|---|
| 154 | #define SHT_LOPROC      0x70000000L     /* Processor-spcific semantics lower bound. */ | 
|---|
| 155 | #define SHT_HIPROC      0x7fffffffL     /* Processor-spcific semantics upper bound. */ | 
|---|
| 156 | #define SHT_LOUSER      0x80000000L     /* Application program specific lower bound. */ | 
|---|
| 157 | #define SHT_HIUSER      0xffffffffL     /* Application program specific upper bound. */ | 
|---|
| 158 |  | 
|---|
| 159 | /* sh_flags */ | 
|---|
| 160 | #define  SHF_WRITE      0x1             /* Writable during process execution. */ | 
|---|
| 161 | #define  SHF_ALLOC      0x2             /* The section occupies memory during process execution. */ | 
|---|
| 162 | #define  SHF_EXECINSTR  0x4             /* Executable machine instructs. */ | 
|---|
| 163 | #define  SHF_MASKPROC   0xf0000000L     /* Processor-specific semantics bits. */ | 
|---|
| 164 |  | 
|---|
| 165 |  | 
|---|
| 166 | /* | 
|---|
| 167 | * ELF Symbol table | 
|---|
| 168 | */ | 
|---|
| 169 | typedef struct                          /* 0x10 */ | 
|---|
| 170 | { | 
|---|
| 171 | Elf32_Word      st_name;            /* 0x00  Symbol name. (index) */ | 
|---|
| 172 | Elf32_Addr      st_value;           /* 0x04  Value associated with the symbol. */ | 
|---|
| 173 | Elf32_Word      st_size;            /* 0x08  Size associated with the symbol. */ | 
|---|
| 174 | unsigned char   st_info;            /* 0x0c  Symbol type and binding attributes. */ | 
|---|
| 175 | unsigned char   st_other;           /* 0x0d  Reserved. (currently 0?) */ | 
|---|
| 176 | Elf32_Half      st_shndx;           /* 0x0e  Section index of related section. */ | 
|---|
| 177 | } Elf32_Sym; | 
|---|
| 178 |  | 
|---|
| 179 | /* symbol table index(es) */ | 
|---|
| 180 | #define STN_UNDEF       0               /* Reserved symboltable entry. */ | 
|---|
| 181 |  | 
|---|
| 182 | /* st_info macros */ | 
|---|
| 183 | #define ELF32_ST_BIND(i)    ((i) >> 4)  /* Get the symbol binding attributes from the st_info member. */ | 
|---|
| 184 | #define ELF32_ST_TYPE(i)    ((i) & 0x0f)/* Get the symbol type from the st_info member. */ | 
|---|
| 185 | #define ELF32_ST_INFO(b,t)  ((b << 4) | (t & 0x0f)) /* Build a st_info member. */ | 
|---|
| 186 |  | 
|---|
| 187 | /* st_info - binding attributes */ | 
|---|
| 188 | #define STB_LOCAL       0x0             /* Local symbol. Not visible outside the object file. */ | 
|---|
| 189 | #define STB_GLOBAL      0x1             /* Global symbol. Visible to everyone. */ | 
|---|
| 190 | #define STB_WEAK        0x2             /* Weak symbols resemble global symbols, but their definitions have lower precedence. */ | 
|---|
| 191 | #define STB_LOPROC      0xd             /* Processor-specific semantics lower bound. */ | 
|---|
| 192 | #define STB_HIPROC      0xf             /* Processor-specific semantics upper bound. */ | 
|---|
| 193 |  | 
|---|
| 194 | /* st_info - types */ | 
|---|
| 195 | #define STT_NOTYPE      0x0             /* The symbol's type is not defined. */ | 
|---|
| 196 | #define STT_OBJECT      0x1             /* The symbol is associated with a data object, such as a variable an array, etc. */ | 
|---|
| 197 | #define STT_FUNC        0x2             /* The symbol is associated with a function or other executable code. */ | 
|---|
| 198 | #define STT_SECTION     0x3             /* The symbol is associated with a section. */ | 
|---|
| 199 | #define STT_FILE        0x4             /* Name of the source file... */ | 
|---|
| 200 | #define STT_LOPROC      0xd             /* Processor-specific semantics lower bound. */ | 
|---|
| 201 | #define STT_HIPROC      0xf             /* Processor-specific semantics upper bound. */ | 
|---|
| 202 |  | 
|---|
| 203 |  | 
|---|
| 204 | /* | 
|---|
| 205 | * ELF Relocation | 
|---|
| 206 | */ | 
|---|
| 207 | typedef struct                          /* 0x08 */ | 
|---|
| 208 | { | 
|---|
| 209 | Elf32_Addr      r_offset;           /* 0x00  Offset or virtual address. */ | 
|---|
| 210 | Elf32_Word      r_info;             /* 0x04  Symbolindex/type. */ | 
|---|
| 211 | } Elf32_Rel; | 
|---|
| 212 |  | 
|---|
| 213 | typedef struct                          /* 0x0c */ | 
|---|
| 214 | { | 
|---|
| 215 | Elf32_Addr      r_offset;           /* 0x00  Offset or virtual address. */ | 
|---|
| 216 | Elf32_Word      r_info;             /* 0x04  Symbolindex/type. */ | 
|---|
| 217 | Elf32_Sword     r_addend;           /* 0x08  Constant addend. */ | 
|---|
| 218 | } Elf32_Rela; | 
|---|
| 219 |  | 
|---|
| 220 | /* r_info macro */ | 
|---|
| 221 | #define ELF32_R_SYM(i)      ((i) >> 8)  /* Gets symbol index from the r_info member. */ | 
|---|
| 222 | #define ELF32_R_TYPE(i)     ((unsigned char)(i)) /* Get the relocation type from the r_info member. */ | 
|---|
| 223 | #define ELF32_R_INFO(s,t)   (((s) << 8) | (unsigned char)(t)) /* Makes the r_info member. */ | 
|---|
| 224 |  | 
|---|
| 225 | /* r_info - Intel 80386 relocations */ | 
|---|
| 226 | #define R_386_NONE      0               /*  */ | 
|---|
| 227 | #define R_386_32        1 | 
|---|
| 228 | #define R_386_PC32      2 | 
|---|
| 229 | #define R_386_GOT32     3 | 
|---|
| 230 | #define R_386_PLT32     4 | 
|---|
| 231 | #define R_386_COPY      5 | 
|---|
| 232 | #define R_386_GLOB_DAT  6 | 
|---|
| 233 | #define R_386_JMP_SLOT  7 | 
|---|
| 234 | #define R_386_RELATIVE  8 | 
|---|
| 235 | #define R_386_GOT_OFF   9 | 
|---|
| 236 | #define R_386_GOTPC     10 | 
|---|
| 237 | #define R_386_NUM       11 | 
|---|
| 238 |  | 
|---|
| 239 |  | 
|---|
| 240 |  | 
|---|
| 241 | /* | 
|---|
| 242 | * ELF Program Header | 
|---|
| 243 | */ | 
|---|
| 244 | typedef struct                          /* 0x20 */ | 
|---|
| 245 | { | 
|---|
| 246 | Elf32_Word      p_type;             /* 0x00  Tells what this header describes or how to interpret it. */ | 
|---|
| 247 | Elf32_Off       p_offset;           /* 0x04  Offset of the first byte of this segment. */ | 
|---|
| 248 | Elf32_Addr      p_vaddr;            /* 0x08  Virtual address of the segment. */ | 
|---|
| 249 | Elf32_Addr      p_paddr;            /* 0x0c  Physical address. Usually ignorable. */ | 
|---|
| 250 | Elf32_Word      p_filesz;           /* 0x10  Count of bytes in the file image of this segment. Zero allowed. */ | 
|---|
| 251 | Elf32_Word      p_memsz;            /* 0x14  Count of bytes in  the memory image of this segment. Zero allowed. */ | 
|---|
| 252 | Elf32_Word      p_flags;            /* 0x18  Flags relevant to the segement. */ | 
|---|
| 253 | Elf32_Word      p_align;            /* 0x1c  Alignment. 0 and 1 means no alignment. */ | 
|---|
| 254 | } Elf32_Phdr; | 
|---|
| 255 |  | 
|---|
| 256 | /* p_type - segment types */ | 
|---|
| 257 | #define PT_NULL         0               /* Unused header. */ | 
|---|
| 258 | #define PT_LOAD         1               /* Loadable segment. p_filesz, p_memsz and p_vaddr applies. */ | 
|---|
| 259 | #define PT_DYNAMIC      2               /* Dynamic linking information. */ | 
|---|
| 260 | #define PT_INTERP       3               /* Interpreter path. */ | 
|---|
| 261 | #define PT_NOTE         4               /* Auxiliary information. */ | 
|---|
| 262 | #define PT_SHLIB        5               /* Reserved. */ | 
|---|
| 263 | #define PT_PHDR         6               /* This header specifies the location and size of the program header table in file and memory. */ | 
|---|
| 264 | #define PT_LOPROC       0x70000000      /* Reserved processor-specific semantics range start. */ | 
|---|
| 265 | #define PT_HIPROC       0x7fffffff      /* Reserved processor-specific semantics range end (included). */ | 
|---|
| 266 |  | 
|---|
| 267 | /* p_flags - permission flags */ | 
|---|
| 268 | #define PF_X            1               /* Executable */ | 
|---|
| 269 | #define PF_W            2               /* Writeable */ | 
|---|
| 270 | #define PF_R            4               /* Readable */ | 
|---|
| 271 |  | 
|---|
| 272 |  | 
|---|
| 273 | /* | 
|---|
| 274 | * Dynamic Structure | 
|---|
| 275 | */ | 
|---|
| 276 | typedef struct                          /* 0x08 */ | 
|---|
| 277 | { | 
|---|
| 278 | Elf32_Sword     d_tag;              /* 0x00 Tag type. */ | 
|---|
| 279 | union | 
|---|
| 280 | { | 
|---|
| 281 | Elf32_Word  d_val;              /* 0x04 Value, interpreted according to the tag type. */ | 
|---|
| 282 | Elf32_Addr  d_ptr;              /* 0x04 Virtual address, interpreted according to the tag type. */ | 
|---|
| 283 | } d_un; | 
|---|
| 284 | } Elf32_Dyn; | 
|---|
| 285 |  | 
|---|
| 286 | /* d_tag - tag types */                 /* d_un  exe so: '-' is ignored; '+' is mandatory; '*' is optional. */ | 
|---|
| 287 | #define DT_NULL         0               /*   -    -   -   Marks the end of the dynamic array. */ | 
|---|
| 288 | #define DT_NEEDED       1               /* d_val  *   *   This element holds the string table offset of a | 
|---|
| 289 | null-terminated  string, giving the name of a needed | 
|---|
| 290 | library. The offset is an index into the table | 
|---|
| 291 | recoreded in the DT_STRTAB entry. */ | 
|---|
| 292 | #define DT_PLTRELSZ     2               /* d_val  *   *   This element holds the total size, in bytes, of the | 
|---|
| 293 | relocation entries associated with the procedure | 
|---|
| 294 | linkage table. If an entry of type DT_JMPREL is | 
|---|
| 295 | present, a DT_PLTRELSZ must accompany it. */ | 
|---|
| 296 | #define DT_PLTGOT       3               /* d_ptr  *   *    */ | 
|---|
| 297 | #define DT_HASH         4               /* d_ptr  +   +    */ | 
|---|
| 298 | #define DT_STRTAB       5               /* d_ptr  +   +   This element holds the address of the string table. | 
|---|
| 299 | Symbol names, library names, and other strings reside | 
|---|
| 300 | in this table. */ | 
|---|
| 301 | #define DT_SYMTAB       6               /* d_ptr  +   +    */ | 
|---|
| 302 | #define DT_RELA         7               /* d_ptr  +   *    */ | 
|---|
| 303 | #define DT_RELASZ       8               /* d_val  +   *    */ | 
|---|
| 304 | #define DT_RELAENT      9               /* d_val  +   *    */ | 
|---|
| 305 | #define DT_STRSZ        10              /* d_val  +   +    */ | 
|---|
| 306 | #define DT_SYMENT       11              /* d_val  +   +    */ | 
|---|
| 307 | #define DT_INIT         12              /* d_ptr  *   *   This element holds the address of the initialization function. */ | 
|---|
| 308 | #define DT_FINI         13              /* d_ptr  *   *   This element holds the address of the termination function. */ | 
|---|
| 309 | #define DT_SONAME       14              /* d_val  -   *   This element holds the string table offset of a | 
|---|
| 310 | null-terminated string, giving the name of the shared | 
|---|
| 311 | object. The offset is an index into the table recorded | 
|---|
| 312 | in the DT_STRTAB entry. */ | 
|---|
| 313 | #define DT_RPATH        15              /* d_val  +   +   This element holds the string table offset of a null-terminated | 
|---|
| 314 | search library search path string. The offset is an index int | 
|---|
| 315 | the table recorded in the DT_STRTAB entry. */ | 
|---|
| 316 | #define DT_SYMBOLIC     16              /*   -    -   *   This element's presence in a shared object library alters the | 
|---|
| 317 | dynamic linker's symbol resolution algorithm for references | 
|---|
| 318 | within the library. Instead of starting a symbol search with | 
|---|
| 319 | the executable file, the dynamic linker starts from the shared | 
|---|
| 320 | object file itself. If the shared object fails to supply the | 
|---|
| 321 | referenced symbol, the dynamic linker then searches the | 
|---|
| 322 | executable file and other shared objects as usual. */ | 
|---|
| 323 | #define DT_REL          17              /* d_ptr  +   *    */ | 
|---|
| 324 | #define DT_RELSZ        18              /* d_val  +   *    */ | 
|---|
| 325 | #define DT_RELENT       19              /* d_val  +   *    */ | 
|---|
| 326 | #define DT_PLTREL       20              /* d_val  *   *    */ | 
|---|
| 327 | #define DT_DEBUG        21              /* d_ptr  *   -    */ | 
|---|
| 328 | #define DT_TEXTREL      22              /*   -    *   *    */ | 
|---|
| 329 | #define DT_JMPREL       23              /* d_ptr  *   *    */ | 
|---|
| 330 | #define DT_LOPROC       0x70000000      /* Reserved processor-specific semantics range start. */ | 
|---|
| 331 | #define DT_HIPROC       0x7fffffff      /* Reserved processor-specific semantics range end (included). */ | 
|---|
| 332 |  | 
|---|
| 333 | #pragma pack() | 
|---|
| 334 | #endif /*_elf_h_*/ | 
|---|