ELF.h revision b676d9815dc7ce3a14d655322f307f335708155b
1551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer//===-- llvm/Support/ELF.h - ELF constants and data structures --*- C++ -*-===// 263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman// 36c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// The LLVM Compiler Infrastructure 46c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman// 86c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke//===----------------------------------------------------------------------===// 96c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// 106c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// This header contains common, non-processor-specific data structures and 116c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// constants for the ELF file format. 1263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman// 139a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson// The details of the ELF32 bits in this file are largely based on the Tool 149a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson// Interface Standard (TIS) Executable and Linking Format (ELF) Specification 159a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson// Version 1.2, May 1995. The ELF64 stuff is based on ELF-64 Object File Format 169a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson// Version 1.5, Draft 2, May 1998 as well as OpenBSD header files. 176c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// 186c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke//===----------------------------------------------------------------------===// 196c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 20551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#ifndef LLVM_SUPPORT_ELF_H 21551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#define LLVM_SUPPORT_ELF_H 22551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer 238b67f774e9c38b7718b2b300b628388f966df4e0Chandler Carruth#include "llvm/System/DataTypes.h" 246c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include <cstring> 256c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 266c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekenamespace llvm { 276c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 286c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekenamespace ELF { 296c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 306c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeketypedef uint32_t Elf32_Addr; // Program address 316c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeketypedef uint16_t Elf32_Half; 326c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeketypedef uint32_t Elf32_Off; // File offset 336c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeketypedef int32_t Elf32_Sword; 346c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeketypedef uint32_t Elf32_Word; 356c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 36620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeketypedef uint64_t Elf64_Addr; 37620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeketypedef uint64_t Elf64_Off; 38620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeketypedef int32_t Elf64_Shalf; 39620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeketypedef int32_t Elf64_Sword; 40620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeketypedef uint32_t Elf64_Word; 41620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeketypedef int64_t Elf64_Sxword; 42620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeketypedef uint64_t Elf64_Xword; 43620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeketypedef uint32_t Elf64_Half; 44620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeketypedef uint16_t Elf64_Quarter; 45620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke 466c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Object file magic string. 47757c1f9d87b516a1e3bc4cd678245b207ae9c559Brian Gaekestatic const char ElfMagic[] = { 0x7f, 'E', 'L', 'F', '\0' }; 486c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 499a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson// e_ident size and indices. 509a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilsonenum { 519a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson EI_MAG0 = 0, // File identification index. 529a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson EI_MAG1 = 1, // File identification index. 539a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson EI_MAG2 = 2, // File identification index. 549a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson EI_MAG3 = 3, // File identification index. 559a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson EI_CLASS = 4, // File class. 569a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson EI_DATA = 5, // Data encoding. 579a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson EI_VERSION = 6, // File version. 589a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson EI_OSABI = 7, // OS/ABI identification. 599a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson EI_ABIVERSION = 8, // ABI version. 609a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson EI_PAD = 9, // Start of padding bytes. 619a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson EI_NIDENT = 16 // Number of bytes in e_ident. 629a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson}; 639a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson 646c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekestruct Elf32_Ehdr { 659a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson unsigned char e_ident[EI_NIDENT]; // ELF Identification bytes 666c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Half e_type; // Type of file (see ET_* below) 676c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Half e_machine; // Required architecture for this file (see EM_*) 686c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word e_version; // Must be equal to 1 696c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Addr e_entry; // Address to jump to in order to start program 706c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Off e_phoff; // Program header table's file offset, in bytes 716c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Off e_shoff; // Section header table's file offset, in bytes 726c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word e_flags; // Processor-specific flags 736c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Half e_ehsize; // Size of ELF header, in bytes 746c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Half e_phentsize; // Size of an entry in the program header table 756c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Half e_phnum; // Number of entries in the program header table 766c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Half e_shentsize; // Size of an entry in the section header table 776c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Half e_shnum; // Number of entries in the section header table 786c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Half e_shstrndx; // Sect hdr table index of sect name string table 79fe4591bfc2b147c10d6a7b1a5af56454fb78daceStephen Wilson bool checkMagic() const { 80314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson return (memcmp(e_ident, ElfMagic, strlen(ElfMagic))) == 0; 816c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke } 829a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson unsigned char getFileClass() const { return e_ident[EI_CLASS]; } 839a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson unsigned char getDataEncoding() const { return e_ident[EI_DATA]; } 846c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 856c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 86620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke// 64-bit ELF header. Fields are the same as for ELF32, but with different 87620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke// types (see above). 88e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaekestruct Elf64_Ehdr { 899a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson unsigned char e_ident[EI_NIDENT]; 90620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Quarter e_type; 91620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Quarter e_machine; 92620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Half e_version; 93620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Addr e_entry; 94620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Off e_phoff; 95620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Off e_shoff; 96620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Half e_flags; 97620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Quarter e_ehsize; 98620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Quarter e_phentsize; 99620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Quarter e_phnum; 100620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Quarter e_shentsize; 101620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Quarter e_shnum; 102620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Quarter e_shstrndx; 1039a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson bool checkMagic() const { 1049a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson return (memcmp(e_ident, ElfMagic, strlen(ElfMagic))) == 0; 1059a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson } 1069a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson unsigned char getFileClass() const { return e_ident[EI_CLASS]; } 1079a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson unsigned char getDataEncoding() const { return e_ident[EI_DATA]; } 108e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaeke}; 109620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke 1106c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// File types 1116c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeenum { 1126c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ET_NONE = 0, // No file type 1136c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ET_REL = 1, // Relocatable file 1146c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ET_EXEC = 2, // Executable file 1156c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ET_DYN = 3, // Shared object file 1166c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ET_CORE = 4, // Core file 1176c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ET_LOPROC = 0xff00, // Beginning of processor-specific codes 1186c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ET_HIPROC = 0xffff // Processor-specific 1196c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 1206c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 1215af8f421b6412e52530608097e39d2602195629fDan Gohman// Versioning 1225af8f421b6412e52530608097e39d2602195629fDan Gohmanenum { 1235af8f421b6412e52530608097e39d2602195629fDan Gohman EV_NONE = 0, 1245af8f421b6412e52530608097e39d2602195629fDan Gohman EV_CURRENT = 1 1255af8f421b6412e52530608097e39d2602195629fDan Gohman}; 1265af8f421b6412e52530608097e39d2602195629fDan Gohman 1276c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Machine architectures 1286c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeenum { 1296c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke EM_NONE = 0, // No machine 1306c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke EM_M32 = 1, // AT&T WE 32100 1316c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke EM_SPARC = 2, // SPARC 1326c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke EM_386 = 3, // Intel 386 1336c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke EM_68K = 4, // Motorola 68000 1346c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke EM_88K = 5, // Motorola 88000 135620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke EM_486 = 6, // Intel 486 (deprecated) 1366c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke EM_860 = 7, // Intel 80860 137620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke EM_MIPS = 8, // MIPS R3000 138620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke EM_PPC = 20, // PowerPC 1399a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson EM_PPC64 = 21, // PowerPC64 140620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke EM_ARM = 40, // ARM 141620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke EM_ALPHA = 41, // DEC Alpha 142cc5fc60468a1915049ef19a549fe4a6ae8708a00Bruno Cardoso Lopes EM_SPARCV9 = 43, // SPARC V9 143cc5fc60468a1915049ef19a549fe4a6ae8708a00Bruno Cardoso Lopes EM_X86_64 = 62 // AMD64 1446c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 1456c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 1466c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Object file classes. 1476c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeenum { 1486c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ELFCLASS32 = 1, // 32-bit object file 1496c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ELFCLASS64 = 2 // 64-bit object file 1506c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 1516c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 1526c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Object file byte orderings. 1536c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeenum { 1549a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson ELFDATANONE = 0, // Invalid data encoding. 1556c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ELFDATA2LSB = 1, // Little-endian object file 1566c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ELFDATA2MSB = 2 // Big-endian object file 1576c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 1586c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 159e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming// OS ABI identification. 1605af8f421b6412e52530608097e39d2602195629fDan Gohmanenum { 161e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_NONE = 0, // UNIX System V ABI 162e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_HPUX = 1, // HP-UX operating system 163e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_NETBSD = 2, // NetBSD 164e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_LINUX = 3, // GNU/Linux 165e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_HURD = 4, // GNU/Hurd 166e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_SOLARIS = 6, // Solaris 167e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_AIX = 7, // AIX 168e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_IRIX = 8, // IRIX 169e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_FREEBSD = 9, // FreeBSD 170e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_TRU64 = 10, // TRU64 UNIX 171e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_MODESTO = 11, // Novell Modesto 172e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_OPENBSD = 12, // OpenBSD 173e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_OPENVMS = 13, // OpenVMS 174e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_NSK = 14, // Hewlett-Packard Non-Stop Kernel 175e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_AROS = 15, // AROS 176e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_FENIXOS = 16, // FenixOS 177e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_C6000_ELFABI = 64, // Bare-metal TMS320C6000 178e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_C6000_LINUX = 65, // Linux TMS320C6000 179e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_ARM = 97, // ARM 180e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_STANDALONE = 255 // Standalone (embedded) application 1815af8f421b6412e52530608097e39d2602195629fDan Gohman}; 1825af8f421b6412e52530608097e39d2602195629fDan Gohman 183004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming// X86_64 relocations. 184004c82ad7c0d2da761726f063373c28ffd18e66dMatt Flemingenum { 185004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_NONE = 0, 186004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_64 = 1, 187004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_PC32 = 2, 188004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_GOT32 = 3, 189004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_PLT32 = 4, 190004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_COPY = 5, 191004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_GLOB_DAT = 6, 192004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_JUMP_SLOT = 7, 193004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_RELATIVE = 8, 194004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_GOTPCREL = 9, 195004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_32 = 10, 196004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_32S = 11, 197004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_16 = 12, 198004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_PC16 = 13, 199004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_8 = 14, 200004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_PC8 = 15, 201004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_DTPMOD64 = 16, 202004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_DTPOFF64 = 17, 203004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_TPOFF64 = 18, 204004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_TLSGD = 19, 205004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_TLSLD = 20, 206004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_DTPOFF32 = 21, 207004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_GOTTPOFF = 22, 208004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_TPOFF32 = 23, 209004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_PC64 = 24, 210004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_GOTOFF64 = 25, 211004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_GOTPC32 = 26, 212004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_SIZE32 = 32, 213004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_SIZE64 = 33, 214004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_GOTPC32_TLSDESC = 34, 215004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_TLSDESC_CALL = 35, 216004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming R_X86_64_TLSDESC = 36 217004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming}; 218004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming 2196c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Section header. 2206c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekestruct Elf32_Shdr { 2216c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word sh_name; // Section name (index into string table) 2226c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word sh_type; // Section type (SHT_*) 2236c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word sh_flags; // Section flags (SHF_*) 2246c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Addr sh_addr; // Address where section is to be loaded 2256c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Off sh_offset; // File offset of section data, in bytes 2266c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word sh_size; // Size of section, in bytes 22763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman Elf32_Word sh_link; // Section type-specific header table index link 2286c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word sh_info; // Section type-specific extra information 2296c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word sh_addralign; // Section address alignment 2306c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word sh_entsize; // Size of records contained within the section 2316c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 2326c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 233620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke// Section header for ELF64 - same fields as ELF32, different types. 234e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaekestruct Elf64_Shdr { 235620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Half sh_name; 236620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Half sh_type; 237620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Xword sh_flags; 238620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Addr sh_addr; 239620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Off sh_offset; 240620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Xword sh_size; 241620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Half sh_link; 242620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Half sh_info; 243620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Xword sh_addralign; 244620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Xword sh_entsize; 245e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaeke}; 246620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke 2476c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Special section indices. 2486c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeenum { 2496c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHN_UNDEF = 0, // Undefined, missing, irrelevant, or meaningless 2506c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHN_LORESERVE = 0xff00, // Lowest reserved index 2516c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHN_LOPROC = 0xff00, // Lowest processor-specific index 2526c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHN_HIPROC = 0xff1f, // Highest processor-specific index 2536c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHN_ABS = 0xfff1, // Symbol has absolute value; does not need relocation 2546c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHN_COMMON = 0xfff2, // FORTRAN COMMON or C external global variables 2556c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHN_HIRESERVE = 0xffff // Highest reserved index 2566c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 2576c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 2586c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Section types. 2596c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeenum { 260b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_NULL = 0, // No associated section (inactive entry). 261b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_PROGBITS = 1, // Program-defined contents. 262b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_SYMTAB = 2, // Symbol table. 263b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_STRTAB = 3, // String table. 264b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_RELA = 4, // Relocation entries; explicit addends. 265b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_HASH = 5, // Symbol hash table. 266b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_DYNAMIC = 6, // Information for dynamic linking. 267b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_NOTE = 7, // Information about the file. 268b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_NOBITS = 8, // Data occupies no space in the file. 269b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_REL = 9, // Relocation entries; no explicit addends. 270b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_SHLIB = 10, // Reserved. 271b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_DYNSYM = 11, // Symbol table. 272b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_INIT_ARRAY = 14, // Pointers to initialisation functions. 273b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_FINI_ARRAY = 15, // Pointers to termination functions. 274b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_PREINIT_ARRAY = 16, // Pointers to pre-init functions. 275b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_GROUP = 17, // Section group. 276b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_SYMTAB_SHNDX = 18, // Indicies for SHN_XINDEX entries. 277b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_LOOS = 0x60000000, // Lowest operating system-specific type. 278b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_HIOS = 0x6fffffff, // Highest operating system-specific type. 279b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_LOPROC = 0x70000000, // Lowest processor architecture-specific type. 280b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_HIPROC = 0x7fffffff, // Highest processor architecture-specific type. 281b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_LOUSER = 0x80000000, // Lowest type reserved for applications. 282b676d9815dc7ce3a14d655322f307f335708155bMatt Fleming SHT_HIUSER = 0xffffffff // Highest type reserved for applications. 2836c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 2846c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 2856c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Section flags. 2866c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeenum { 2876c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHF_WRITE = 0x1, // Section data should be writable during execution. 2886c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHF_ALLOC = 0x2, // Section occupies memory during program execution. 2896c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHF_EXECINSTR = 0x4, // Section contains executable machine instructions. 2906c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHF_MASKPROC = 0xf0000000 // Bits indicating processor-specific flags. 2916c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 2926c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 2939a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson// Symbol table entries for ELF32. 2946c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekestruct Elf32_Sym { 2956c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word st_name; // Symbol name (index into string table) 2966c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Addr st_value; // Value or address associated with the symbol 2976c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word st_size; // Size of the symbol 2986c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke unsigned char st_info; // Symbol's type and binding attributes 2996c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke unsigned char st_other; // Must be zero; reserved 3006c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Half st_shndx; // Which section (header table index) it's defined in 30163b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman 3026c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke // These accessors and mutators correspond to the ELF32_ST_BIND, 3036c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke // ELF32_ST_TYPE, and ELF32_ST_INFO macros defined in the ELF specification: 304314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson unsigned char getBinding() const { return st_info >> 4; } 305314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson unsigned char getType() const { return st_info & 0x0f; } 306314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson void setBinding(unsigned char b) { setBindingAndType(b, getType()); } 307314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson void setType(unsigned char t) { setBindingAndType(getBinding(), t); } 308314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson void setBindingAndType(unsigned char b, unsigned char t) { 3096c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke st_info = (b << 4) + (t & 0x0f); 3106c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke } 3116c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 3126c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 3139a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson// Symbol table entries for ELF64. 3149a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilsonstruct Elf64_Sym { 3159a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson Elf64_Word st_name; // Symbol name (index into string table) 3169a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson unsigned char st_info; // Symbol's type and binding attributes 3179a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson unsigned char st_other; // Must be zero; reserved 3189a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson Elf64_Half st_shndx; // Which section (header table index) it's defined in 3199a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson Elf64_Addr st_value; // Value or address associated with the symbol 3209a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson Elf64_Xword st_size; // Size of the symbol 3219a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson 3229a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson // These accessors and mutators are identical to those defined for ELF32 3239a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson // symbol table entries. 3249a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson unsigned char getBinding() const { return st_info >> 4; } 3259a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson unsigned char getType() const { return st_info & 0x0f; } 3269a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson void setBinding(unsigned char b) { setBindingAndType(b, getType()); } 3279a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson void setType(unsigned char t) { setBindingAndType(getBinding(), t); } 3289a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson void setBindingAndType(unsigned char b, unsigned char t) { 3299a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson st_info = (b << 4) + (t & 0x0f); 3309a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson } 3319a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson}; 3329a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson 3336c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Symbol bindings. 3346c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeenum { 3356c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STB_LOCAL = 0, // Local symbol, not visible outside obj file containing def 3366c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STB_GLOBAL = 1, // Global symbol, visible to all object files being combined 3376c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STB_WEAK = 2, // Weak symbol, like global but lower-precedence 3386c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STB_LOPROC = 13, // Lowest processor-specific binding type 3396c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STB_HIPROC = 15 // Highest processor-specific binding type 3406c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 3416c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 3426c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Symbol types. 3436c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeenum { 3446c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STT_NOTYPE = 0, // Symbol's type is not specified 3456c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STT_OBJECT = 1, // Symbol is a data object (variable, array, etc.) 3466c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STT_FUNC = 2, // Symbol is executable code (function, etc.) 3476c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STT_SECTION = 3, // Symbol refers to a section 3486c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STT_FILE = 4, // Local, absolute symbol that refers to a file 34953621a1a7376cba5d0a22c12a171933eb8c6d3f6Eli Friedman STT_COMMON = 5, // An uninitialised common block 35053621a1a7376cba5d0a22c12a171933eb8c6d3f6Eli Friedman STT_TLS = 6, // Thread local data object 3516c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STT_LOPROC = 13, // Lowest processor-specific symbol type 3526c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STT_HIPROC = 15 // Highest processor-specific symbol type 3536c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 3546c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 35553621a1a7376cba5d0a22c12a171933eb8c6d3f6Eli Friedmanenum { 35653621a1a7376cba5d0a22c12a171933eb8c6d3f6Eli Friedman STV_DEFAULT = 0, // Visibility is specified by binding type 35753621a1a7376cba5d0a22c12a171933eb8c6d3f6Eli Friedman STV_INTERNAL = 1, // Defined by processor supplements 35853621a1a7376cba5d0a22c12a171933eb8c6d3f6Eli Friedman STV_HIDDEN = 2, // Not visible to other components 35953621a1a7376cba5d0a22c12a171933eb8c6d3f6Eli Friedman STV_PROTECTED = 3 // Visible in other components but not preemptable 36053621a1a7376cba5d0a22c12a171933eb8c6d3f6Eli Friedman}; 36153621a1a7376cba5d0a22c12a171933eb8c6d3f6Eli Friedman 3626c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Relocation entry, without explicit addend. 3636c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekestruct Elf32_Rel { 36463b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman Elf32_Addr r_offset; // Location (file byte offset, or program virtual addr) 3656c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word r_info; // Symbol table index and type of relocation to apply 36663b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman 3676c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke // These accessors and mutators correspond to the ELF32_R_SYM, ELF32_R_TYPE, 3686c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke // and ELF32_R_INFO macros defined in the ELF specification: 369314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson Elf32_Word getSymbol() const { return (r_info >> 8); } 370314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson unsigned char getType() const { return (unsigned char) (r_info & 0x0ff); } 371314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson void setSymbol(Elf32_Word s) { setSymbolAndType(s, getType()); } 372314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson void setType(unsigned char t) { setSymbolAndType(getSymbol(), t); } 373314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson void setSymbolAndType(Elf32_Word s, unsigned char t) { 3746c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke r_info = (s << 8) + t; 3751461520f8cba8ebbdfd832d5396079888f1ab96eDouglas Gregor } 3766c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 3776c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 3786c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Relocation entry with explicit addend. 3796c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekestruct Elf32_Rela { 38063b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman Elf32_Addr r_offset; // Location (file byte offset, or program virtual addr) 3816c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word r_info; // Symbol table index and type of relocation to apply 3826c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Sword r_addend; // Compute value for relocatable field by adding this 38363b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman 3846c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke // These accessors and mutators correspond to the ELF32_R_SYM, ELF32_R_TYPE, 3856c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke // and ELF32_R_INFO macros defined in the ELF specification: 386314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson Elf32_Word getSymbol() const { return (r_info >> 8); } 387314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson unsigned char getType() const { return (unsigned char) (r_info & 0x0ff); } 388314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson void setSymbol(Elf32_Word s) { setSymbolAndType(s, getType()); } 389314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson void setType(unsigned char t) { setSymbolAndType(getSymbol(), t); } 390314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson void setSymbolAndType(Elf32_Word s, unsigned char t) { 3916c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke r_info = (s << 8) + t; 3921461520f8cba8ebbdfd832d5396079888f1ab96eDouglas Gregor } 3936c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 3946c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 395004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming// Relocation entry, without explicit addend. 396004c82ad7c0d2da761726f063373c28ffd18e66dMatt Flemingstruct Elf64_Rel { 397004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming Elf64_Addr r_offset; // Location (file byte offset, or program virtual addr). 398004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming Elf64_Xword r_info; // Symbol table index and type of relocation to apply. 399004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming 400004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming // These accessors and mutators correspond to the ELF64_R_SYM, ELF64_R_TYPE, 401004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming // and ELF64_R_INFO macros defined in the ELF specification: 402314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson Elf64_Xword getSymbol() const { return (r_info >> 32); } 403314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson unsigned char getType() const { 404004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming return (unsigned char) (r_info & 0xffffffffL); 405004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming } 406314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson void setSymbol(Elf32_Word s) { setSymbolAndType(s, getType()); } 407314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson void setType(unsigned char t) { setSymbolAndType(getSymbol(), t); } 408314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson void setSymbolAndType(Elf64_Xword s, unsigned char t) { 409004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming r_info = (s << 32) + (t&0xffffffffL); 4101461520f8cba8ebbdfd832d5396079888f1ab96eDouglas Gregor } 411004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming}; 412004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming 413004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming// Relocation entry with explicit addend. 414004c82ad7c0d2da761726f063373c28ffd18e66dMatt Flemingstruct Elf64_Rela { 415004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming Elf64_Addr r_offset; // Location (file byte offset, or program virtual addr). 416004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming Elf64_Xword r_info; // Symbol table index and type of relocation to apply. 417004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming Elf64_Sxword r_addend; // Compute value for relocatable field by adding this. 418004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming 419004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming // These accessors and mutators correspond to the ELF64_R_SYM, ELF64_R_TYPE, 420004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming // and ELF64_R_INFO macros defined in the ELF specification: 421314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson Elf64_Xword getSymbol() const { return (r_info >> 32); } 422314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson unsigned char getType() const { 423004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming return (unsigned char) (r_info & 0xffffffffL); 424004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming } 425314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson void setSymbol(Elf64_Xword s) { setSymbolAndType(s, getType()); } 426314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson void setType(unsigned char t) { setSymbolAndType(getSymbol(), t); } 427314451326ad1ef89241b240a704e104897e4ee81Stephen Wilson void setSymbolAndType(Elf64_Xword s, unsigned char t) { 428004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming r_info = (s << 32) + (t&0xffffffffL); 4291461520f8cba8ebbdfd832d5396079888f1ab96eDouglas Gregor } 430004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming}; 431004c82ad7c0d2da761726f063373c28ffd18e66dMatt Fleming 4329a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson// Program header for ELF32. 4336c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekestruct Elf32_Phdr { 4346c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word p_type; // Type of segment 4356c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Off p_offset; // File offset where segment is located, in bytes 4366c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Addr p_vaddr; // Virtual address of beginning of segment 4376c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Addr p_paddr; // Physical address of beginning of segment (OS-specific) 4386c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word p_filesz; // Num. of bytes in file image of segment (may be zero) 4396c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word p_memsz; // Num. of bytes in mem image of segment (may be zero) 4406c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word p_flags; // Segment flags 4416c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word p_align; // Segment alignment constraint 4426c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 4436c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 4449a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson// Program header for ELF64. 4459a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilsonstruct Elf64_Phdr { 4469a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson Elf64_Word p_type; // Type of segment 4479a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson Elf64_Word p_flags; // Segment flags 4489a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson Elf64_Off p_offset; // File offset where segment is located, in bytes 4499a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson Elf64_Addr p_vaddr; // Virtual address of beginning of segment 4509a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson Elf64_Addr p_paddr; // Physical address of beginning of segment (OS-specific) 4519a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson Elf64_Xword p_filesz; // Num. of bytes in file image of segment (may be zero) 4529a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson Elf64_Xword p_memsz; // Num. of bytes in mem image of segment (may be zero) 4539a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson Elf64_Xword p_align; // Segment alignment constraint 4549a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson}; 4559a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson 4564e9ca339b56f082c6b2d7dd7d91f704801c0d4fdMikhail Glushenkov// Segment types. 4576c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeenum { 4586c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke PT_NULL = 0, // Unused segment. 4596c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke PT_LOAD = 1, // Loadable segment. 4606c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke PT_DYNAMIC = 2, // Dynamic linking information. 4616c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke PT_INTERP = 3, // Interpreter pathname. 4626c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke PT_NOTE = 4, // Auxiliary information. 4636c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke PT_SHLIB = 5, // Reserved. 4646c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke PT_PHDR = 6, // The program header table itself. 4656c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke PT_LOPROC = 0x70000000, // Lowest processor-specific program hdr entry type. 4666c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke PT_HIPROC = 0x7fffffff // Highest processor-specific program hdr entry type. 4676c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 4686c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 4694e9ca339b56f082c6b2d7dd7d91f704801c0d4fdMikhail Glushenkov// Segment flag bits. 4704e9ca339b56f082c6b2d7dd7d91f704801c0d4fdMikhail Glushenkovenum { 4714e9ca339b56f082c6b2d7dd7d91f704801c0d4fdMikhail Glushenkov PF_X = 1, // Execute 4724e9ca339b56f082c6b2d7dd7d91f704801c0d4fdMikhail Glushenkov PF_W = 2, // Write 4734e9ca339b56f082c6b2d7dd7d91f704801c0d4fdMikhail Glushenkov PF_R = 4, // Read 4744e9ca339b56f082c6b2d7dd7d91f704801c0d4fdMikhail Glushenkov PF_MASKPROC = 0xf0000000 // Unspecified 4754e9ca339b56f082c6b2d7dd7d91f704801c0d4fdMikhail Glushenkov}; 4764e9ca339b56f082c6b2d7dd7d91f704801c0d4fdMikhail Glushenkov 4779a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson// Dynamic table entry for ELF32. 4789a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilsonstruct Elf32_Dyn 4799a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson{ 4809a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson Elf32_Sword d_tag; // Type of dynamic table entry. 4819a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson union 4829a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson { 4839a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson Elf32_Word d_val; // Integer value of entry. 4849a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson Elf32_Addr d_ptr; // Pointer value of entry. 4859a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson } d_un; 4869a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson}; 4879a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson 4889a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson// Dynamic table entry for ELF64. 4899a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilsonstruct Elf64_Dyn 4909a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson{ 4919a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson Elf64_Sxword d_tag; // Type of dynamic table entry. 4929a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson union 4939a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson { 4949a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson Elf64_Xword d_val; // Integer value of entry. 4959a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson Elf64_Addr d_ptr; // Pointer value of entry. 4969a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson } d_un; 4979a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson}; 4989a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson 4999a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson// Dynamic table entry tags. 5009a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilsonenum { 5019a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_NULL = 0, // Marks end of dynamic array. 5029a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_NEEDED = 1, // String table offset of needed library. 5039a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_PLTRELSZ = 2, // Size of relocation entries in PLT. 5049a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_PLTGOT = 3, // Address associated with linkage table. 5059a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_HASH = 4, // Address of symbolic hash table. 5069a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_STRTAB = 5, // Address of dynamic string table. 5079a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_SYMTAB = 6, // Address of dynamic symbol table. 5089a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_RELA = 7, // Address of relocation table (Rela entries). 5099a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_RELASZ = 8, // Size of Rela relocation table. 5109a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_RELAENT = 9, // Size of a Rela relocation entry. 5119a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_STRSZ = 10, // Total size of the string table. 5129a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_SYMENT = 11, // Size of a symbol table entry. 5139a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_INIT = 12, // Address of initialization function. 5149a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_FINI = 13, // Address of termination function. 5159a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_SONAME = 14, // String table offset of a shared objects name. 5169a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_RPATH = 15, // String table offset of library search path. 5179a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_SYMBOLIC = 16, // Changes symbol resolution algorithm. 5189a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_REL = 17, // Address of relocation table (Rel entries). 5199a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_RELSZ = 18, // Size of Rel relocation table. 5209a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_RELENT = 19, // Size of a Rel relocation entry. 5219a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_PLTREL = 20, // Type of relocation entry used for linking. 5229a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_DEBUG = 21, // Reserved for debugger. 5239a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_TEXTREL = 22, // Relocations exist for non-writable segements. 5249a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_JMPREL = 23, // Address of relocations associated with PLT. 5259a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_BIND_NOW = 24, // Process all relocations before execution. 5269a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_INIT_ARRAY = 25, // Pointer to array of initialization functions. 5279a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_FINI_ARRAY = 26, // Pointer to array of termination functions. 5289a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_INIT_ARRAYSZ = 27, // Size of DT_INIT_ARRAY. 5299a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_FINI_ARRAYSZ = 28, // Size of DT_FINI_ARRAY. 5309a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_LOOS = 0x60000000, // Start of environment specific tags. 5319a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_HIOS = 0x6FFFFFFF, // End of environment specific tags. 5329a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_LOPROC = 0x70000000, // Start of processor specific tags. 5339a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson DT_HIPROC = 0x7FFFFFFF // End of processor specific tags. 5349a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson}; 5359a9ad77847c1be4ffc5ba6304e33ccecbf72e43fStephen Wilson 5366c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke} // end namespace ELF 5376c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 5386c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke} // end namespace llvm 539551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer 540551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#endif 541