/** @file
Ported ELF include files from FreeBSD
Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
**/
/*-
* 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.
*
*/
/*
* 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 {
/* 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 */
/* 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) */
/* 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. */#
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 */#
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. */
/* 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. */#
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. */
terminationfunctions. */
#
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', even == '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_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_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 n_type. Used in core files. */
/* Symbol Binding - ELFNN_ST_BIND - st_info */
#
define STB_WEAK 2 /* like global - lower precedence */#
define STB_LOOS 10 /* Reserved range for operating system */#
define STB_HIOS 12 /* specific semantics. */#
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 /* reserved range for processor */
/* 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 */
#
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. */
// Block of PC-relative relocations added to work around gcc putting
// object relocations in static executables.
/* Name Value Field Calculation */
/*
* TLS relocations
*/
/*
* The remaining relocs are from the Embedded ELF ABI, and are not in the
* SVR4 ELF ABI.
*/
#
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 */
#endif /* !_SYS_ELF_COMMON_H_ */