1/* 2 * Copyright 2001, Travis Geiselbrecht. All rights reserved. 3 * Distributed under the terms of the NewOS License. 4 * 5 * Copyright 2002-2011, Haiku Inc. All Rights Reserved. 6 * Distributed under the terms of the MIT license. 7 */ 8#ifndef _ELF_COMMON_H 9#define _ELF_COMMON_H 10 11 12#include <SupportDefs.h> 13#include <ByteOrder.h> 14 15#include <arch_elf.h> 16 17 18/*** ELF header ***/ 19 20#define EI_NIDENT 16 21 22#define ELF_MAGIC "\x7f""ELF" 23 24// e_ident[] indices 25#define EI_MAG0 0 26#define EI_MAG1 1 27#define EI_MAG2 2 28#define EI_MAG3 3 29#define EI_CLASS 4 30#define EI_DATA 5 31#define EI_VERSION 6 32#define EI_OSABI 7 33#define EI_ABIVERSION 8 34#define EI_PAD 9 35 36// e_machine (Architecture) 37#define EM_NONE 0 // No machine 38#define EM_M32 1 // AT&T WE 32100 39#define EM_SPARC 2 // Sparc 40#define EM_386 3 // Intel 80386 41#define EM_68K 4 // Motorola m68k family 42#define EM_88K 5 // Motorola m88k family 43#define EM_486 6 // Intel 80486, Reserved for future use 44#define EM_860 7 // Intel 80860 45#define EM_MIPS 8 // MIPS R3000 (officially, big-endian only) 46#define EM_S370 9 // IBM System/370 47#define EM_MIPS_RS3_LE 10 // MIPS R3000 little-endian, Deprecated 48#define EM_PARISC 15 // HPPA 49#define EM_VPP550 17 // Fujitsu VPP500 50#define EM_SPARC32PLUS 18 // Sun "v8plus" 51#define EM_960 19 // Intel 80960 52#define EM_PPC 20 // PowerPC 53#define EM_PPC64 21 // 64-bit PowerPC 54#define EM_S390 22 // IBM S/390 55#define EM_V800 36 // NEC V800 series 56#define EM_FR20 37 // Fujitsu FR20 57#define EM_RH32 38 // TRW RH32 58#define EM_MCORE 39 // Motorola M*Core 59#define EM_RCE 39 // Old name for MCore 60#define EM_ARM 40 // ARM 61#define EM_OLD_ALPHA 41 // Digital Alpha 62#define EM_SH 42 // Renesas / SuperH SH 63#define EM_SPARCV9 43 // SPARC v9 64-bit 64#define EM_TRICORE 44 // Siemens Tricore embedded processor 65#define EM_ARC 45 // ARC Cores 66#define EM_H8_300 46 // Renesas H8/300 67#define EM_H8_300H 47 // Renesas H8/300H 68#define EM_H8S 48 // Renesas H8S 69#define EM_H8_500 49 // Renesas H8/500 70#define EM_IA_64 50 // Intel IA-64 Processor 71#define EM_MIPS_X 51 // Stanford MIPS-X 72#define EM_COLDFIRE 52 // Motorola Coldfire 73#define EM_68HC12 53 // Motorola M68HC12 74#define EM_MMA 54 // Fujitsu Multimedia Accelerator 75#define EM_PCP 55 // Siemens PCP 76#define EM_NCPU 56 // Sony nCPU embedded RISC processor 77#define EM_NDR1 57 // Denso NDR1 microprocesspr 78#define EM_STARCORE 58 // Motorola Star*Core processor 79#define EM_ME16 59 // Toyota ME16 processor 80#define EM_ST100 60 // STMicroelectronics ST100 processor 81#define EM_TINYJ 61 // Advanced Logic Corp. TinyJ embedded processor 82#define EM_X86_64 62 // Advanced Micro Devices X86-64 processor 83 84// elf version (EI_VERSION) 85#define EV_NONE 0 86#define EV_CURRENT 1 87 88// architecture class (EI_CLASS) 89#define ELFCLASSNONE 0 90#define ELFCLASS32 1 91#define ELFCLASS64 2 92 93// endian (EI_DATA) 94#define ELFDATANONE 0 /* unknown data format */ 95#define ELFDATA2LSB 1 /* little endian */ 96#define ELFDATA2MSB 2 /* big endian */ 97 98// abis (EI_OSABI) 99#define ELFOSABI_NONE 0 // UNIX System V ABI 100#define ELFOSABI_HPUX 1 // HP-UX operating system 101#define ELFOSABI_NETBSD 2 // NetBSD 102#define ELFOSABI_LINUX 3 // GNU/Linux 103#define ELFOSABI_HURD 4 // GNU/Hurd 104#define ELFOSABI_86OPEN 5 // 86Open common IA32 ABI 105#define ELFOSABI_SOLARIS 6 // Solaris 106#define ELFOSABI_AIX 7 // AIX 107#define ELFOSABI_IRIX 8 // IRIX 108#define ELFOSABI_FREEBSD 9 // FreeBSD 109#define ELFOSABI_TRU64 10 // TRU64 UNIX 110#define ELFOSABI_MODESTO 11 // Novell Modesto 111#define ELFOSABI_OPENBSD 12 // OpenBSD 112#define ELFOSABI_OPENVMS 13 // Open VMS 113#define ELFOSABI_NSK 14 // HP Non-Stop Kernel 114#define ELFOSABI_AROS 15 // Amiga Research OS 115#define ELFOSABI_ARM 97 // ARM 116#define ELFOSABI_STANDALONE 255 // Standalone (embedded) application 117 118#define ELFOSABI_SYSV ELFOSABI_NONE // symbol used in 1998 ELF spec 119#define ELFOSABI_HAIKU ELFOSABI_NONE // FATELF_TODO: Evaluate new OSABI 120 121/*** section header ***/ 122 123// special section indices 124#define SHN_UNDEF 0 125#define SHN_LORESERVE 0xff00 126#define SHN_LOPROC 0xff00 127#define SHN_HIPROC 0xff1f 128#define SHN_ABS 0xfff1 129#define SHN_COMMON 0xfff2 130#define SHN_HIRESERVE 0xffff 131 132// section header type 133#define SHT_NULL 0 134#define SHT_PROGBITS 1 135#define SHT_SYMTAB 2 136#define SHT_STRTAB 3 137#define SHT_RELA 4 138#define SHT_HASH 5 139#define SHT_DYNAMIC 6 140#define SHT_NOTE 7 141#define SHT_NOBITS 8 142#define SHT_REL 9 143#define SHT_SHLIB 10 144#define SHT_DYNSYM 11 145 146#define SHT_GNU_verdef 0x6ffffffd /* version definition section */ 147#define SHT_GNU_verneed 0x6ffffffe /* version needs section */ 148#define SHT_GNU_versym 0x6fffffff /* version symbol table */ 149 150#define SHT_LOPROC 0x70000000 151#define SHT_HIPROC 0x7fffffff 152#define SHT_LOUSER 0x80000000 153#define SHT_HIUSER 0xffffffff 154 155// section header flags 156#define SHF_WRITE 1 157#define SHF_ALLOC 2 158#define SHF_EXECINSTR 4 159 160#define SHF_MASKPROC 0xf0000000 161 162 163/*** program header ***/ 164 165// program header segment types 166#define PT_NULL 0 167#define PT_LOAD 1 168#define PT_DYNAMIC 2 169#define PT_INTERP 3 170#define PT_NOTE 4 171#define PT_SHLIB 5 172#define PT_PHDR 6 173#define PT_STACK 0x6474e551 174 175#define PT_LOPROC 0x70000000 176#define PT_HIPROC 0x7fffffff 177 178// program header segment flags 179#define PF_EXECUTE 0x1 180#define PF_WRITE 0x2 181#define PF_READ 0x4 182#define PF_PROTECTION_MASK (PF_EXECUTE | PF_WRITE | PF_READ) 183 184#define PF_MASKPROC 0xf0000000 185 186#define STT_NOTYPE 0 187#define STT_OBJECT 1 188#define STT_FUNC 2 189#define STT_SECTION 3 190#define STT_FILE 4 191#define STT_LOPROC 13 192#define STT_HIPROC 15 193 194#define STB_LOCAL 0 195#define STB_GLOBAL 1 196#define STB_WEAK 2 197#define STB_LOPROC 13 198#define STB_HIPROC 15 199 200#define STN_UNDEF 0 201 202 203#define DT_NULL 0 204#define DT_NEEDED 1 205#define DT_PLTRELSZ 2 206#define DT_PLTGOT 3 207#define DT_HASH 4 208#define DT_STRTAB 5 209#define DT_SYMTAB 6 210#define DT_RELA 7 211#define DT_RELASZ 8 212#define DT_RELAENT 9 213#define DT_STRSZ 10 214#define DT_SYMENT 11 215#define DT_INIT 12 216#define DT_FINI 13 217#define DT_SONAME 14 218#define DT_RPATH 15 219#define DT_SYMBOLIC 16 220#define DT_REL 17 221#define DT_RELSZ 18 222#define DT_RELENT 19 223#define DT_PLTREL 20 224#define DT_DEBUG 21 225#define DT_TEXTREL 22 226#define DT_JMPREL 23 227#define DT_BIND_NOW 24 /* no lazy binding */ 228#define DT_INIT_ARRAY 25 /* init function array */ 229#define DT_FINI_ARRAY 26 /* termination function array */ 230#define DT_INIT_ARRAYSZ 27 /* init function array size */ 231#define DT_FINI_ARRAYSZ 28 /* termination function array size */ 232#define DT_RUNPATH 29 /* library search path (supersedes DT_RPATH) */ 233#define DT_FLAGS 30 /* flags (see below) */ 234#define DT_ENCODING 32 235#define DT_PREINIT_ARRAY 32 /* preinitialization array */ 236#define DT_PREINIT_ARRAYSZ 33 /* preinitialization array size */ 237 238#define DT_VERSYM 0x6ffffff0 /* symbol version table */ 239#define DT_VERDEF 0x6ffffffc /* version definition table */ 240#define DT_VERDEFNUM 0x6ffffffd /* number of version definitions */ 241#define DT_VERNEED 0x6ffffffe /* table with needed versions */ 242#define DT_VERNEEDNUM 0x6fffffff /* number of needed versions */ 243 244#define DT_LOPROC 0x70000000 245#define DT_HIPROC 0x7fffffff 246 247 248/* DT_FLAGS values */ 249#define DF_ORIGIN 0x01 250#define DF_SYMBOLIC 0x02 251#define DF_TEXTREL 0x04 252#define DF_BIND_NOW 0x08 253#define DF_STATIC_TLS 0x10 254 255 256/* version definition section */ 257 258/* values for vd_version (version revision) */ 259#define VER_DEF_NONE 0 /* no version */ 260#define VER_DEF_CURRENT 1 /* current version */ 261#define VER_DEF_NUM 2 /* given version number */ 262 263/* values for vd_flags (version information flags) */ 264#define VER_FLG_BASE 0x1 /* version definition of file itself */ 265#define VER_FLG_WEAK 0x2 /* weak version identifier */ 266 267/* values for versym symbol index */ 268#define VER_NDX_LOCAL 0 /* symbol is local */ 269#define VER_NDX_GLOBAL 1 /* symbol is global/unversioned */ 270#define VER_NDX_INITIAL 2 /* initial version -- that's the one given 271 to symbols when a library becomes 272 versioned; handled by the linker (and 273 runtime loader) similar to 274 VER_NDX_GLOBAL */ 275#define VER_NDX_LORESERVE 0xff00 /* beginning of reserved entries */ 276#define VER_NDX_ELIMINATE 0xff01 /* symbol is to be eliminated */ 277 278#define VER_NDX_FLAG_HIDDEN 0x8000 /* flag: version is hidden */ 279#define VER_NDX_MASK 0x7fff /* mask to get the actual version index */ 280#define VER_NDX(x) ((x) & VER_NDX_MASK) 281 282 283/* version dependency section */ 284 285/* values for vn_version (version revision) */ 286#define VER_NEED_NONE 0 /* no version */ 287#define VER_NEED_CURRENT 1 /* current version */ 288#define VER_NEED_NUM 2 /* given version number */ 289 290 291/* auxiliary needed version information */ 292 293/* values for vna_flags */ 294#define VER_FLG_WEAK 0x2 /* weak version identifier */ 295 296 297// Determine the correct ELF types to use for the architecture 298 299#if B_HAIKU_64_BIT 300# define _ELF_TYPE(type) Elf64_##type 301#else 302# define _ELF_TYPE(type) Elf32_##type 303#endif 304#define DEFINE_ELF_TYPE(type, name) \ 305 struct _ELF_TYPE(type); \ 306 typedef struct _ELF_TYPE(type) name 307 308DEFINE_ELF_TYPE(Ehdr, elf_ehdr); 309DEFINE_ELF_TYPE(Phdr, elf_phdr); 310DEFINE_ELF_TYPE(Shdr, elf_shdr); 311DEFINE_ELF_TYPE(Sym, elf_sym); 312DEFINE_ELF_TYPE(Dyn, elf_dyn); 313DEFINE_ELF_TYPE(Rel, elf_rel); 314DEFINE_ELF_TYPE(Rela, elf_rela); 315DEFINE_ELF_TYPE(Verdef, elf_verdef); 316DEFINE_ELF_TYPE(Verdaux, elf_verdaux); 317DEFINE_ELF_TYPE(Verneed, elf_verneed); 318DEFINE_ELF_TYPE(Vernaux, elf_vernaux); 319 320#undef DEFINE_ELF_TYPE 321#undef _ELF_TYPE 322 323typedef uint16 elf_versym; 324 325#if B_HAIKU_64_BIT 326# define ELF_CLASS ELFCLASS64 327#else 328# define ELF_CLASS ELFCLASS32 329#endif 330 331#if B_HOST_IS_LENDIAN 332# define ELF_DATA ELFDATA2LSB 333#else 334# define ELF_DATA ELFDATA2MSB 335#endif 336 337// Generic image architecture description 338struct elf_image_arch { 339 uint16_t machine; /* maps to e_machine. */ 340 uint8_t osabi; /* maps to e_ident[EI_OSABI]. */ 341 uint8_t osabi_version; /* maps to e_ident[EI_ABIVERSION]. */ 342 uint8_t word_size; /* maps to e_ident[EI_CLASS]. */ 343 uint8_t byte_order; /* maps to e_ident[EI_DATA]. */ 344}; 345 346#endif /* _ELF_COMMON_H_ */ 347