ELF.h revision 53621a1a7376cba5d0a22c12a171933eb8c6d3f6
17a90b68e5c85fe11a4ccc386be9c5fcddd4a8b61Chris Lattner//===-- llvm/Support/ELF.h - ELF constants and data structures --*- C++ -*-===// 2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 3079236d1c9909365ffd0ef06831523c87335bb4aChris Lattner// The LLVM Compiler Infrastructure 4079236d1c9909365ffd0ef06831523c87335bb4aChris Lattner// 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner// This file is distributed under the University of Illinois Open Source 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner// License. See LICENSE.TXT for details. 7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 8079236d1c9909365ffd0ef06831523c87335bb4aChris Lattner//===----------------------------------------------------------------------===// 9079236d1c9909365ffd0ef06831523c87335bb4aChris Lattner// 107a90b68e5c85fe11a4ccc386be9c5fcddd4a8b61Chris Lattner// This header contains common, non-processor-specific data structures and 117a90b68e5c85fe11a4ccc386be9c5fcddd4a8b61Chris Lattner// constants for the ELF file format. 127a90b68e5c85fe11a4ccc386be9c5fcddd4a8b61Chris Lattner// 13079236d1c9909365ffd0ef06831523c87335bb4aChris Lattner// The details of the ELF32 bits in this file are largely based on the Tool 14079236d1c9909365ffd0ef06831523c87335bb4aChris Lattner// Interface Standard (TIS) Executable and Linking Format (ELF) Specification 15079236d1c9909365ffd0ef06831523c87335bb4aChris Lattner// Version 1.2, May 1995. The ELF64 stuff is based on ELF-64 Object File Format 16079236d1c9909365ffd0ef06831523c87335bb4aChris Lattner// Version 1.5, Draft 2, May 1998 as well as OpenBSD header files. 17d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth// 18d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth//===----------------------------------------------------------------------===// 19d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth 20cd81d94322a39503e4a3e87b6ee03d4fcb3465fbStephen Hines#ifndef LLVM_SUPPORT_ELF_H 21d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#define LLVM_SUPPORT_ELF_H 22d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth 23d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "llvm/System/DataTypes.h" 24d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include <cstring> 2536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 260b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruthnamespace llvm { 270b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth 280b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruthnamespace ELF { 290b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth 3036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinestypedef uint32_t Elf32_Addr; // Program address 310b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruthtypedef uint16_t Elf32_Half; 320b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruthtypedef uint32_t Elf32_Off; // File offset 330b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruthtypedef int32_t Elf32_Sword; 340b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruthtypedef uint32_t Elf32_Word; 3536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 36079236d1c9909365ffd0ef06831523c87335bb4aChris Lattnertypedef uint64_t Elf64_Addr; 3779066fa6acce02c97c714a5a6e151ed8a249721cChris Lattnertypedef uint64_t Elf64_Off; 38c25e7581b9b8088910da31702d4ca21c4734c6d7Torok Edwintypedef int32_t Elf64_Shalf; 39998182b3802d2be8d081ca484b5d4fd5e1188950Chris Lattnertypedef int32_t Elf64_Sword; 40ce63ffb52f249b62cdf2d250c128007b13f27e71Daniel Dunbartypedef uint32_t Elf64_Word; 41d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruthtypedef int64_t Elf64_Sxword; 42dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinestypedef uint64_t Elf64_Xword; 43713cab059ebb67c2f51d8da9d8e57be2b1dcd9c2Rafael Espindolatypedef uint32_t Elf64_Half; 444ef7eafa3f823443d1b8921f6020d946612281dbRafael Espindolatypedef uint16_t Elf64_Quarter; 45e47ba74b07b2a6015239bcbabba09750580aecedChris Lattner 46dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// Object file magic string. 47079236d1c9909365ffd0ef06831523c87335bb4aChris Lattnerstatic const char ElfMagic[] = { 0x7f, 'E', 'L', 'F', '\0' }; 48079236d1c9909365ffd0ef06831523c87335bb4aChris Lattner 49dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines// e_ident size and indices. 50dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesenum { 5186453c52ba02e743d29c08456e51006500041456Chris Lattner EI_MAG0 = 0, // File identification index. 52c4440e3e307fb696146c08c127c53300a982fe82Rafael Espindola EI_MAG1 = 1, // File identification index. 5386453c52ba02e743d29c08456e51006500041456Chris Lattner EI_MAG2 = 2, // File identification index. 5486453c52ba02e743d29c08456e51006500041456Chris Lattner EI_MAG3 = 3, // File identification index. 5586453c52ba02e743d29c08456e51006500041456Chris Lattner EI_CLASS = 4, // File class. 5686453c52ba02e743d29c08456e51006500041456Chris Lattner EI_DATA = 5, // Data encoding. 5786453c52ba02e743d29c08456e51006500041456Chris Lattner EI_VERSION = 6, // File version. 5886453c52ba02e743d29c08456e51006500041456Chris Lattner EI_OSABI = 7, // OS/ABI identification. 5923eb90714bb6a5a7d94a262f439b5bf872733cf1Alexey Samsonov EI_ABIVERSION = 8, // ABI version. 6086453c52ba02e743d29c08456e51006500041456Chris Lattner EI_PAD = 9, // Start of padding bytes. 6186453c52ba02e743d29c08456e51006500041456Chris Lattner EI_NIDENT = 16 // Number of bytes in e_ident. 6286453c52ba02e743d29c08456e51006500041456Chris Lattner}; 633d5378ff8e015e6ede4fd3d33c3e05a1dfec5b99Duncan Sands 644782b305c2ccc2b2e5a4cad65d7ffd15395d0727Duncan Sandsstruct Elf32_Ehdr { 654782b305c2ccc2b2e5a4cad65d7ffd15395d0727Duncan Sands unsigned char e_ident[EI_NIDENT]; // ELF Identification bytes 66a201c4c2e604a519665ca55dc49e913628444ddbAnders Carlsson Elf32_Half e_type; // Type of file (see ET_* below) 67079236d1c9909365ffd0ef06831523c87335bb4aChris Lattner Elf32_Half e_machine; // Required architecture for this file (see EM_*) 6886453c52ba02e743d29c08456e51006500041456Chris Lattner Elf32_Word e_version; // Must be equal to 1 696726b6d75a8b679068a58cb954ba97cf9d1690baNick Lewycky Elf32_Addr e_entry; // Address to jump to in order to start program 7036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Elf32_Off e_phoff; // Program header table's file offset, in bytes 7100737bdb488cc7157ca5f7a40d6cd8467ad09a79Chad Rosier Elf32_Off e_shoff; // Section header table's file offset, in bytes 7230ba5690cf7a6f4db8913463d03f239f82d17440Chris Lattner Elf32_Word e_flags; // Processor-specific flags 73ecd94c804a563f2a86572dcf1d2e81f397e19daaNick Lewycky Elf32_Half e_ehsize; // Size of ELF header, in bytes 74081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson Elf32_Half e_phentsize; // Size of an entry in the program header table 75081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson Elf32_Half e_phnum; // Number of entries in the program header table 76081c34b725980f995be9080eaec24cd3dfaaf065Owen Anderson Elf32_Half e_shentsize; // Size of an entry in the section header table 77fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman Elf32_Half e_shnum; // Number of entries in the section header table 7836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Elf32_Half e_shstrndx; // Sect hdr table index of sect name string table 7930ba5690cf7a6f4db8913463d03f239f82d17440Chris Lattner bool checkMagic() const { 8030ba5690cf7a6f4db8913463d03f239f82d17440Chris Lattner return (memcmp(e_ident, ElfMagic, strlen(ElfMagic))) == 0; 81b1ab4580478c90375abec5e2b6e89dc1a15fa98bChris Lattner } 82b1ab4580478c90375abec5e2b6e89dc1a15fa98bChris Lattner unsigned char getFileClass() const { return e_ident[EI_CLASS]; } 83fc5940d2a09a795e683ae86b237d6f55fb3551d4Duncan Sands unsigned char getDataEncoding() const { return e_ident[EI_DATA]; } 84c4440e3e307fb696146c08c127c53300a982fe82Rafael Espindola}; 85c4440e3e307fb696146c08c127c53300a982fe82Rafael Espindola 86c4440e3e307fb696146c08c127c53300a982fe82Rafael Espindola// 64-bit ELF header. Fields are the same as for ELF32, but with different 87a201c4c2e604a519665ca55dc49e913628444ddbAnders Carlsson// types (see above). 886a577f82ba56a4da48e984702240a01c3ba7e941Nick Lewyckystruct Elf64_Ehdr { 8936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned char e_ident[EI_NIDENT]; 906a577f82ba56a4da48e984702240a01c3ba7e941Nick Lewycky Elf64_Quarter e_type; 91079236d1c9909365ffd0ef06831523c87335bb4aChris Lattner Elf64_Quarter e_machine; 929ce300013d5c5b9e2c7e26626ddbc8f3a42bdb88Chris Lattner Elf64_Half e_version; 939ce300013d5c5b9e2c7e26626ddbc8f3a42bdb88Chris Lattner Elf64_Addr e_entry; 94844731a7f1909f55935e3514c9e713a62d67662eDan Gohman Elf64_Off e_phoff; 9500737bdb488cc7157ca5f7a40d6cd8467ad09a79Chad Rosier Elf64_Off e_shoff; 9600737bdb488cc7157ca5f7a40d6cd8467ad09a79Chad Rosier Elf64_Half e_flags; 9700737bdb488cc7157ca5f7a40d6cd8467ad09a79Chad Rosier Elf64_Quarter e_ehsize; 9800737bdb488cc7157ca5f7a40d6cd8467ad09a79Chad Rosier Elf64_Quarter e_phentsize; 99ce665bd2e2b581ab0858d1afe359192bac96b868Owen Anderson Elf64_Quarter e_phnum; 100844731a7f1909f55935e3514c9e713a62d67662eDan Gohman Elf64_Quarter e_shentsize; 1017a90b68e5c85fe11a4ccc386be9c5fcddd4a8b61Chris Lattner Elf64_Quarter e_shnum; 1027a90b68e5c85fe11a4ccc386be9c5fcddd4a8b61Chris Lattner Elf64_Quarter e_shstrndx; 1038899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky bool checkMagic() const { 1048899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky return (memcmp(e_ident, ElfMagic, strlen(ElfMagic))) == 0; 1058899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky } 1068899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky unsigned char getFileClass() const { return e_ident[EI_CLASS]; } 1078899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky unsigned char getDataEncoding() const { return e_ident[EI_DATA]; } 1088899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky}; 1098899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky 1108899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky// File types 1118899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewyckyenum { 1128899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ET_NONE = 0, // No file type 1138899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ET_REL = 1, // Relocatable file 1148899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ET_EXEC = 2, // Executable file 1158899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ET_DYN = 3, // Shared object file 1168899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ET_CORE = 4, // Core file 1178899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ET_LOPROC = 0xff00, // Beginning of processor-specific codes 1188899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ET_HIPROC = 0xffff // Processor-specific 1198899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky}; 1208899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky 1218899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky// Versioning 1228899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewyckyenum { 1238899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky EV_NONE = 0, 1248899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky EV_CURRENT = 1 1258899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky}; 1268899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky 1278899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky// Machine architectures 1288899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewyckyenum { 1298899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky EM_NONE = 0, // No machine 1308899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky EM_M32 = 1, // AT&T WE 32100 1318899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky EM_SPARC = 2, // SPARC 1328899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky EM_386 = 3, // Intel 386 1338899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky EM_68K = 4, // Motorola 68000 1348899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky EM_88K = 5, // Motorola 88000 1358899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky EM_486 = 6, // Intel 486 (deprecated) 1368899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky EM_860 = 7, // Intel 80860 1378899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky EM_MIPS = 8, // MIPS R3000 1388899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky EM_PPC = 20, // PowerPC 1398899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky EM_PPC64 = 21, // PowerPC64 1408899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky EM_ARM = 40, // ARM 1418899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky EM_ALPHA = 41, // DEC Alpha 1428899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky EM_SPARCV9 = 43, // SPARC V9 1438899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky EM_X86_64 = 62 // AMD64 1448899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky}; 1458899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky 1468899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky// Object file classes. 1478899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewyckyenum { 1488899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFCLASS32 = 1, // 32-bit object file 1498899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFCLASS64 = 2 // 64-bit object file 1508899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky}; 1518899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky 1528899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky// Object file byte orderings. 1538e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramerenum { 1548899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFDATANONE = 0, // Invalid data encoding. 1558899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFDATA2LSB = 1, // Little-endian object file 1568899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFDATA2MSB = 2 // Big-endian object file 1578899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky}; 1588899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky 159b8cd66b5d78eaeba41ab372aaca5180dd54e4385Nick Lewycky// OS ABI identification. 160b8cd66b5d78eaeba41ab372aaca5180dd54e4385Nick Lewyckyenum { 1618899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFOSABI_NONE = 0, // UNIX System V ABI 1628e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer ELFOSABI_HPUX = 1, // HP-UX operating system 1638899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFOSABI_NETBSD = 2, // NetBSD 1648899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFOSABI_LINUX = 3, // GNU/Linux 1658899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFOSABI_HURD = 4, // GNU/Hurd 1668899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFOSABI_SOLARIS = 6, // Solaris 1678899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFOSABI_AIX = 7, // AIX 1688899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFOSABI_IRIX = 8, // IRIX 1698899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFOSABI_FREEBSD = 9, // FreeBSD 1708899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFOSABI_TRU64 = 10, // TRU64 UNIX 1718899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFOSABI_MODESTO = 11, // Novell Modesto 1728899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFOSABI_OPENBSD = 12, // OpenBSD 1738899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFOSABI_OPENVMS = 13, // OpenVMS 1748899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFOSABI_NSK = 14, // Hewlett-Packard Non-Stop Kernel 1758899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFOSABI_AROS = 15, // AROS 1768899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFOSABI_FENIXOS = 16, // FenixOS 1778899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFOSABI_C6000_ELFABI = 64, // Bare-metal TMS320C6000 1788899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFOSABI_C6000_LINUX = 65, // Linux TMS320C6000 1798899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFOSABI_ARM = 97, // ARM 1808899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky ELFOSABI_STANDALONE = 255 // Standalone (embedded) application 1818899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky}; 1828899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky 1838e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer// X86_64 relocations. 1848e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramerenum { 1858899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_NONE = 0, 1868899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_64 = 1, 1878899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_PC32 = 2, 1888899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_GOT32 = 3, 1898899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_PLT32 = 4, 1908899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_COPY = 5, 1918899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_GLOB_DAT = 6, 1928899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_JUMP_SLOT = 7, 1938899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_RELATIVE = 8, 1948899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_GOTPCREL = 9, 1958899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_32 = 10, 1968899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_32S = 11, 1978899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_16 = 12, 1988899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_PC16 = 13, 1998899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_8 = 14, 2008899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_PC8 = 15, 20136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines R_X86_64_DTPMOD64 = 16, 2028899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_DTPOFF64 = 17, 2038899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_TPOFF64 = 18, 2048899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_TLSGD = 19, 2058899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_TLSLD = 20, 2068899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_DTPOFF32 = 21, 2078899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_GOTTPOFF = 22, 2088899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_TPOFF32 = 23, 2098899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_PC64 = 24, 2108899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_GOTOFF64 = 25, 2118899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_GOTPC32 = 26, 2128899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_SIZE32 = 32, 2138899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_SIZE64 = 33, 2148899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_GOTPC32_TLSDESC = 34, 2158899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_TLSDESC_CALL = 35, 2168899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky R_X86_64_TLSDESC = 36 2178899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky}; 2188899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky 2198899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky// Section header. 2208899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewyckystruct Elf32_Shdr { 2218899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky Elf32_Word sh_name; // Section name (index into string table) 2228899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky Elf32_Word sh_type; // Section type (SHT_*) 2238899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky Elf32_Word sh_flags; // Section flags (SHF_*) 2248899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky Elf32_Addr sh_addr; // Address where section is to be loaded 2258899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky Elf32_Off sh_offset; // File offset of section data, in bytes 2268899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky Elf32_Word sh_size; // Size of section, in bytes 2278899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky Elf32_Word sh_link; // Section type-specific header table index link 2288899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky Elf32_Word sh_info; // Section type-specific extra information 2298899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky Elf32_Word sh_addralign; // Section address alignment 2308899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky Elf32_Word sh_entsize; // Size of records contained within the section 2318899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky}; 2328899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky 2338899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky// Section header for ELF64 - same fields as ELF32, different types. 2348899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewyckystruct Elf64_Shdr { 2358899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky Elf64_Half sh_name; 2369bb874cea257753349854106a994999981290259Rafael Espindola Elf64_Half sh_type; 2378899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky Elf64_Xword sh_flags; 2388899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky Elf64_Addr sh_addr; 2398899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky Elf64_Off sh_offset; 2408e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer Elf64_Xword sh_size; 2418899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky Elf64_Half sh_link; 2428899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky Elf64_Half sh_info; 2438899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky Elf64_Xword sh_addralign; 2448899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky Elf64_Xword sh_entsize; 2458899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky}; 2468899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky 2478e0d1c03ca7fd86e6879b4e37d0d7f0e982feef6Benjamin Kramer// Special section indices. 2488899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewyckyenum { 2498899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky SHN_UNDEF = 0, // Undefined, missing, irrelevant, or meaningless 2508899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky SHN_LORESERVE = 0xff00, // Lowest reserved index 251dcf669560e2ae00c5392474d10aa758a51c609a8Michael Gottesman SHN_LOPROC = 0xff00, // Lowest processor-specific index 252dcf669560e2ae00c5392474d10aa758a51c609a8Michael Gottesman SHN_HIPROC = 0xff1f, // Highest processor-specific index 2538899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky SHN_ABS = 0xfff1, // Symbol has absolute value; does not need relocation 2548899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky SHN_COMMON = 0xfff2, // FORTRAN COMMON or C external global variables 2558899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky SHN_HIRESERVE = 0xffff // Highest reserved index 2568899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky}; 2578899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky 258952f5d562c40bc19147df4fbf3415069659236d1Nick Lewycky// Section types. 2598899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewyckyenum { 2608899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky SHT_NULL = 0, // No associated section (inactive entry). 2618899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky SHT_PROGBITS = 1, // Program-defined contents. 2628899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky SHT_SYMTAB = 2, // Symbol table. 2638899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky SHT_STRTAB = 3, // String table. 2648899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky SHT_RELA = 4, // Relocation entries; explicit addends. 2658899d5c6fb3cf118c5c73eade290b6ebb2b3b850Nick Lewycky SHT_HASH = 5, // Symbol hash table. 266e47ba74b07b2a6015239bcbabba09750580aecedChris Lattner SHT_DYNAMIC = 6, // Information for dynamic linking. 267e47ba74b07b2a6015239bcbabba09750580aecedChris Lattner SHT_NOTE = 7, // Information about the file. 268031955d4623193b1c4163bd43db0eaaf6b08c27bChris Lattner SHT_NOBITS = 8, // Data occupies no space in the file. 269031955d4623193b1c4163bd43db0eaaf6b08c27bChris Lattner SHT_REL = 9, // Relocation entries; no explicit addends. 2706a577f82ba56a4da48e984702240a01c3ba7e941Nick Lewycky SHT_SHLIB = 10, // Reserved. 27136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SHT_DYNSYM = 11, // Symbol table. 27236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines SHT_LOPROC = 0x70000000, // Lowest processor architecture-specific type. 273031955d4623193b1c4163bd43db0eaaf6b08c27bChris Lattner SHT_HIPROC = 0x7fffffff, // Highest processor architecture-specific type. 274dd36ddfaec578968b163fc4bbb7148921084aa6eBill Wendling SHT_LOUSER = 0x80000000, // Lowest type reserved for applications. 275dd36ddfaec578968b163fc4bbb7148921084aa6eBill Wendling SHT_HIUSER = 0xffffffff // Highest type reserved for applications. 276dd36ddfaec578968b163fc4bbb7148921084aa6eBill Wendling}; 277dd36ddfaec578968b163fc4bbb7148921084aa6eBill Wendling 27836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Section flags. 2792b7923665d628c247fcc50c52d7e0618359491c6Bill Wendlingenum { 280dd36ddfaec578968b163fc4bbb7148921084aa6eBill Wendling SHF_WRITE = 0x1, // Section data should be writable during execution. 281dd36ddfaec578968b163fc4bbb7148921084aa6eBill Wendling SHF_ALLOC = 0x2, // Section occupies memory during program execution. 282dd36ddfaec578968b163fc4bbb7148921084aa6eBill Wendling SHF_EXECINSTR = 0x4, // Section contains executable machine instructions. 283dd36ddfaec578968b163fc4bbb7148921084aa6eBill Wendling SHF_MASKPROC = 0xf0000000 // Bits indicating processor-specific flags. 284dd36ddfaec578968b163fc4bbb7148921084aa6eBill Wendling}; 285fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman 2867a90b68e5c85fe11a4ccc386be9c5fcddd4a8b61Chris Lattner// Symbol table entries for ELF32. 28735c81b0b120f87373584f2e238e4d77f9d2ae88fChris Lattnerstruct Elf32_Sym { 28835c81b0b120f87373584f2e238e4d77f9d2ae88fChris Lattner Elf32_Word st_name; // Symbol name (index into string table) 28935c81b0b120f87373584f2e238e4d77f9d2ae88fChris Lattner Elf32_Addr st_value; // Value or address associated with the symbol 29035c81b0b120f87373584f2e238e4d77f9d2ae88fChris Lattner Elf32_Word st_size; // Size of the symbol 29135c81b0b120f87373584f2e238e4d77f9d2ae88fChris Lattner unsigned char st_info; // Symbol's type and binding attributes 29235c81b0b120f87373584f2e238e4d77f9d2ae88fChris Lattner unsigned char st_other; // Must be zero; reserved 2937a90b68e5c85fe11a4ccc386be9c5fcddd4a8b61Chris Lattner Elf32_Half st_shndx; // Which section (header table index) it's defined in 294e47ba74b07b2a6015239bcbabba09750580aecedChris Lattner 2957a7ed0274d01efb2e12a32fd5fee6aa9596b0b9aChris Lattner // These accessors and mutators correspond to the ELF32_ST_BIND, 296031955d4623193b1c4163bd43db0eaaf6b08c27bChris Lattner // ELF32_ST_TYPE, and ELF32_ST_INFO macros defined in the ELF specification: 2977a90b68e5c85fe11a4ccc386be9c5fcddd4a8b61Chris Lattner unsigned char getBinding() const { return st_info >> 4; } 2987a90b68e5c85fe11a4ccc386be9c5fcddd4a8b61Chris Lattner unsigned char getType() const { return st_info & 0x0f; } 299dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines void setBinding(unsigned char b) { setBindingAndType(b, getType()); } 300aae4a1cd3f5d41d0b909a75b4f5699b20605db5eChris Lattner void setType(unsigned char t) { setBindingAndType(getBinding(), t); } 301c6f69e94fa46f585b59bb9d7ace3224b0e638c95Dan Gohman void setBindingAndType(unsigned char b, unsigned char t) { 30236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines st_info = (b << 4) + (t & 0x0f); 30336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 30436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 30536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 30635c81b0b120f87373584f2e238e4d77f9d2ae88fChris Lattner// Symbol table entries for ELF64. 307dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hinesstruct Elf64_Sym { 3087a90b68e5c85fe11a4ccc386be9c5fcddd4a8b61Chris Lattner Elf64_Word st_name; // Symbol name (index into string table) 30935c81b0b120f87373584f2e238e4d77f9d2ae88fChris Lattner unsigned char st_info; // Symbol's type and binding attributes 31035c81b0b120f87373584f2e238e4d77f9d2ae88fChris Lattner unsigned char st_other; // Must be zero; reserved 31135c81b0b120f87373584f2e238e4d77f9d2ae88fChris Lattner Elf64_Half st_shndx; // Which section (header table index) it's defined in 31235c81b0b120f87373584f2e238e4d77f9d2ae88fChris Lattner Elf64_Addr st_value; // Value or address associated with the symbol 313c4d81b0388dff9f38e1387bb223cc7b514c06d01Chris Lattner Elf64_Xword st_size; // Size of the symbol 31435c81b0b120f87373584f2e238e4d77f9d2ae88fChris Lattner 3157b52fe7272ec337a77b7cc96b14e27d15fec3c89Chris Lattner // These accessors and mutators are identical to those defined for ELF32 3167b52fe7272ec337a77b7cc96b14e27d15fec3c89Chris Lattner // symbol table entries. 3177b52fe7272ec337a77b7cc96b14e27d15fec3c89Chris Lattner unsigned char getBinding() const { return st_info >> 4; } 318dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines unsigned char getType() const { return st_info & 0x0f; } 3197b52fe7272ec337a77b7cc96b14e27d15fec3c89Chris Lattner void setBinding(unsigned char b) { setBindingAndType(b, getType()); } 3209d28fdd7225b344789ed7f54cf51b4019763b30bMikhail Glushenkov void setType(unsigned char t) { setBindingAndType(getBinding(), t); } 32136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void setBindingAndType(unsigned char b, unsigned char t) { 3227b52fe7272ec337a77b7cc96b14e27d15fec3c89Chris Lattner st_info = (b << 4) + (t & 0x0f); 323c6f69e94fa46f585b59bb9d7ace3224b0e638c95Dan Gohman } 324c1ea16ec4339a9746f436c6f2f5b08197f309343Benjamin Kramer}; 325c1ea16ec4339a9746f436c6f2f5b08197f309343Benjamin Kramer 326c1ea16ec4339a9746f436c6f2f5b08197f309343Benjamin Kramer// Symbol bindings. 327c1ea16ec4339a9746f436c6f2f5b08197f309343Benjamin Kramerenum { 328c1ea16ec4339a9746f436c6f2f5b08197f309343Benjamin Kramer STB_LOCAL = 0, // Local symbol, not visible outside obj file containing def 329c1ea16ec4339a9746f436c6f2f5b08197f309343Benjamin Kramer STB_GLOBAL = 1, // Global symbol, visible to all object files being combined 3307b52fe7272ec337a77b7cc96b14e27d15fec3c89Chris Lattner STB_WEAK = 2, // Weak symbol, like global but lower-precedence 33136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines STB_LOPROC = 13, // Lowest processor-specific binding type 332c4d81b0388dff9f38e1387bb223cc7b514c06d01Chris Lattner STB_HIPROC = 15 // Highest processor-specific binding type 333031955d4623193b1c4163bd43db0eaaf6b08c27bChris Lattner}; 3347a7ed0274d01efb2e12a32fd5fee6aa9596b0b9aChris Lattner 335031955d4623193b1c4163bd43db0eaaf6b08c27bChris Lattner// Symbol types. 336031955d4623193b1c4163bd43db0eaaf6b08c27bChris Lattnerenum { 33735c81b0b120f87373584f2e238e4d77f9d2ae88fChris Lattner STT_NOTYPE = 0, // Symbol's type is not specified 33835c81b0b120f87373584f2e238e4d77f9d2ae88fChris Lattner STT_OBJECT = 1, // Symbol is a data object (variable, array, etc.) 33935c81b0b120f87373584f2e238e4d77f9d2ae88fChris Lattner STT_FUNC = 2, // Symbol is executable code (function, etc.) 34035c81b0b120f87373584f2e238e4d77f9d2ae88fChris Lattner STT_SECTION = 3, // Symbol refers to a section 34135c81b0b120f87373584f2e238e4d77f9d2ae88fChris Lattner STT_FILE = 4, // Local, absolute symbol that refers to a file 34235c81b0b120f87373584f2e238e4d77f9d2ae88fChris Lattner STT_COMMON = 5, // An uninitialised common block 343a4be1dc0a192175bbc561a633c0b7197853e6a74Chris Lattner STT_TLS = 6, // Thread local data object 344a4be1dc0a192175bbc561a633c0b7197853e6a74Chris Lattner STT_LOPROC = 13, // Lowest processor-specific symbol type 345a4be1dc0a192175bbc561a633c0b7197853e6a74Chris Lattner STT_HIPROC = 15 // Highest processor-specific symbol type 3469bb874cea257753349854106a994999981290259Rafael Espindola}; 347743cdf8edf21d96b3d155eb322578936aebc4876Devang Patel 34836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hinesenum { 349031955d4623193b1c4163bd43db0eaaf6b08c27bChris Lattner STV_DEFAULT = 0, // Visibility is specified by binding type 350a4be1dc0a192175bbc561a633c0b7197853e6a74Chris Lattner STV_INTERNAL = 1, // Defined by processor supplements 351e47ba74b07b2a6015239bcbabba09750580aecedChris Lattner STV_HIDDEN = 2, // Not visible to other components 352e47ba74b07b2a6015239bcbabba09750580aecedChris Lattner STV_PROTECTED = 3 // Visible in other components but not preemptable 353031955d4623193b1c4163bd43db0eaaf6b08c27bChris Lattner}; 354e47ba74b07b2a6015239bcbabba09750580aecedChris Lattner 355e47ba74b07b2a6015239bcbabba09750580aecedChris Lattner// Relocation entry, without explicit addend. 356941db495b8233a3753ce72a84021f677073ff4eaChris Lattnerstruct Elf32_Rel { 357941db495b8233a3753ce72a84021f677073ff4eaChris Lattner Elf32_Addr r_offset; // Location (file byte offset, or program virtual addr) 358941db495b8233a3753ce72a84021f677073ff4eaChris Lattner Elf32_Word r_info; // Symbol table index and type of relocation to apply 359941db495b8233a3753ce72a84021f677073ff4eaChris Lattner 360941db495b8233a3753ce72a84021f677073ff4eaChris Lattner // These accessors and mutators correspond to the ELF32_R_SYM, ELF32_R_TYPE, 3619bb874cea257753349854106a994999981290259Rafael Espindola // and ELF32_R_INFO macros defined in the ELF specification: 3629d28fdd7225b344789ed7f54cf51b4019763b30bMikhail Glushenkov Elf32_Word getSymbol() const { return (r_info >> 8); } 363941db495b8233a3753ce72a84021f677073ff4eaChris Lattner unsigned char getType() const { return (unsigned char) (r_info & 0x0ff); } 364941db495b8233a3753ce72a84021f677073ff4eaChris Lattner void setSymbol(Elf32_Word s) { setSymbolAndType(s, getType()); } 365941db495b8233a3753ce72a84021f677073ff4eaChris Lattner void setType(unsigned char t) { setSymbolAndType(getSymbol(), t); } 366941db495b8233a3753ce72a84021f677073ff4eaChris Lattner void setSymbolAndType(Elf32_Word s, unsigned char t) { 367941db495b8233a3753ce72a84021f677073ff4eaChris Lattner r_info = (s << 8) + t; 368941db495b8233a3753ce72a84021f677073ff4eaChris Lattner }; 369941db495b8233a3753ce72a84021f677073ff4eaChris Lattner}; 370941db495b8233a3753ce72a84021f677073ff4eaChris Lattner 371941db495b8233a3753ce72a84021f677073ff4eaChris Lattner// Relocation entry with explicit addend. 3729d28fdd7225b344789ed7f54cf51b4019763b30bMikhail Glushenkovstruct Elf32_Rela { 373941db495b8233a3753ce72a84021f677073ff4eaChris Lattner Elf32_Addr r_offset; // Location (file byte offset, or program virtual addr) 374941db495b8233a3753ce72a84021f677073ff4eaChris Lattner Elf32_Word r_info; // Symbol table index and type of relocation to apply 375dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines Elf32_Sword r_addend; // Compute value for relocatable field by adding this 3769d28fdd7225b344789ed7f54cf51b4019763b30bMikhail Glushenkov 377941db495b8233a3753ce72a84021f677073ff4eaChris Lattner // These accessors and mutators correspond to the ELF32_R_SYM, ELF32_R_TYPE, 378941db495b8233a3753ce72a84021f677073ff4eaChris Lattner // and ELF32_R_INFO macros defined in the ELF specification: 379941db495b8233a3753ce72a84021f677073ff4eaChris Lattner Elf32_Word getSymbol() const { return (r_info >> 8); } 3809d28fdd7225b344789ed7f54cf51b4019763b30bMikhail Glushenkov unsigned char getType() const { return (unsigned char) (r_info & 0x0ff); } 38136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void setSymbol(Elf32_Word s) { setSymbolAndType(s, getType()); } 38236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines void setType(unsigned char t) { setSymbolAndType(getSymbol(), t); } 383941db495b8233a3753ce72a84021f677073ff4eaChris Lattner void setSymbolAndType(Elf32_Word s, unsigned char t) { 384941db495b8233a3753ce72a84021f677073ff4eaChris Lattner r_info = (s << 8) + t; 385941db495b8233a3753ce72a84021f677073ff4eaChris Lattner }; 386727c21084d2f96c25b0ec1bc9a03cb88105a417cChris Lattner}; 387941db495b8233a3753ce72a84021f677073ff4eaChris Lattner 388941db495b8233a3753ce72a84021f677073ff4eaChris Lattner// Relocation entry, without explicit addend. 389941db495b8233a3753ce72a84021f677073ff4eaChris Lattnerstruct Elf64_Rel { 390727c21084d2f96c25b0ec1bc9a03cb88105a417cChris Lattner Elf64_Addr r_offset; // Location (file byte offset, or program virtual addr). 391941db495b8233a3753ce72a84021f677073ff4eaChris Lattner Elf64_Xword r_info; // Symbol table index and type of relocation to apply. 392941db495b8233a3753ce72a84021f677073ff4eaChris Lattner 3939d28fdd7225b344789ed7f54cf51b4019763b30bMikhail Glushenkov // These accessors and mutators correspond to the ELF64_R_SYM, ELF64_R_TYPE, 3949d28fdd7225b344789ed7f54cf51b4019763b30bMikhail Glushenkov // and ELF64_R_INFO macros defined in the ELF specification: 395941db495b8233a3753ce72a84021f677073ff4eaChris Lattner Elf64_Xword getSymbol() const { return (r_info >> 32); } 396941db495b8233a3753ce72a84021f677073ff4eaChris Lattner unsigned char getType() const { 3979d28fdd7225b344789ed7f54cf51b4019763b30bMikhail Glushenkov return (unsigned char) (r_info & 0xffffffffL); 398941db495b8233a3753ce72a84021f677073ff4eaChris Lattner } 399941db495b8233a3753ce72a84021f677073ff4eaChris Lattner void setSymbol(Elf32_Word s) { setSymbolAndType(s, getType()); } 400941db495b8233a3753ce72a84021f677073ff4eaChris Lattner void setType(unsigned char t) { setSymbolAndType(getSymbol(), t); } 401941db495b8233a3753ce72a84021f677073ff4eaChris Lattner void setSymbolAndType(Elf64_Xword s, unsigned char t) { 402941db495b8233a3753ce72a84021f677073ff4eaChris Lattner r_info = (s << 32) + (t&0xffffffffL); 403941db495b8233a3753ce72a84021f677073ff4eaChris Lattner }; 404941db495b8233a3753ce72a84021f677073ff4eaChris Lattner}; 405941db495b8233a3753ce72a84021f677073ff4eaChris Lattner 406727c21084d2f96c25b0ec1bc9a03cb88105a417cChris Lattner// Relocation entry with explicit addend. 407941db495b8233a3753ce72a84021f677073ff4eaChris Lattnerstruct Elf64_Rela { 408941db495b8233a3753ce72a84021f677073ff4eaChris Lattner Elf64_Addr r_offset; // Location (file byte offset, or program virtual addr). 4099d28fdd7225b344789ed7f54cf51b4019763b30bMikhail Glushenkov Elf64_Xword r_info; // Symbol table index and type of relocation to apply. 410941db495b8233a3753ce72a84021f677073ff4eaChris Lattner Elf64_Sxword r_addend; // Compute value for relocatable field by adding this. 411db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner 412941db495b8233a3753ce72a84021f677073ff4eaChris Lattner // These accessors and mutators correspond to the ELF64_R_SYM, ELF64_R_TYPE, 413941db495b8233a3753ce72a84021f677073ff4eaChris Lattner // and ELF64_R_INFO macros defined in the ELF specification: 4149d28fdd7225b344789ed7f54cf51b4019763b30bMikhail Glushenkov Elf64_Xword getSymbol() const { return (r_info >> 32); } 415941db495b8233a3753ce72a84021f677073ff4eaChris Lattner unsigned char getType() const { 416941db495b8233a3753ce72a84021f677073ff4eaChris Lattner return (unsigned char) (r_info & 0xffffffffL); 417941db495b8233a3753ce72a84021f677073ff4eaChris Lattner } 418941db495b8233a3753ce72a84021f677073ff4eaChris Lattner void setSymbol(Elf64_Xword s) { setSymbolAndType(s, getType()); } 419941db495b8233a3753ce72a84021f677073ff4eaChris Lattner void setType(unsigned char t) { setSymbolAndType(getSymbol(), t); } 4209d28fdd7225b344789ed7f54cf51b4019763b30bMikhail Glushenkov void setSymbolAndType(Elf64_Xword s, unsigned char t) { 421941db495b8233a3753ce72a84021f677073ff4eaChris Lattner r_info = (s << 32) + (t&0xffffffffL); 422941db495b8233a3753ce72a84021f677073ff4eaChris Lattner }; 423941db495b8233a3753ce72a84021f677073ff4eaChris Lattner}; 424941db495b8233a3753ce72a84021f677073ff4eaChris Lattner 425941db495b8233a3753ce72a84021f677073ff4eaChris Lattner// Program header for ELF32. 426941db495b8233a3753ce72a84021f677073ff4eaChris Lattnerstruct Elf32_Phdr { 427941db495b8233a3753ce72a84021f677073ff4eaChris Lattner Elf32_Word p_type; // Type of segment 428941db495b8233a3753ce72a84021f677073ff4eaChris Lattner Elf32_Off p_offset; // File offset where segment is located, in bytes 4296874a2ae033b7b5e1d0c10714e01d9c87480956aDan Gohman Elf32_Addr p_vaddr; // Virtual address of beginning of segment 430941db495b8233a3753ce72a84021f677073ff4eaChris Lattner Elf32_Addr p_paddr; // Physical address of beginning of segment (OS-specific) 431941db495b8233a3753ce72a84021f677073ff4eaChris Lattner Elf32_Word p_filesz; // Num. of bytes in file image of segment (may be zero) 432db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner Elf32_Word p_memsz; // Num. of bytes in mem image of segment (may be zero) 433941db495b8233a3753ce72a84021f677073ff4eaChris Lattner Elf32_Word p_flags; // Segment flags 434db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner Elf32_Word p_align; // Segment alignment constraint 4356874a2ae033b7b5e1d0c10714e01d9c87480956aDan Gohman}; 4366874a2ae033b7b5e1d0c10714e01d9c87480956aDan Gohman 4371df9859c40492511b8aa4321eb76496005d3b75bDuncan Sands// Program header for ELF64. 4386874a2ae033b7b5e1d0c10714e01d9c87480956aDan Gohmanstruct Elf64_Phdr { 4396874a2ae033b7b5e1d0c10714e01d9c87480956aDan Gohman Elf64_Word p_type; // Type of segment 4406874a2ae033b7b5e1d0c10714e01d9c87480956aDan Gohman Elf64_Word p_flags; // Segment flags 4419d28fdd7225b344789ed7f54cf51b4019763b30bMikhail Glushenkov Elf64_Off p_offset; // File offset where segment is located, in bytes 442941db495b8233a3753ce72a84021f677073ff4eaChris Lattner Elf64_Addr p_vaddr; // Virtual address of beginning of segment 443941db495b8233a3753ce72a84021f677073ff4eaChris Lattner Elf64_Addr p_paddr; // Physical address of beginning of segment (OS-specific) 444727c21084d2f96c25b0ec1bc9a03cb88105a417cChris Lattner Elf64_Xword p_filesz; // Num. of bytes in file image of segment (may be zero) 445727c21084d2f96c25b0ec1bc9a03cb88105a417cChris Lattner Elf64_Xword p_memsz; // Num. of bytes in mem image of segment (may be zero) 446727c21084d2f96c25b0ec1bc9a03cb88105a417cChris Lattner Elf64_Xword p_align; // Segment alignment constraint 447941db495b8233a3753ce72a84021f677073ff4eaChris Lattner}; 44836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 44936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Segment types. 450941db495b8233a3753ce72a84021f677073ff4eaChris Lattnerenum { 45136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PT_NULL = 0, // Unused segment. 452941db495b8233a3753ce72a84021f677073ff4eaChris Lattner PT_LOAD = 1, // Loadable segment. 453941db495b8233a3753ce72a84021f677073ff4eaChris Lattner PT_DYNAMIC = 2, // Dynamic linking information. 454941db495b8233a3753ce72a84021f677073ff4eaChris Lattner PT_INTERP = 3, // Interpreter pathname. 455941db495b8233a3753ce72a84021f677073ff4eaChris Lattner PT_NOTE = 4, // Auxiliary information. 456941db495b8233a3753ce72a84021f677073ff4eaChris Lattner PT_SHLIB = 5, // Reserved. 457941db495b8233a3753ce72a84021f677073ff4eaChris Lattner PT_PHDR = 6, // The program header table itself. 458941db495b8233a3753ce72a84021f677073ff4eaChris Lattner PT_LOPROC = 0x70000000, // Lowest processor-specific program hdr entry type. 45936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines PT_HIPROC = 0x7fffffff // Highest processor-specific program hdr entry type. 46036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines}; 461941db495b8233a3753ce72a84021f677073ff4eaChris Lattner 46236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines// Segment flag bits. 463727c21084d2f96c25b0ec1bc9a03cb88105a417cChris Lattnerenum { 464727c21084d2f96c25b0ec1bc9a03cb88105a417cChris Lattner PF_X = 1, // Execute 4659d28fdd7225b344789ed7f54cf51b4019763b30bMikhail Glushenkov PF_W = 2, // Write 466727c21084d2f96c25b0ec1bc9a03cb88105a417cChris Lattner PF_R = 4, // Read 467670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner PF_MASKPROC = 0xf0000000 // Unspecified 468670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner}; 469670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner 470670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner// Dynamic table entry for ELF32. 471670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattnerstruct Elf32_Dyn 47236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines{ 473727c21084d2f96c25b0ec1bc9a03cb88105a417cChris Lattner Elf32_Sword d_tag; // Type of dynamic table entry. 474941db495b8233a3753ce72a84021f677073ff4eaChris Lattner union 475dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines { 4769d28fdd7225b344789ed7f54cf51b4019763b30bMikhail Glushenkov Elf32_Word d_val; // Integer value of entry. 477bb46f52027416598a662dc1c58f48d9d56b1a65bRafael Espindola Elf32_Addr d_ptr; // Pointer value of entry. 478670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner } d_un; 479db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner}; 480fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman 481670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner// Dynamic table entry for ELF64. 482670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattnerstruct Elf64_Dyn 483670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner{ 484998182b3802d2be8d081ca484b5d4fd5e1188950Chris Lattner Elf64_Sxword d_tag; // Type of dynamic table entry. 485998182b3802d2be8d081ca484b5d4fd5e1188950Chris Lattner union 486998182b3802d2be8d081ca484b5d4fd5e1188950Chris Lattner { 48736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines Elf64_Xword d_val; // Integer value of entry. 4889d28fdd7225b344789ed7f54cf51b4019763b30bMikhail Glushenkov Elf64_Addr d_ptr; // Pointer value of entry. 489db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner } d_un; 490670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner}; 49136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 492670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner// Dynamic table entry tags. 493a1f00f4d488eb5daff52faaf99c62ee652fd3b85Chris Lattnerenum { 494670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner DT_NULL = 0, // Marks end of dynamic array. 4957b550ccfc5a3346c17e0390a59e2d6d19bc52705Chris Lattner DT_NEEDED = 1, // String table offset of needed library. 496670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner DT_PLTRELSZ = 2, // Size of relocation entries in PLT. 497fe09b2098ac483f6d6ce6ea4ab237a9539bdb6b9Daniel Dunbar DT_PLTGOT = 3, // Address associated with linkage table. 498ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg DT_HASH = 4, // Address of symbolic hash table. 4993d29df3e8a203b167d8071ea6f805b21db18a5afOwen Anderson DT_STRTAB = 5, // Address of dynamic string table. 500670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner DT_SYMTAB = 6, // Address of dynamic symbol table. 501670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner DT_RELA = 7, // Address of relocation table (Rela entries). 5029d28fdd7225b344789ed7f54cf51b4019763b30bMikhail Glushenkov DT_RELASZ = 8, // Size of Rela relocation table. 503998182b3802d2be8d081ca484b5d4fd5e1188950Chris Lattner DT_RELAENT = 9, // Size of a Rela relocation entry. 504998182b3802d2be8d081ca484b5d4fd5e1188950Chris Lattner DT_STRSZ = 10, // Total size of the string table. 505998182b3802d2be8d081ca484b5d4fd5e1188950Chris Lattner DT_SYMENT = 11, // Size of a symbol table entry. 506998182b3802d2be8d081ca484b5d4fd5e1188950Chris Lattner DT_INIT = 12, // Address of initialization function. 507998182b3802d2be8d081ca484b5d4fd5e1188950Chris Lattner DT_FINI = 13, // Address of termination function. 50836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DT_SONAME = 14, // String table offset of a shared objects name. 509998182b3802d2be8d081ca484b5d4fd5e1188950Chris Lattner DT_RPATH = 15, // String table offset of library search path. 510670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner DT_SYMBOLIC = 16, // Changes symbol resolution algorithm. 511db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner DT_REL = 17, // Address of relocation table (Rel entries). 512670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner DT_RELSZ = 18, // Size of Rel relocation table. 513db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner DT_RELENT = 19, // Size of a Rel relocation entry. 514670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner DT_PLTREL = 20, // Type of relocation entry used for linking. 515670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner DT_DEBUG = 21, // Reserved for debugger. 516998182b3802d2be8d081ca484b5d4fd5e1188950Chris Lattner DT_TEXTREL = 22, // Relocations exist for non-writable segements. 517670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner DT_JMPREL = 23, // Address of relocations associated with PLT. 5181f21ef1511ce003fc177121b980e783b83992f82Chris Lattner DT_BIND_NOW = 24, // Process all relocations before execution. 519dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines DT_INIT_ARRAY = 25, // Pointer to array of initialization functions. 520670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner DT_FINI_ARRAY = 26, // Pointer to array of termination functions. 5219d28fdd7225b344789ed7f54cf51b4019763b30bMikhail Glushenkov DT_INIT_ARRAYSZ = 27, // Size of DT_INIT_ARRAY. 52236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DT_FINI_ARRAYSZ = 28, // Size of DT_FINI_ARRAY. 52336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines DT_LOOS = 0x60000000, // Start of environment specific tags. 524670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner DT_HIOS = 0x6FFFFFFF, // End of environment specific tags. 525a1f00f4d488eb5daff52faaf99c62ee652fd3b85Chris Lattner DT_LOPROC = 0x70000000, // Start of processor specific tags. 526670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner DT_HIPROC = 0x7FFFFFFF // End of processor specific tags. 527670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner}; 5287b550ccfc5a3346c17e0390a59e2d6d19bc52705Chris Lattner 529670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner} // end namespace ELF 530fe09b2098ac483f6d6ce6ea4ab237a9539bdb6b9Daniel Dunbar 531ce718ff9f42c7da092eaa01dd0242e8d5ba84713Hans Wennborg} // end namespace llvm 532e9b11b431308f4766b73cda93e38ec930c912122Owen Anderson 533670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner#endif 534670c889ac90e79fc6b1f9f18e78e536562d86f87Chris Lattner