/*-
* Copyright (c) 2000, 2001, 2008, 2011, David E. O'Brien
* Copyright (c) 1998 John D. Polstra.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution. *
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* $FreeBSD$
*/
/*
* ELF definitions that are independent of architecture or word size.
*/
/*
* Note header. The ".note" section contains an array of notes. Each
* begins with this header, aligned to a word boundary. Immediately
* following the note header is n_namesz bytes of name, padded to the
* next word boundary. Then comes n_descsz bytes of descriptor, again
* padded to a word boundary. The values of n_namesz and n_descsz do
* not include the padding.
*/
typedef struct {
/*
* Option kinds.
*/
#
define ODK_PAD 3 /* section padding */#
define ODK_FILL 5 /* fill value used by the linker */#
define ODK_TAGS 6 /* reserved space for tools */#
define ODK_HWAND 7 /* hardware AND patch applied */#
define ODK_HWOR 8 /* hardware OR patch applied */
/*
* ODK_EXCEPTIONS info field masks.
*/
#
define OEX_FPU_MIN 0x0000001f /* min FPU exception required */#
define OEX_FPU_MAX 0x00001f00 /* max FPU exception allowed */#
define OEX_PAGE0 0x00010000 /* page zero must be mapped */#
define OEX_SMM 0x00020000 /* run in sequential memory mode */#
define OEX_PRECISEFP 0x00040000 /* run in precise FP exception mode */#
define OEX_DISMISS 0x00080000 /* dismiss invalid address traps */
/*
* ODK_PAD info field masks.
*/
/*
* ODK_HWPATCH info field masks.
*/
#
define OHW_R4KEOP 0x00000001 /* patch for R4000 branch at end-of-page bug */#
define OHW_R8KPFETCH 0x00000002 /* R8000 prefetch bug may occur */#
define OHW_R5KEOP 0x00000004 /* patch for R5000 branch at end-of-page bug */#
define OHW_R5KCVTL 0x00000008 /* R5000 cvt.[ds].l bug: clean == 1 */#
define OHW_R10KLDL 0x00000010UL /* need patch for R10000 misaligned load */
/*
*/
#
define OHWA0_R4KEOP_CLEAN 0x00000002 /* object verified clean for R4000 end-of-page bug */#
define OHWO0_FIXADE 0x00000001 /* object requires call to fixade */
/*
*/
#
define OGP_GROUP 0x0000ffff /* GP group number */#
define OGP_SELF 0x00010000 /* GP group is self-contained */
/*
* The header for GNU-style hash sections.
*/
typedef struct {
/* Indexes into the e_ident array. Keep synced with
#
define EI_MAG0 0
/* Magic number, byte 0. */#
define EI_MAG1 1 /* Magic number, byte 1. */#
define EI_MAG2 2 /* Magic number, byte 2. */#
define EI_MAG3 3 /* Magic number, byte 3. */#
define EI_CLASS 4 /* Class of machine. */#
define EI_DATA 5 /* Data format. */#
define EI_OSABI 7 /* Operating system / ABI identification */#
define OLD_EI_BRAND 8 /* Start of architecture identification. */#
define EI_PAD 9 /* Start of padding (per SVR4 ABI). */#
define EI_NIDENT 16 /* Size of e_ident array. */
/* Values for the magic number bytes. */
#
define ELFMAG "\177ELF" /* magic string */#
define SELFMAG 4 /* magic string size */
/* Values for e_ident[EI_VERSION] and e_version. */
/* Values for e_ident[EI_CLASS]. */
/* Values for e_ident[EI_DATA]. */
#
define ELFDATA2LSB 1 /* 2's complement little-endian. */
/* Values for e_ident[EI_OSABI]. */
/* e_ident */
/* Values for e_type. */
#
define ET_NONE 0
/* Unknown type. */#
define ET_REL 1 /* Relocatable. */#
define ET_EXEC 2 /* Executable. */#
define ET_DYN 3 /* Shared object. */#
define ET_LOOS 0xfe00 /* First operating system specific. */#
define ET_HIOS 0xfeff /* Last operating system-specific. */#
define ET_LOPROC 0xff00 /* First processor-specific. */#
define ET_HIPROC 0xffff /* Last processor-specific. */
/* Values for e_machine. */
#
define EM_NONE 0
/* Unknown machine. */#
define EM_M32 1 /* AT&T WE32100. */#
define EM_386 3 /* Intel i386. */#
define EM_68K 4 /* Motorola 68000. */#
define EM_88K 5 /* Motorola 88000. */#
define EM_860 7 /* Intel i860. */#
define EM_MIPS 8 /* MIPS R3000 Big-Endian only. */#
define EM_S370 9 /* IBM System/370. */#
define EM_960 19 /* Intel 80960. */#
define EM_PPC 20 /* PowerPC 32-bit. */#
define EM_PPC64 21 /* PowerPC 64-bit. */#
define EM_S390 22 /* IBM System/390. */#
define EM_FR20 37 /* Fujitsu FR20. */#
define EM_RH32 38 /* TRW RH-32. */#
define EM_RCE 39 /* Motorola RCE. */#
define EM_SH 42 /* Hitachi SH. */#
define EM_TRICORE 44 /* Siemens TriCore embedded processor. */#
define EM_ARC 45 /* Argonaut RISC Core. */#
define EM_H8S 48 /* Hitachi H8S. */#
define EM_IA_64 50 /* Intel IA-64 Processor. */#
define EM_MMA 54 /* Fujitsu MMA. */#
define EM_PCP 55 /* Siemens PCP. */#
define EM_NCPU 56 /* Sony nCPU. */#
define EM_NDR1 57 /* Denso NDR1 microprocessor. */#
define EM_STARCORE 58 /* Motorola Star*Core processor. */#
define EM_ME16 59 /* Toyota ME16 processor. */#
define EM_ST100 60 /* STMicroelectronics ST100 processor. */#
define EM_TINYJ 61 /* Advanced Logic Corp. TinyJ processor. */#
define EM_X86_64 62 /* Advanced Micro Devices x86-64 */#
define EM_PDSP 63 /* Sony DSP Processor. */#
define EM_FX66 66 /* Siemens FX66 microcontroller. */#
define EM_ST9PLUS 67 /* STMicroelectronics ST9+ 8/16 microcontroller. */
#
define EM_ST7 68 /* STmicroelectronics ST7 8-bit microcontroller. */
#
define EM_68HC16 69 /* Motorola MC68HC16 microcontroller. */#
define EM_68HC11 70 /* Motorola MC68HC11 microcontroller. */#
define EM_68HC08 71 /* Motorola MC68HC08 microcontroller. */#
define EM_68HC05 72 /* Motorola MC68HC05 microcontroller. */#
define EM_SVX 73 /* Silicon Graphics SVx. */#
define EM_ST19 74 /* STMicroelectronics ST19 8-bit mc. */#
define EM_VAX 75 /* Digital VAX. */#
define EM_CRIS 76 /* Axis Communications 32-bit embedded processor. */
#
define EM_JAVELIN 77 /* Infineon Technologies 32-bit embedded processor. */
#
define EM_FIREPATH 78 /* Element 14 64-bit DSP Processor. */#
define EM_ZSP 79 /* LSI Logic 16-bit DSP Processor. */#
define EM_MMIX 80 /* Donald Knuth's educational 64-bit proc. */#
define EM_HUANY 81 /* Harvard University machine-independent object files. */
#
define EM_AVR 83 /* Atmel AVR 8-bit microcontroller. */#
define EM_FR30 84 /* Fujitsu FR30. */#
define EM_D10V 85 /* Mitsubishi D10V. */#
define EM_D30V 86 /* Mitsubishi D30V. */#
define EM_M32R 88 /* Mitsubishi M32R. */#
define EM_PJ 91 /* picoJava. */#
define EM_OPENRISC 92 /* OpenRISC 32-bit embedded processor. */#
define EM_ARC_A5 93 /* ARC Cores Tangent-A5. */#
define EM_XTENSA 94 /* Tensilica Xtensa Architecture. */#
define EM_VIDEOCORE 95 /* Alphamosaic VideoCore processor. */#
define EM_TMM_GPP 96 /* Thompson Multimedia General Purpose Processor. */
#
define EM_NS32K 97 /* National Semiconductor 32000 series. */#
define EM_TPC 98 /* Tenor Network TPC processor. */#
define EM_SNP1K 99 /* Trebia SNP 1000 processor. */#
define EM_ST200 100 /* STMicroelectronics ST200 microcontroller. */#
define EM_IP2K 101 /* Ubicom IP2xxx microcontroller family. */#
define EM_MAX 102 /* MAX Processor. */#
define EM_CR 103 /* National Semiconductor CompactRISC microprocessor. */
#
define EM_MSP430 105 /* Texas Instruments embedded microcontroller msp430. */
#
define EM_BLACKFIN 106 /* Analog Devices Blackfin (DSP) processor. */#
define EM_SE_C33 107 /* S1C33 Family of Seiko Epson processors. */#
define EM_SEP 108 /* Sharp embedded microprocessor. */#
define EM_ARCA 109 /* Arca RISC Microprocessor. */#
define EM_UNICORE 110 /* Microprocessor series from PKU-Unity Ltd. and MPRC of Peking University */
/* Non-standard or deprecated. */
#
define EM_486 6 /* Intel i486. */#
define EM_ALPHA_STD 41 /* Digital Alpha (standard value). */#
define EM_ALPHA 0x9026 /* Alpha (written in the absence of an ABI) */
/**
* e_flags
*/
#
define EF_MIPS_CPIC 0x00000004 /* STD PIC calling sequence */
/* Special section indexes. */
#
define SHN_UNDEF 0
/* Undefined, missing, irrelevant. */#
define SHN_LOPROC 0xff00 /* First processor-specific. */#
define SHN_HIPROC 0xff1f /* Last processor-specific. */#
define SHN_LOOS 0xff20 /* First operating system-specific. */ linker only: Cached global in local
symtab. */
#
define SHN_HIOS 0xff3f /* Last operating system-specific. */#
define SHN_ABS 0xfff1 /* Absolute values. */#
define SHN_XINDEX 0xffff /* Escape -- index stored elsewhere. */
/* sh_type */
#
define SHT_RELA 4 /* relocation section with addends */#
define SHT_HASH 5 /* symbol hash table section */#
define SHT_REL 9 /* relocation section - no addends */#
define SHT_SHLIB 10 /* reserved - purpose unknown */#
define SHT_DYNSYM 11 /* dynamic symbol table section */#
define SHT_LOOS 0x60000000 /* First of OS specific semantics */#
define SHT_HIOS 0x6fffffff /* Last of OS specific semantics */#
define SHT_LOPROC 0x70000000 /* reserved range for processor */
pre-emption map. */
attributes. */
#
define SHT_HIPROC 0x7fffffff /* specific section header types */#
define SHT_LOUSER 0x80000000 /* reserved range for application */#
define SHT_HIUSER 0xffffffff /* specific indexes */
/* Flags for sh_flags. */
#
define SHF_WRITE 0x1 /* Section contains writable data. */#
define SHF_ALLOC 0x2 /* Section occupies memory. */#
define SHF_MERGE 0x10 /* Section may be merged. */#
define SHF_STRINGS 0x20 /* Section contains strings. */#
define SHF_GROUP 0x200 /* Member of section group. */#
define SHF_TLS 0x400 /* Section contains TLS data. */#
define SHF_MASKOS 0x0ff00000 /* OS-specific semantics. */#
define SHF_MASKPROC 0xf0000000 /* Processor-specific semantics. */
/* Flags for section groups. */
/*
* Flags / mask for .gnu.versym sections.
*/
/* Values for p_type. */
#
define PT_NULL 0
/* Unused entry. */#
define PT_LOAD 1 /* Loadable segment. */#
define PT_DYNAMIC 2 /* Dynamic linking information segment. */#
define PT_INTERP 3 /* Pathname of interpreter. */#
define PT_NOTE 4 /* Auxiliary information. */#
define PT_SHLIB 5 /* Reserved (not used). */#
define PT_PHDR 6 /* Location of program header itself. */#
define PT_TLS 7 /* Thread local storage segment */#
define PT_LOOS 0x60000000 /* First OS-specific. */ (currently arm). */
#
define PT_SUNWBSS 0x6ffffffa /* Sun Specific segment */#
define PT_SUNWSTACK 0x6ffffffb /* describes the stack segment */#
define PT_HIOS 0x6fffffff /* Last OS-specific. */#
define PT_LOPROC 0x70000000 /* First processor-specific type. */#
define PT_HIPROC 0x7fffffff /* Last processor-specific type. */
/* Values for p_flags. */
#
define PF_X 0x1 /* Executable. */#
define PF_W 0x2 /* Writable. */#
define PF_R 0x4 /* Readable. */#
define PF_MASKOS 0x0ff00000 /* Operating system-specific. */#
define PF_MASKPROC 0xf0000000 /* Processor-specific. */
/* Extended program header index. */
/* Values for d_tag. */
#
define DT_NULL 0
/* Terminating entry. */#
define DT_NEEDED 1 /* String table offset of a needed shared library. */
#
define DT_PLTRELSZ 2 /* Total size in bytes of PLT relocations. */#
define DT_PLTGOT 3 /* Processor-dependent address. */#
define DT_HASH 4 /* Address of symbol hash table. */#
define DT_STRTAB 5 /* Address of string table. */#
define DT_SYMTAB 6 /* Address of symbol table. */#
define DT_RELA 7 /* Address of ElfNN_Rela relocations. */#
define DT_RELASZ 8 /* Total size of ElfNN_Rela relocations. */#
define DT_RELAENT 9 /* Size of each ElfNN_Rela relocation entry. */#
define DT_STRSZ 10 /* Size of string table. */#
define DT_SYMENT 11 /* Size of each symbol table entry. */#
define DT_INIT 12 /* Address of initialization function. */#
define DT_FINI 13 /* Address of finalization function. */#
define DT_SONAME 14 /* String table offset of shared object name. */
#
define DT_RPATH 15 /* String table offset of library path. [sup] */#
define DT_SYMBOLIC 16 /* Indicates "symbolic" linking. [sup] */#
define DT_REL 17 /* Address of ElfNN_Rel relocations. */#
define DT_RELSZ 18 /* Total size of ElfNN_Rel relocations. */#
define DT_RELENT 19 /* Size of each ElfNN_Rel relocation. */#
define DT_PLTREL 20 /* Type of relocation used for PLT. */#
define DT_DEBUG 21 /* Reserved (not used). */#
define DT_TEXTREL 22 /* Indicates there may be relocations in non-writable segments. [sup] */
#
define DT_JMPREL 23 /* Address of PLT relocations. */ initialization functions */
termination functions */
initialization functions. */
termination functions. */
#
define DT_RUNPATH 29 /* String table offset of a null-terminated library search path string. */
#
define DT_FLAGS 30 /* Object specific flag values. */#
define DT_ENCODING 32 /* Values greater than or equal to DT_ENCODING and less than DT_LOOS follow the rules for
the interpretation of the d_un union
as follows: even == 'd_ptr', odd == 'd_val'
or none */
pre-initialization functions. */
pre-initialization functions. */
#
define DT_LOOS 0x6000000d /* First OS-specific */#
define DT_HIOS 0x6ffff000 /* Last OS-specific */
/*
* DT_* entries which fall between DT_VALRNGHI & DT_VALRNGLO use the
* Dyn.d_un.d_val field of the Elf*_Dyn structure.
*/
#
define DT_MOVEENT 0x6ffffdfa /* move table entry size */#
define DT_MOVESZ 0x6ffffdfb /* move table size */#
define DT_FEATURE 0x6ffffdfc /* feature holder */#
define DT_POSFLAG_1 0x6ffffdfd /* flags for DT_* entries, effecting */ /* the following DT_* entry. */
/* See DF_P1_* definitions */
#
define DT_SYMINSZ 0x6ffffdfe /* syminfo table size (in bytes) */#
define DT_SYMINENT 0x6ffffdff /* syminfo entry size (in bytes) */
/*
* DT_* entries which fall between DT_ADDRRNGHI & DT_ADDRRNGLO use the
* Dyn.d_un.d_ptr field of the Elf*_Dyn structure.
*
* If any adjustment is made to the ELF object after it has been
* built, these entries will need to be adjusted.
*/
#
define DT_GNU_HASH 0x6ffffef5 /* GNU-style hash table */#
define DT_CONFIG 0x6ffffefa /* configuration information */#
define DT_DEPAUDIT 0x6ffffefb /* dependency auditing */#
define DT_AUDIT 0x6ffffefc /* object auditing */#
define DT_PLTPAD 0x6ffffefd /* pltpadding (sparcv9) */
#
define DT_VERSYM 0x6ffffff0 /* Address of versym section. */#
define DT_RELACOUNT 0x6ffffff9 /* number of RELATIVE relocations */#
define DT_RELCOUNT 0x6ffffffa /* number of RELATIVE relocations */#
define DT_FLAGS_1 0x6ffffffb /* state flags - see DF_1_* defs */#
define DT_VERDEF 0x6ffffffc /* Address of verdef section. */#
define DT_VERDEFNUM 0x6ffffffd /* Number of elems in verdef section */#
define DT_VERNEED 0x6ffffffe /* Address of verneed section. */#
define DT_VERNEEDNUM 0x6fffffff /* Number of elems in verneed section */
#
define DT_LOPROC 0x70000000 /* First processor-specific type. */
#
define DT_AUXILIARY 0x7ffffffd /* shared library auxiliary name */#
define DT_USED 0x7ffffffe /* ignored - same as needed */#
define DT_FILTER 0x7fffffff /* shared library filter name */#
define DT_HIPROC 0x7fffffff /* Last processor-specific type. */
/* Values for DT_FLAGS */
#
define DF_ORIGIN 0x0001 /* Indicates that the object being loaded may make reference to the $ORIGIN substitution
string */
#
define DF_SYMBOLIC 0x0002 /* Indicates "symbolic" linking. */#
define DF_TEXTREL 0x0004 /* Indicates there may be relocations in non-writable segments. */
#
define DF_BIND_NOW 0x0008 /* Indicates that the dynamic linker should process all relocations for the object
containing this entry before transferring
control to the program. */
#
define DF_STATIC_TLS 0x0010 /* Indicates that the shared object or executable contains code using a static
thread-local storage scheme. */
/* Values for DT_FLAGS_1 */
#
define DF_1_GLOBAL 0x00000002 /* Set the RTLD_GLOBAL for object */#
define DF_1_NODELETE 0x00000008 /* Set the RTLD_NODELETE for object */#
define DF_1_LOADFLTR 0x00000010 /* Immediate loading of filtees */#
define DF_1_NOOPEN 0x00000040 /* Do not allow loading on dlopen() */#
define DF_1_INTERPOSE 0x00000400 /* Interpose all objects but main */#
define DF_1_NODEFLIB 0x00000800 /* Do not search default paths */
/* Values for l_flags. */
/* Values for n_type used in executables. */
/* Values for n_type. Used in core files. */
#
define NT_THRMISC 7 /* Thread miscellaneous info. */
/* Symbol Binding - ELFNN_ST_BIND - st_info */
#
define STB_WEAK 2 /* like global - lower precedence */#
define STB_LOOS 10 /* Start of operating system reserved range. */#
define STB_HIOS 12 /* End of operating system reserved range. */#
define STB_LOPROC 13 /* reserved range for processor */
/* Symbol type - ELFNN_ST_TYPE - st_info */
#
define STT_COMMON 5 /* Uninitialized common block. */#
define STT_TLS 6 /* TLS object. */#
define STT_LOOS 10 /* Reserved range for operating system */#
define STT_HIOS 12 /* specific semantics. */#
define STT_LOPROC 13 /* Start of processor reserved range. */#
define STT_HIPROC 15 /* End of processor reserved range. */
/* Symbol visibility - ELFNN_ST_VISIBILITY - st_other */
#
define STV_DEFAULT 0x0 /* Default visibility (see binding). */#
define STV_INTERNAL 0x1 /* Special meaning in relocatable objects. */
/* Special symbol table indexes. */
#
define STN_UNDEF 0
/* Undefined symbol index. */
/* Symbol versioning flags. */
#
define VER_NDX(x) ((x) & ~(
1u <<
15))
#
define CA_SUNW_HW_1 1 /* first hardware capabilities entry */#
define CA_SUNW_SF_1 2 /* first software capabilities entry */
/*
* Syminfo flag values
*/
/* to object containing defn. */
/* lazily-loaded */
/* object containing defn. */
/* directly bind to this symbol */
/*
*/
/*
* Syminfo version values.
*/
/*
* Relocation types.
*
* All machine architectures are defined here to allow tools on one to
* handle others.
*/
#
define R_386_32 1 /* Add symbol value. */#
define R_386_PC32 2 /* Add PC-relative symbol value. */#
define R_386_GOT32 3 /* Add PC-relative GOT offset. */#
define R_386_PLT32 4 /* Add PC-relative PLT offset. */#
define R_386_COPY 5 /* Copy data from shared object. */#
define R_386_GOTOFF 9 /* Add GOT-relative symbol address. */#
define R_386_GOTPC 10 /* Add PC-relative GOT table address. */#
define R_386_TLS_IE 15 /* Absolute address of GOT for -ve static TLS */#
define R_386_TLS_LE 17 /* Negative offset relative to static TLS */#
define R_386_TLS_GD 18 /* 32 bit offset to GOT (index,off) pair */#
define R_386_TLS_LDM 19 /* 32 bit offset to GOT (index,zero) pair */#
define R_386_TLS_IE_32 33 /* 32 bit offset to GOT static TLS offset entry */
/* TLS relocations */
#
define R_ARM_COPY 20 /* Copy data from shared object. */#
define R_ARM_GOTOFF 24 /* Add GOT-relative symbol address. */#
define R_ARM_GOTPC 25 /* Add PC-relative GOT table address. */#
define R_ARM_GOT32 26 /* Add PC-relative GOT offset. */#
define R_ARM_PLT32 27 /* Add PC-relative PLT offset. */
/* Name Value Field Calculation */
#
define R_MIPS_26 4 /* Direct 26 bit shifted */
/*
* 64-bit relocations
*/
/*
* TLS relocations
*/
/*
* The remaining relocs are from the Embedded ELF ABI, and are not in the
* SVR4 ELF ABI.
*/
/*
* RISC-V relocation types.
*/
/* Relocation types used by the dynamic linker. */
/* Relocation types not used by the dynamic linker. */
#
define R_X86_64_PC32 2 /* PC-relative 32 bit signed sym value. */#
define R_X86_64_32 10 /* Add 32 bit zero extended symbol value */#
define R_X86_64_32S 11 /* Add 32 bit sign extended symbol value */#
define R_X86_64_16 12 /* Add 16 bit zero extended symbol value */#
define R_X86_64_PC16 13 /* Add 16 bit signed extended pc relative symbol value */#
define R_X86_64_8 14 /* Add 8 bit zero extended symbol value */#
define R_X86_64_PC8 15 /* Add 8 bit signed extended pc relative symbol value */#
define R_X86_64_PC64 24 /* PC-relative 64 bit signed sym value. */
#endif /* !_SYS_ELF_COMMON_H_ */