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