ELF.h revision e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6
1551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer//===-- llvm/Support/ELF.h - ELF constants and data structures --*- C++ -*-===// 263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman// 36c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// The LLVM Compiler Infrastructure 46c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman// 86c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke//===----------------------------------------------------------------------===// 96c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// 106c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// This header contains common, non-processor-specific data structures and 116c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// constants for the ELF file format. 1263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman// 13e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaeke// The details of the ELF32 bits in this file are largely based on 14e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaeke// the Tool Interface Standard (TIS) Executable and Linking Format 15e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaeke// (ELF) Specification Version 1.2, May 1995. The ELF64 stuff is not 16e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaeke// standardized, as far as I can tell. It was largely based on information 17e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaeke// I found in OpenBSD header files. 186c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// 196c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke//===----------------------------------------------------------------------===// 206c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 21551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#ifndef LLVM_SUPPORT_ELF_H 22551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#define LLVM_SUPPORT_ELF_H 23551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer 248b67f774e9c38b7718b2b300b628388f966df4e0Chandler Carruth#include "llvm/System/DataTypes.h" 256c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke#include <cstring> 266c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 276c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekenamespace llvm { 286c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 296c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekenamespace ELF { 306c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 316c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeketypedef uint32_t Elf32_Addr; // Program address 326c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeketypedef uint16_t Elf32_Half; 336c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeketypedef uint32_t Elf32_Off; // File offset 346c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeketypedef int32_t Elf32_Sword; 356c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeketypedef uint32_t Elf32_Word; 366c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 37620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeketypedef uint64_t Elf64_Addr; 38620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeketypedef uint64_t Elf64_Off; 39620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeketypedef int32_t Elf64_Shalf; 40620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeketypedef int32_t Elf64_Sword; 41620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeketypedef uint32_t Elf64_Word; 42620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeketypedef int64_t Elf64_Sxword; 43620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeketypedef uint64_t Elf64_Xword; 44620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeketypedef uint32_t Elf64_Half; 45620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeketypedef uint16_t Elf64_Quarter; 46620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke 476c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Object file magic string. 48757c1f9d87b516a1e3bc4cd678245b207ae9c559Brian Gaekestatic const char ElfMagic[] = { 0x7f, 'E', 'L', 'F', '\0' }; 496c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 506c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekestruct Elf32_Ehdr { 516c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke unsigned char e_ident[16]; // ELF Identification bytes 526c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Half e_type; // Type of file (see ET_* below) 536c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Half e_machine; // Required architecture for this file (see EM_*) 546c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word e_version; // Must be equal to 1 556c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Addr e_entry; // Address to jump to in order to start program 566c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Off e_phoff; // Program header table's file offset, in bytes 576c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Off e_shoff; // Section header table's file offset, in bytes 586c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word e_flags; // Processor-specific flags 596c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Half e_ehsize; // Size of ELF header, in bytes 606c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Half e_phentsize; // Size of an entry in the program header table 616c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Half e_phnum; // Number of entries in the program header table 626c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Half e_shentsize; // Size of an entry in the section header table 636c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Half e_shnum; // Number of entries in the section header table 646c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Half e_shstrndx; // Sect hdr table index of sect name string table 656c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke bool checkMagic () const { 66757c1f9d87b516a1e3bc4cd678245b207ae9c559Brian Gaeke return (memcmp (e_ident, ElfMagic, strlen (ElfMagic))) == 0; 676c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke } 686c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke unsigned char getFileClass () const { return e_ident[4]; } 696c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke unsigned char getDataEncoding () { return e_ident[5]; } 706c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 716c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 72620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke// 64-bit ELF header. Fields are the same as for ELF32, but with different 73620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke// types (see above). 74e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaekestruct Elf64_Ehdr { 75620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke unsigned char e_ident[16]; 76620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Quarter e_type; 77620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Quarter e_machine; 78620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Half e_version; 79620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Addr e_entry; 80620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Off e_phoff; 81620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Off e_shoff; 82620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Half e_flags; 83620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Quarter e_ehsize; 84620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Quarter e_phentsize; 85620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Quarter e_phnum; 86620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Quarter e_shentsize; 87620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Quarter e_shnum; 88620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Quarter e_shstrndx; 89e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaeke}; 90620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke 916c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// File types 926c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeenum { 936c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ET_NONE = 0, // No file type 946c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ET_REL = 1, // Relocatable file 956c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ET_EXEC = 2, // Executable file 966c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ET_DYN = 3, // Shared object file 976c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ET_CORE = 4, // Core file 986c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ET_LOPROC = 0xff00, // Beginning of processor-specific codes 996c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ET_HIPROC = 0xffff // Processor-specific 1006c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 1016c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 1025af8f421b6412e52530608097e39d2602195629fDan Gohman// Versioning 1035af8f421b6412e52530608097e39d2602195629fDan Gohmanenum { 1045af8f421b6412e52530608097e39d2602195629fDan Gohman EV_NONE = 0, 1055af8f421b6412e52530608097e39d2602195629fDan Gohman EV_CURRENT = 1 1065af8f421b6412e52530608097e39d2602195629fDan Gohman}; 1075af8f421b6412e52530608097e39d2602195629fDan Gohman 1086c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Machine architectures 1096c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeenum { 1106c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke EM_NONE = 0, // No machine 1116c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke EM_M32 = 1, // AT&T WE 32100 1126c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke EM_SPARC = 2, // SPARC 1136c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke EM_386 = 3, // Intel 386 1146c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke EM_68K = 4, // Motorola 68000 1156c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke EM_88K = 5, // Motorola 88000 116620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke EM_486 = 6, // Intel 486 (deprecated) 1176c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke EM_860 = 7, // Intel 80860 118620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke EM_MIPS = 8, // MIPS R3000 119620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke EM_PPC = 20, // PowerPC 120620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke EM_ARM = 40, // ARM 121620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke EM_ALPHA = 41, // DEC Alpha 122cc5fc60468a1915049ef19a549fe4a6ae8708a00Bruno Cardoso Lopes EM_SPARCV9 = 43, // SPARC V9 123cc5fc60468a1915049ef19a549fe4a6ae8708a00Bruno Cardoso Lopes EM_X86_64 = 62 // AMD64 1246c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 1256c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 1266c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Object file classes. 1276c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeenum { 1286c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ELFCLASS32 = 1, // 32-bit object file 1296c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ELFCLASS64 = 2 // 64-bit object file 1306c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 1316c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 1326c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Object file byte orderings. 1336c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeenum { 1346c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ELFDATA2LSB = 1, // Little-endian object file 1356c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke ELFDATA2MSB = 2 // Big-endian object file 1366c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 1376c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 138e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming// OS ABI identification. 1395af8f421b6412e52530608097e39d2602195629fDan Gohmanenum { 140e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_NONE = 0, // UNIX System V ABI 141e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_HPUX = 1, // HP-UX operating system 142e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_NETBSD = 2, // NetBSD 143e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_LINUX = 3, // GNU/Linux 144e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_HURD = 4, // GNU/Hurd 145e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_SOLARIS = 6, // Solaris 146e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_AIX = 7, // AIX 147e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_IRIX = 8, // IRIX 148e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_FREEBSD = 9, // FreeBSD 149e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_TRU64 = 10, // TRU64 UNIX 150e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_MODESTO = 11, // Novell Modesto 151e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_OPENBSD = 12, // OpenBSD 152e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_OPENVMS = 13, // OpenVMS 153e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_NSK = 14, // Hewlett-Packard Non-Stop Kernel 154e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_AROS = 15, // AROS 155e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_FENIXOS = 16, // FenixOS 156e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_C6000_ELFABI = 64, // Bare-metal TMS320C6000 157e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_C6000_LINUX = 65, // Linux TMS320C6000 158e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_ARM = 97, // ARM 159e07cc5dab102c0f8c3f66c2703c95e547d6bf1c6Matt Fleming ELFOSABI_STANDALONE = 255 // Standalone (embedded) application 1605af8f421b6412e52530608097e39d2602195629fDan Gohman}; 1615af8f421b6412e52530608097e39d2602195629fDan Gohman 1626c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Section header. 1636c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekestruct Elf32_Shdr { 1646c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word sh_name; // Section name (index into string table) 1656c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word sh_type; // Section type (SHT_*) 1666c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word sh_flags; // Section flags (SHF_*) 1676c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Addr sh_addr; // Address where section is to be loaded 1686c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Off sh_offset; // File offset of section data, in bytes 1696c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word sh_size; // Size of section, in bytes 17063b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman Elf32_Word sh_link; // Section type-specific header table index link 1716c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word sh_info; // Section type-specific extra information 1726c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word sh_addralign; // Section address alignment 1736c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word sh_entsize; // Size of records contained within the section 1746c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 1756c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 176620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke// Section header for ELF64 - same fields as ELF32, different types. 177e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaekestruct Elf64_Shdr { 178620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Half sh_name; 179620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Half sh_type; 180620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Xword sh_flags; 181620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Addr sh_addr; 182620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Off sh_offset; 183620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Xword sh_size; 184620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Half sh_link; 185620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Half sh_info; 186620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Xword sh_addralign; 187620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke Elf64_Xword sh_entsize; 188e9f6f2c0492af8097166f1b7d62f131f20ca5714Brian Gaeke}; 189620ee02353d8b65959dc01a66b073adfcdef9eacBrian Gaeke 1906c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Special section indices. 1916c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeenum { 1926c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHN_UNDEF = 0, // Undefined, missing, irrelevant, or meaningless 1936c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHN_LORESERVE = 0xff00, // Lowest reserved index 1946c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHN_LOPROC = 0xff00, // Lowest processor-specific index 1956c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHN_HIPROC = 0xff1f, // Highest processor-specific index 1966c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHN_ABS = 0xfff1, // Symbol has absolute value; does not need relocation 1976c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHN_COMMON = 0xfff2, // FORTRAN COMMON or C external global variables 1986c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHN_HIRESERVE = 0xffff // Highest reserved index 1996c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 2006c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 2016c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Section types. 2026c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeenum { 2036c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHT_NULL = 0, // No associated section (inactive entry). 2046c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHT_PROGBITS = 1, // Program-defined contents. 2056c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHT_SYMTAB = 2, // Symbol table. 2066c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHT_STRTAB = 3, // String table. 2076c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHT_RELA = 4, // Relocation entries; explicit addends. 2086c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHT_HASH = 5, // Symbol hash table. 2096c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHT_DYNAMIC = 6, // Information for dynamic linking. 2106c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHT_NOTE = 7, // Information about the file. 2116c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHT_NOBITS = 8, // Data occupies no space in the file. 2126c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHT_REL = 9, // Relocation entries; no explicit addends. 2136c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHT_SHLIB = 10, // Reserved. 2146c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHT_DYNSYM = 11, // Symbol table. 2156c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHT_LOPROC = 0x70000000, // Lowest processor architecture-specific type. 2166c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHT_HIPROC = 0x7fffffff, // Highest processor architecture-specific type. 2176c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHT_LOUSER = 0x80000000, // Lowest type reserved for applications. 2186c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHT_HIUSER = 0xffffffff // Highest type reserved for applications. 2196c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 2206c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 2216c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Section flags. 2226c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeenum { 2236c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHF_WRITE = 0x1, // Section data should be writable during execution. 2246c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHF_ALLOC = 0x2, // Section occupies memory during program execution. 2256c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHF_EXECINSTR = 0x4, // Section contains executable machine instructions. 2266c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke SHF_MASKPROC = 0xf0000000 // Bits indicating processor-specific flags. 2276c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 2286c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 2296c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Symbol table entries. 2306c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekestruct Elf32_Sym { 2316c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word st_name; // Symbol name (index into string table) 2326c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Addr st_value; // Value or address associated with the symbol 2336c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word st_size; // Size of the symbol 2346c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke unsigned char st_info; // Symbol's type and binding attributes 2356c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke unsigned char st_other; // Must be zero; reserved 2366c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Half st_shndx; // Which section (header table index) it's defined in 23763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman 2386c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke // These accessors and mutators correspond to the ELF32_ST_BIND, 2396c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke // ELF32_ST_TYPE, and ELF32_ST_INFO macros defined in the ELF specification: 2406c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke unsigned char getBinding () const { return st_info >> 4; } 2416c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke unsigned char getType () const { return st_info & 0x0f; } 2426c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke void setBinding (unsigned char b) { setBindingAndType (b, getType ()); } 2436c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke void setType (unsigned char t) { setBindingAndType (getBinding (), t); } 2446c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke void setBindingAndType (unsigned char b, unsigned char t) { 2456c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke st_info = (b << 4) + (t & 0x0f); 2466c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke } 2476c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 2486c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 2496c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Symbol bindings. 2506c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeenum { 2516c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STB_LOCAL = 0, // Local symbol, not visible outside obj file containing def 2526c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STB_GLOBAL = 1, // Global symbol, visible to all object files being combined 2536c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STB_WEAK = 2, // Weak symbol, like global but lower-precedence 2546c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STB_LOPROC = 13, // Lowest processor-specific binding type 2556c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STB_HIPROC = 15 // Highest processor-specific binding type 2566c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 2576c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 2586c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Symbol types. 2596c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeenum { 2606c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STT_NOTYPE = 0, // Symbol's type is not specified 2616c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STT_OBJECT = 1, // Symbol is a data object (variable, array, etc.) 2626c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STT_FUNC = 2, // Symbol is executable code (function, etc.) 2636c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STT_SECTION = 3, // Symbol refers to a section 2646c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STT_FILE = 4, // Local, absolute symbol that refers to a file 2656c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STT_LOPROC = 13, // Lowest processor-specific symbol type 2666c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke STT_HIPROC = 15 // Highest processor-specific symbol type 2676c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 2686c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 2696c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Relocation entry, without explicit addend. 2706c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekestruct Elf32_Rel { 27163b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman Elf32_Addr r_offset; // Location (file byte offset, or program virtual addr) 2726c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word r_info; // Symbol table index and type of relocation to apply 27363b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman 2746c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke // These accessors and mutators correspond to the ELF32_R_SYM, ELF32_R_TYPE, 2756c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke // and ELF32_R_INFO macros defined in the ELF specification: 2766c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word getSymbol () const { return (r_info >> 8); } 2776c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke unsigned char getType () const { return (unsigned char) (r_info & 0x0ff); } 278757c1f9d87b516a1e3bc4cd678245b207ae9c559Brian Gaeke void setSymbol (Elf32_Word s) { setSymbolAndType (s, getType ()); } 279757c1f9d87b516a1e3bc4cd678245b207ae9c559Brian Gaeke void setType (unsigned char t) { setSymbolAndType (getSymbol(), t); } 2806c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke void setSymbolAndType (Elf32_Word s, unsigned char t) { 2816c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke r_info = (s << 8) + t; 2826c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke }; 2836c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 2846c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 2856c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Relocation entry with explicit addend. 2866c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekestruct Elf32_Rela { 28763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman Elf32_Addr r_offset; // Location (file byte offset, or program virtual addr) 2886c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word r_info; // Symbol table index and type of relocation to apply 2896c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Sword r_addend; // Compute value for relocatable field by adding this 29063b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman 2916c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke // These accessors and mutators correspond to the ELF32_R_SYM, ELF32_R_TYPE, 2926c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke // and ELF32_R_INFO macros defined in the ELF specification: 2936c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word getSymbol () const { return (r_info >> 8); } 2946c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke unsigned char getType () const { return (unsigned char) (r_info & 0x0ff); } 295757c1f9d87b516a1e3bc4cd678245b207ae9c559Brian Gaeke void setSymbol (Elf32_Word s) { setSymbolAndType (s, getType ()); } 296757c1f9d87b516a1e3bc4cd678245b207ae9c559Brian Gaeke void setType (unsigned char t) { setSymbolAndType (getSymbol(), t); } 2976c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke void setSymbolAndType (Elf32_Word s, unsigned char t) { 2986c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke r_info = (s << 8) + t; 2996c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke }; 3006c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 3016c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 3026c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke// Program header. 3036c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekestruct Elf32_Phdr { 3046c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word p_type; // Type of segment 3056c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Off p_offset; // File offset where segment is located, in bytes 3066c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Addr p_vaddr; // Virtual address of beginning of segment 3076c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Addr p_paddr; // Physical address of beginning of segment (OS-specific) 3086c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word p_filesz; // Num. of bytes in file image of segment (may be zero) 3096c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word p_memsz; // Num. of bytes in mem image of segment (may be zero) 3106c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word p_flags; // Segment flags 3116c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke Elf32_Word p_align; // Segment alignment constraint 3126c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 3136c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 3144e9ca339b56f082c6b2d7dd7d91f704801c0d4fdMikhail Glushenkov// Segment types. 3156c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaekeenum { 3166c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke PT_NULL = 0, // Unused segment. 3176c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke PT_LOAD = 1, // Loadable segment. 3186c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke PT_DYNAMIC = 2, // Dynamic linking information. 3196c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke PT_INTERP = 3, // Interpreter pathname. 3206c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke PT_NOTE = 4, // Auxiliary information. 3216c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke PT_SHLIB = 5, // Reserved. 3226c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke PT_PHDR = 6, // The program header table itself. 3236c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke PT_LOPROC = 0x70000000, // Lowest processor-specific program hdr entry type. 3246c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke PT_HIPROC = 0x7fffffff // Highest processor-specific program hdr entry type. 3256c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke}; 3266c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 3274e9ca339b56f082c6b2d7dd7d91f704801c0d4fdMikhail Glushenkov// Segment flag bits. 3284e9ca339b56f082c6b2d7dd7d91f704801c0d4fdMikhail Glushenkovenum { 3294e9ca339b56f082c6b2d7dd7d91f704801c0d4fdMikhail Glushenkov PF_X = 1, // Execute 3304e9ca339b56f082c6b2d7dd7d91f704801c0d4fdMikhail Glushenkov PF_W = 2, // Write 3314e9ca339b56f082c6b2d7dd7d91f704801c0d4fdMikhail Glushenkov PF_R = 4, // Read 3324e9ca339b56f082c6b2d7dd7d91f704801c0d4fdMikhail Glushenkov PF_MASKPROC = 0xf0000000 // Unspecified 3334e9ca339b56f082c6b2d7dd7d91f704801c0d4fdMikhail Glushenkov}; 3344e9ca339b56f082c6b2d7dd7d91f704801c0d4fdMikhail Glushenkov 3356c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke} // end namespace ELF 3366c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke 3376c39a42b5c93b6d0af008dbafed6134d1deaa848Brian Gaeke} // end namespace llvm 338551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer 339551ccae044b0ff658fe629dd67edd5ffe75d10e8Reid Spencer#endif 340