1#ifndef DYNAMIC_TAG 2#error "DYNAMIC_TAG must be defined" 3#endif 4 5// Add separate macros for the architecture specific tags and the markers 6// such as DT_HIOS, etc. to allow using this file to in other contexts. 7// For example we can use it to generate a stringification switch statement. 8 9#ifndef AARCH64_DYNAMIC_TAG 10#define AARCH64_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value) 11#define AARCH64_DYNAMIC_TAG_DEFINED 12#endif 13 14#ifndef HEXAGON_DYNAMIC_TAG 15#define HEXAGON_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value) 16#define HEXAGON_DYNAMIC_TAG_DEFINED 17#endif 18 19#ifndef MIPS_DYNAMIC_TAG 20#define MIPS_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value) 21#define MIPS_DYNAMIC_TAG_DEFINED 22#endif 23 24#ifndef PPC_DYNAMIC_TAG 25#define PPC_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value) 26#define PPC_DYNAMIC_TAG_DEFINED 27#endif 28 29#ifndef PPC64_DYNAMIC_TAG 30#define PPC64_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value) 31#define PPC64_DYNAMIC_TAG_DEFINED 32#endif 33 34#ifndef RISCV_DYNAMIC_TAG 35#define RISCV_DYNAMIC_TAG(name, value) DYNAMIC_TAG(name, value) 36#define RISCV_DYNAMIC_TAG_DEFINED 37#endif 38 39#ifndef DYNAMIC_TAG_MARKER 40#define DYNAMIC_TAG_MARKER(name, value) DYNAMIC_TAG(name, value) 41#define DYNAMIC_TAG_MARKER_DEFINED 42#endif 43 44DYNAMIC_TAG(NULL, 0) // Marks end of dynamic array. 45DYNAMIC_TAG(NEEDED, 1) // String table offset of needed library. 46DYNAMIC_TAG(PLTRELSZ, 2) // Size of relocation entries in PLT. 47DYNAMIC_TAG(PLTGOT, 3) // Address associated with linkage table. 48DYNAMIC_TAG(HASH, 4) // Address of symbolic hash table. 49DYNAMIC_TAG(STRTAB, 5) // Address of dynamic string table. 50DYNAMIC_TAG(SYMTAB, 6) // Address of dynamic symbol table. 51DYNAMIC_TAG(RELA, 7) // Address of relocation table (Rela entries). 52DYNAMIC_TAG(RELASZ, 8) // Size of Rela relocation table. 53DYNAMIC_TAG(RELAENT, 9) // Size of a Rela relocation entry. 54DYNAMIC_TAG(STRSZ, 10) // Total size of the string table. 55DYNAMIC_TAG(SYMENT, 11) // Size of a symbol table entry. 56DYNAMIC_TAG(INIT, 12) // Address of initialization function. 57DYNAMIC_TAG(FINI, 13) // Address of termination function. 58DYNAMIC_TAG(SONAME, 14) // String table offset of a shared objects name. 59DYNAMIC_TAG(RPATH, 15) // String table offset of library search path. 60DYNAMIC_TAG(SYMBOLIC, 16) // Changes symbol resolution algorithm. 61DYNAMIC_TAG(REL, 17) // Address of relocation table (Rel entries). 62DYNAMIC_TAG(RELSZ, 18) // Size of Rel relocation table. 63DYNAMIC_TAG(RELENT, 19) // Size of a Rel relocation entry. 64DYNAMIC_TAG(PLTREL, 20) // Type of relocation entry used for linking. 65DYNAMIC_TAG(DEBUG, 21) // Reserved for debugger. 66DYNAMIC_TAG(TEXTREL, 22) // Relocations exist for non-writable segments. 67DYNAMIC_TAG(JMPREL, 23) // Address of relocations associated with PLT. 68DYNAMIC_TAG(BIND_NOW, 24) // Process all relocations before execution. 69DYNAMIC_TAG(INIT_ARRAY, 25) // Pointer to array of initialization functions. 70DYNAMIC_TAG(FINI_ARRAY, 26) // Pointer to array of termination functions. 71DYNAMIC_TAG(INIT_ARRAYSZ, 27) // Size of DT_INIT_ARRAY. 72DYNAMIC_TAG(FINI_ARRAYSZ, 28) // Size of DT_FINI_ARRAY. 73DYNAMIC_TAG(RUNPATH, 29) // String table offset of lib search path. 74DYNAMIC_TAG(FLAGS, 30) // Flags. 75DYNAMIC_TAG_MARKER(ENCODING, 32) // Values from here to DT_LOOS follow the rules 76 // for the interpretation of the d_un union. 77 78DYNAMIC_TAG(PREINIT_ARRAY, 32) // Pointer to array of preinit functions. 79DYNAMIC_TAG(PREINIT_ARRAYSZ, 33) // Size of the DT_PREINIT_ARRAY array. 80 81DYNAMIC_TAG(SYMTAB_SHNDX, 34) // Address of the SHT_SYMTAB_SHNDX section. 82 83// Experimental support for SHT_RELR sections. For details, see proposal 84// at https://groups.google.com/forum/#!topic/generic-abi/bX460iggiKg 85DYNAMIC_TAG(RELRSZ, 35) // Size of Relr relocation table. 86DYNAMIC_TAG(RELR, 36) // Address of relocation table (Relr entries). 87DYNAMIC_TAG(RELRENT, 37) // Size of a Relr relocation entry. 88 89// TODO: Experimental CREL relocations. LLVM will change the value and 90// break compatibility in the future. 91DYNAMIC_TAG(CREL, 0x40000026) // CREL relocation table 92 93DYNAMIC_TAG_MARKER(LOOS, 0x60000000) // Start of environment specific tags. 94DYNAMIC_TAG_MARKER(HIOS, 0x6FFFFFFF) // End of environment specific tags. 95DYNAMIC_TAG_MARKER(LOPROC, 0x70000000) // Start of processor specific tags. 96DYNAMIC_TAG_MARKER(HIPROC, 0x7FFFFFFF) // End of processor specific tags. 97 98// Android packed relocation section tags. 99// https://android.googlesource.com/platform/bionic/+/6f12bfece5dcc01325e0abba56a46b1bcf991c69/tools/relocation_packer/src/elf_file.cc#31 100DYNAMIC_TAG(ANDROID_REL, 0x6000000F) 101DYNAMIC_TAG(ANDROID_RELSZ, 0x60000010) 102DYNAMIC_TAG(ANDROID_RELA, 0x60000011) 103DYNAMIC_TAG(ANDROID_RELASZ, 0x60000012) 104 105// Android's experimental support for SHT_RELR sections. 106// https://android.googlesource.com/platform/bionic/+/b7feec74547f84559a1467aca02708ff61346d2a/libc/include/elf.h#253 107DYNAMIC_TAG(ANDROID_RELR, 0x6FFFE000) // Address of relocation table (Relr entries). 108DYNAMIC_TAG(ANDROID_RELRSZ, 0x6FFFE001) // Size of Relr relocation table. 109DYNAMIC_TAG(ANDROID_RELRENT, 0x6FFFE003) // Size of a Relr relocation entry. 110 111DYNAMIC_TAG(GNU_HASH, 0x6FFFFEF5) // Reference to the GNU hash table. 112DYNAMIC_TAG(TLSDESC_PLT, 0x6FFFFEF6) // Location of PLT entry for TLS 113 // descriptor resolver calls. 114DYNAMIC_TAG(TLSDESC_GOT, 0x6FFFFEF7) // Location of GOT entry used by TLS 115 // descriptor resolver PLT entry. 116DYNAMIC_TAG(RELACOUNT, 0x6FFFFFF9) // ELF32_Rela count. 117DYNAMIC_TAG(RELCOUNT, 0x6FFFFFFA) // ELF32_Rel count. 118 119DYNAMIC_TAG(FLAGS_1, 0X6FFFFFFB) // Flags_1. 120 121DYNAMIC_TAG(VERSYM, 0x6FFFFFF0) // The address of .gnu.version section. 122DYNAMIC_TAG(VERDEF, 0X6FFFFFFC) // The address of the version definition 123 // table. 124DYNAMIC_TAG(VERDEFNUM, 0X6FFFFFFD) // The number of entries in DT_VERDEF. 125DYNAMIC_TAG(VERNEED, 0X6FFFFFFE) // The address of the version dependency 126 // table. 127DYNAMIC_TAG(VERNEEDNUM, 0X6FFFFFFF) // The number of entries in DT_VERNEED. 128 129// AArch64 specific dynamic table entries 130AARCH64_DYNAMIC_TAG(AARCH64_BTI_PLT, 0x70000001) 131AARCH64_DYNAMIC_TAG(AARCH64_PAC_PLT, 0x70000003) 132AARCH64_DYNAMIC_TAG(AARCH64_VARIANT_PCS, 0x70000005) 133AARCH64_DYNAMIC_TAG(AARCH64_MEMTAG_MODE, 0x70000009) 134AARCH64_DYNAMIC_TAG(AARCH64_MEMTAG_HEAP, 0x7000000b) 135AARCH64_DYNAMIC_TAG(AARCH64_MEMTAG_STACK, 0x7000000c) 136AARCH64_DYNAMIC_TAG(AARCH64_MEMTAG_GLOBALS, 0x7000000d) 137AARCH64_DYNAMIC_TAG(AARCH64_MEMTAG_GLOBALSSZ, 0x7000000f) 138 139// AArch64 specific dynamic table entries for RELR auth relocations as described here: 140// https://github.com/ARM-software/abi-aa/blob/main/pauthabielf64/pauthabielf64.rst#dynamic-section 141AARCH64_DYNAMIC_TAG(AARCH64_AUTH_RELRSZ, 0x70000011) 142AARCH64_DYNAMIC_TAG(AARCH64_AUTH_RELR, 0x70000012) 143AARCH64_DYNAMIC_TAG(AARCH64_AUTH_RELRENT, 0x70000013) 144 145// Hexagon specific dynamic table entries 146HEXAGON_DYNAMIC_TAG(HEXAGON_SYMSZ, 0x70000000) 147HEXAGON_DYNAMIC_TAG(HEXAGON_VER, 0x70000001) 148HEXAGON_DYNAMIC_TAG(HEXAGON_PLT, 0x70000002) 149 150// Mips specific dynamic table entry tags. 151 152MIPS_DYNAMIC_TAG(MIPS_RLD_VERSION, 0x70000001) // 32 bit version number for 153 // runtime linker interface. 154MIPS_DYNAMIC_TAG(MIPS_TIME_STAMP, 0x70000002) // Time stamp. 155MIPS_DYNAMIC_TAG(MIPS_ICHECKSUM, 0x70000003) // Checksum of external strings 156 // and common sizes. 157MIPS_DYNAMIC_TAG(MIPS_IVERSION, 0x70000004) // Index of version string 158 // in string table. 159MIPS_DYNAMIC_TAG(MIPS_FLAGS, 0x70000005) // 32 bits of flags. 160MIPS_DYNAMIC_TAG(MIPS_BASE_ADDRESS, 0x70000006) // Base address of the segment. 161MIPS_DYNAMIC_TAG(MIPS_MSYM, 0x70000007) // Address of .msym section. 162MIPS_DYNAMIC_TAG(MIPS_CONFLICT, 0x70000008) // Address of .conflict section. 163MIPS_DYNAMIC_TAG(MIPS_LIBLIST, 0x70000009) // Address of .liblist section. 164MIPS_DYNAMIC_TAG(MIPS_LOCAL_GOTNO, 0x7000000a) // Number of local global offset 165 // table entries. 166MIPS_DYNAMIC_TAG(MIPS_CONFLICTNO, 0x7000000b) // Number of entries 167 // in the .conflict section. 168MIPS_DYNAMIC_TAG(MIPS_LIBLISTNO, 0x70000010) // Number of entries 169 // in the .liblist section. 170MIPS_DYNAMIC_TAG(MIPS_SYMTABNO, 0x70000011) // Number of entries 171 // in the .dynsym section. 172MIPS_DYNAMIC_TAG(MIPS_UNREFEXTNO, 0x70000012) // Index of first external dynamic 173 // symbol not referenced locally. 174MIPS_DYNAMIC_TAG(MIPS_GOTSYM, 0x70000013) // Index of first dynamic symbol 175 // in global offset table. 176MIPS_DYNAMIC_TAG(MIPS_HIPAGENO, 0x70000014) // Number of page table entries 177 // in global offset table. 178MIPS_DYNAMIC_TAG(MIPS_RLD_MAP, 0x70000016) // Address of run time loader map 179 // used for debugging. 180MIPS_DYNAMIC_TAG(MIPS_DELTA_CLASS, 0x70000017) // Delta C++ class definition. 181MIPS_DYNAMIC_TAG(MIPS_DELTA_CLASS_NO, 0x70000018) // Number of entries 182 // in DT_MIPS_DELTA_CLASS. 183MIPS_DYNAMIC_TAG(MIPS_DELTA_INSTANCE, 0x70000019) // Delta C++ class instances. 184MIPS_DYNAMIC_TAG(MIPS_DELTA_INSTANCE_NO, 0x7000001A) // Number of entries 185 // in DT_MIPS_DELTA_INSTANCE. 186MIPS_DYNAMIC_TAG(MIPS_DELTA_RELOC, 0x7000001B) // Delta relocations. 187MIPS_DYNAMIC_TAG(MIPS_DELTA_RELOC_NO, 0x7000001C) // Number of entries 188 // in DT_MIPS_DELTA_RELOC. 189MIPS_DYNAMIC_TAG(MIPS_DELTA_SYM, 0x7000001D) // Delta symbols that Delta 190 // relocations refer to. 191MIPS_DYNAMIC_TAG(MIPS_DELTA_SYM_NO, 0x7000001E) // Number of entries 192 // in DT_MIPS_DELTA_SYM. 193MIPS_DYNAMIC_TAG(MIPS_DELTA_CLASSSYM, 0x70000020) // Delta symbols that hold 194 // class declarations. 195MIPS_DYNAMIC_TAG(MIPS_DELTA_CLASSSYM_NO, 0x70000021) // Number of entries 196 // in DT_MIPS_DELTA_CLASSSYM. 197 198MIPS_DYNAMIC_TAG(MIPS_CXX_FLAGS, 0x70000022) // Flags indicating information 199 // about C++ flavor. 200MIPS_DYNAMIC_TAG(MIPS_PIXIE_INIT, 0x70000023) // Pixie information. 201MIPS_DYNAMIC_TAG(MIPS_SYMBOL_LIB, 0x70000024) // Address of .MIPS.symlib 202MIPS_DYNAMIC_TAG(MIPS_LOCALPAGE_GOTIDX, 0x70000025) // The GOT index of the first PTE 203 // for a segment 204MIPS_DYNAMIC_TAG(MIPS_LOCAL_GOTIDX, 0x70000026) // The GOT index of the first PTE 205 // for a local symbol 206MIPS_DYNAMIC_TAG(MIPS_HIDDEN_GOTIDX, 0x70000027) // The GOT index of the first PTE 207 // for a hidden symbol 208MIPS_DYNAMIC_TAG(MIPS_PROTECTED_GOTIDX, 0x70000028) // The GOT index of the first PTE 209 // for a protected symbol 210MIPS_DYNAMIC_TAG(MIPS_OPTIONS, 0x70000029) // Address of `.MIPS.options'. 211MIPS_DYNAMIC_TAG(MIPS_INTERFACE, 0x7000002A) // Address of `.interface'. 212MIPS_DYNAMIC_TAG(MIPS_DYNSTR_ALIGN, 0x7000002B) // Unknown. 213MIPS_DYNAMIC_TAG(MIPS_INTERFACE_SIZE, 0x7000002C) // Size of the .interface section. 214MIPS_DYNAMIC_TAG(MIPS_RLD_TEXT_RESOLVE_ADDR, 0x7000002D) // Size of rld_text_resolve 215 // function stored in the GOT. 216MIPS_DYNAMIC_TAG(MIPS_PERF_SUFFIX, 0x7000002E) // Default suffix of DSO to be added 217 // by rld on dlopen() calls. 218MIPS_DYNAMIC_TAG(MIPS_COMPACT_SIZE, 0x7000002F) // Size of compact relocation 219 // section (O32). 220MIPS_DYNAMIC_TAG(MIPS_GP_VALUE, 0x70000030) // GP value for auxiliary GOTs. 221MIPS_DYNAMIC_TAG(MIPS_AUX_DYNAMIC, 0x70000031) // Address of auxiliary .dynamic. 222MIPS_DYNAMIC_TAG(MIPS_PLTGOT, 0x70000032) // Address of the base of the PLTGOT. 223MIPS_DYNAMIC_TAG(MIPS_RWPLT, 0x70000034) // Points to the base 224 // of a writable PLT. 225MIPS_DYNAMIC_TAG(MIPS_RLD_MAP_REL, 0x70000035) // Relative offset of run time loader 226 // map, used for debugging. 227MIPS_DYNAMIC_TAG(MIPS_XHASH, 0x70000036) // GNU-style hash table with xlat. 228 229// PPC specific dynamic table entries. 230PPC_DYNAMIC_TAG(PPC_GOT, 0x70000000) // Uses Secure PLT ABI. 231PPC_DYNAMIC_TAG(PPC_OPT, 0x70000001) // Has TLS optimization. 232 233// PPC64 specific dynamic table entries. 234PPC64_DYNAMIC_TAG(PPC64_GLINK, 0x70000000) // Address of 32 bytes before the 235 // first glink lazy resolver stub. 236PPC64_DYNAMIC_TAG(PPC64_OPT, 0x70000003) // Flags to control optimizations 237 // for TLS and multiple TOCs. 238 239// RISC-V specific dynamic array tags. 240RISCV_DYNAMIC_TAG(RISCV_VARIANT_CC, 0x70000001) 241 242// Sun machine-independent extensions. 243DYNAMIC_TAG(AUXILIARY, 0x7FFFFFFD) // Shared object to load before self 244DYNAMIC_TAG(USED, 0x7FFFFFFE) // Same as DT_NEEDED 245DYNAMIC_TAG(FILTER, 0x7FFFFFFF) // Shared object to get values from 246 247 248#ifdef DYNAMIC_TAG_MARKER_DEFINED 249#undef DYNAMIC_TAG_MARKER 250#undef DYNAMIC_TAG_MARKER_DEFINED 251#endif 252#ifdef AARCH64_DYNAMIC_TAG_DEFINED 253#undef AARCH64_DYNAMIC_TAG 254#undef AARCH64_DYNAMIC_TAG_DEFINED 255#endif 256#ifdef MIPS_DYNAMIC_TAG_DEFINED 257#undef MIPS_DYNAMIC_TAG 258#undef MIPS_DYNAMIC_TAG_DEFINED 259#endif 260#ifdef HEXAGON_DYNAMIC_TAG_DEFINED 261#undef HEXAGON_DYNAMIC_TAG 262#undef HEXAGON_DYNAMIC_TAG_DEFINED 263#endif 264#ifdef PPC_DYNAMIC_TAG_DEFINED 265#undef PPC_DYNAMIC_TAG 266#undef PPC_DYNAMIC_TAG_DEFINED 267#endif 268#ifdef PPC64_DYNAMIC_TAG_DEFINED 269#undef PPC64_DYNAMIC_TAG 270#undef PPC64_DYNAMIC_TAG_DEFINED 271#endif 272#ifdef RISCV_DYNAMIC_TAG_DEFINED 273#undef RISCV_DYNAMIC_TAG 274#undef RISCV_DYNAMIC_TAG_DEFINED 275#endif 276