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