1210006Srdivacky//===-- llvm/Support/COFF.h -------------------------------------*- C++ -*-===// 2210006Srdivacky// 3210006Srdivacky// The LLVM Compiler Infrastructure 4210006Srdivacky// 5210006Srdivacky// This file is distributed under the University of Illinois Open Source 6210006Srdivacky// License. See LICENSE.TXT for details. 7210006Srdivacky// 8210006Srdivacky//===----------------------------------------------------------------------===// 9210006Srdivacky// 10210006Srdivacky// This file contains an definitions used in Windows COFF Files. 11210006Srdivacky// 12210006Srdivacky// Structures and enums defined within this file where created using 13210127Srdivacky// information from Microsoft's publicly available PE/COFF format document: 14218893Sdim// 15210006Srdivacky// Microsoft Portable Executable and Common Object File Format Specification 16210006Srdivacky// Revision 8.1 - February 15, 2008 17210006Srdivacky// 18210127Srdivacky// As of 5/2/2010, hosted by Microsoft at: 19210006Srdivacky// http://www.microsoft.com/whdc/system/platform/firmware/pecoff.mspx 20210006Srdivacky// 21210006Srdivacky//===----------------------------------------------------------------------===// 22210006Srdivacky 23249423Sdim#ifndef LLVM_SUPPORT_COFF_H 24249423Sdim#define LLVM_SUPPORT_COFF_H 25210006Srdivacky 26218893Sdim#include "llvm/Support/DataTypes.h" 27234353Sdim#include <cassert> 28210006Srdivacky#include <cstring> 29210006Srdivacky 30210006Srdivackynamespace llvm { 31210006Srdivackynamespace COFF { 32210006Srdivacky 33210006Srdivacky // Sizes in bytes of various things in the COFF format. 34210006Srdivacky enum { 35210006Srdivacky HeaderSize = 20, 36210006Srdivacky NameSize = 8, 37210006Srdivacky SymbolSize = 18, 38210006Srdivacky SectionSize = 40, 39210006Srdivacky RelocationSize = 10 40210006Srdivacky }; 41210006Srdivacky 42210006Srdivacky struct header { 43210006Srdivacky uint16_t Machine; 44210006Srdivacky uint16_t NumberOfSections; 45210006Srdivacky uint32_t TimeDateStamp; 46210006Srdivacky uint32_t PointerToSymbolTable; 47210006Srdivacky uint32_t NumberOfSymbols; 48210006Srdivacky uint16_t SizeOfOptionalHeader; 49210006Srdivacky uint16_t Characteristics; 50210006Srdivacky }; 51210006Srdivacky 52212904Sdim enum MachineTypes { 53239462Sdim MT_Invalid = 0xffff, 54239462Sdim 55234353Sdim IMAGE_FILE_MACHINE_UNKNOWN = 0x0, 56234353Sdim IMAGE_FILE_MACHINE_AM33 = 0x13, 57234353Sdim IMAGE_FILE_MACHINE_AMD64 = 0x8664, 58234353Sdim IMAGE_FILE_MACHINE_ARM = 0x1C0, 59234353Sdim IMAGE_FILE_MACHINE_ARMV7 = 0x1C4, 60234353Sdim IMAGE_FILE_MACHINE_EBC = 0xEBC, 61234353Sdim IMAGE_FILE_MACHINE_I386 = 0x14C, 62234353Sdim IMAGE_FILE_MACHINE_IA64 = 0x200, 63234353Sdim IMAGE_FILE_MACHINE_M32R = 0x9041, 64234353Sdim IMAGE_FILE_MACHINE_MIPS16 = 0x266, 65234353Sdim IMAGE_FILE_MACHINE_MIPSFPU = 0x366, 66234353Sdim IMAGE_FILE_MACHINE_MIPSFPU16 = 0x466, 67234353Sdim IMAGE_FILE_MACHINE_POWERPC = 0x1F0, 68234353Sdim IMAGE_FILE_MACHINE_POWERPCFP = 0x1F1, 69234353Sdim IMAGE_FILE_MACHINE_R4000 = 0x166, 70234353Sdim IMAGE_FILE_MACHINE_SH3 = 0x1A2, 71234353Sdim IMAGE_FILE_MACHINE_SH3DSP = 0x1A3, 72234353Sdim IMAGE_FILE_MACHINE_SH4 = 0x1A6, 73234353Sdim IMAGE_FILE_MACHINE_SH5 = 0x1A8, 74234353Sdim IMAGE_FILE_MACHINE_THUMB = 0x1C2, 75234353Sdim IMAGE_FILE_MACHINE_WCEMIPSV2 = 0x169 76212904Sdim }; 77212904Sdim 78234353Sdim enum Characteristics { 79239462Sdim C_Invalid = 0, 80239462Sdim 81234353Sdim /// The file does not contain base relocations and must be loaded at its 82234353Sdim /// preferred base. If this cannot be done, the loader will error. 83234353Sdim IMAGE_FILE_RELOCS_STRIPPED = 0x0001, 84234353Sdim /// The file is valid and can be run. 85234353Sdim IMAGE_FILE_EXECUTABLE_IMAGE = 0x0002, 86234353Sdim /// COFF line numbers have been stripped. This is deprecated and should be 87234353Sdim /// 0. 88234353Sdim IMAGE_FILE_LINE_NUMS_STRIPPED = 0x0004, 89234353Sdim /// COFF symbol table entries for local symbols have been removed. This is 90234353Sdim /// deprecated and should be 0. 91234353Sdim IMAGE_FILE_LOCAL_SYMS_STRIPPED = 0x0008, 92234353Sdim /// Aggressively trim working set. This is deprecated and must be 0. 93234353Sdim IMAGE_FILE_AGGRESSIVE_WS_TRIM = 0x0010, 94234353Sdim /// Image can handle > 2GiB addresses. 95234353Sdim IMAGE_FILE_LARGE_ADDRESS_AWARE = 0x0020, 96234353Sdim /// Little endian: the LSB precedes the MSB in memory. This is deprecated 97234353Sdim /// and should be 0. 98234353Sdim IMAGE_FILE_BYTES_REVERSED_LO = 0x0080, 99234353Sdim /// Machine is based on a 32bit word architecture. 100234353Sdim IMAGE_FILE_32BIT_MACHINE = 0x0100, 101234353Sdim /// Debugging info has been removed. 102234353Sdim IMAGE_FILE_DEBUG_STRIPPED = 0x0200, 103234353Sdim /// If the image is on removable media, fully load it and copy it to swap. 104234353Sdim IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = 0x0400, 105234353Sdim /// If the image is on network media, fully load it and copy it to swap. 106234353Sdim IMAGE_FILE_NET_RUN_FROM_SWAP = 0x0800, 107234353Sdim /// The image file is a system file, not a user program. 108234353Sdim IMAGE_FILE_SYSTEM = 0x1000, 109234353Sdim /// The image file is a DLL. 110234353Sdim IMAGE_FILE_DLL = 0x2000, 111234353Sdim /// This file should only be run on a uniprocessor machine. 112234353Sdim IMAGE_FILE_UP_SYSTEM_ONLY = 0x4000, 113234353Sdim /// Big endian: the MSB precedes the LSB in memory. This is deprecated 114234353Sdim /// and should be 0. 115234353Sdim IMAGE_FILE_BYTES_REVERSED_HI = 0x8000 116234353Sdim }; 117234353Sdim 118210006Srdivacky struct symbol { 119210006Srdivacky char Name[NameSize]; 120210006Srdivacky uint32_t Value; 121239462Sdim uint16_t SectionNumber; 122210006Srdivacky uint16_t Type; 123210006Srdivacky uint8_t StorageClass; 124210006Srdivacky uint8_t NumberOfAuxSymbols; 125210006Srdivacky }; 126210006Srdivacky 127210127Srdivacky enum SymbolFlags { 128210006Srdivacky SF_TypeMask = 0x0000FFFF, 129210006Srdivacky SF_TypeShift = 0, 130210006Srdivacky 131210006Srdivacky SF_ClassMask = 0x00FF0000, 132210006Srdivacky SF_ClassShift = 16, 133210006Srdivacky 134218893Sdim SF_WeakExternal = 0x01000000 135210006Srdivacky }; 136210006Srdivacky 137212904Sdim enum SymbolSectionNumber { 138212904Sdim IMAGE_SYM_DEBUG = -2, 139212904Sdim IMAGE_SYM_ABSOLUTE = -1, 140212904Sdim IMAGE_SYM_UNDEFINED = 0 141212904Sdim }; 142212904Sdim 143210127Srdivacky /// Storage class tells where and what the symbol represents 144210127Srdivacky enum SymbolStorageClass { 145239462Sdim SSC_Invalid = 0xff, 146239462Sdim 147210127Srdivacky IMAGE_SYM_CLASS_END_OF_FUNCTION = -1, ///< Physical end of function 148210127Srdivacky IMAGE_SYM_CLASS_NULL = 0, ///< No symbol 149210127Srdivacky IMAGE_SYM_CLASS_AUTOMATIC = 1, ///< Stack variable 150210127Srdivacky IMAGE_SYM_CLASS_EXTERNAL = 2, ///< External symbol 151210127Srdivacky IMAGE_SYM_CLASS_STATIC = 3, ///< Static 152210127Srdivacky IMAGE_SYM_CLASS_REGISTER = 4, ///< Register variable 153210127Srdivacky IMAGE_SYM_CLASS_EXTERNAL_DEF = 5, ///< External definition 154210127Srdivacky IMAGE_SYM_CLASS_LABEL = 6, ///< Label 155210127Srdivacky IMAGE_SYM_CLASS_UNDEFINED_LABEL = 7, ///< Undefined label 156210127Srdivacky IMAGE_SYM_CLASS_MEMBER_OF_STRUCT = 8, ///< Member of structure 157210127Srdivacky IMAGE_SYM_CLASS_ARGUMENT = 9, ///< Function argument 158210127Srdivacky IMAGE_SYM_CLASS_STRUCT_TAG = 10, ///< Structure tag 159210127Srdivacky IMAGE_SYM_CLASS_MEMBER_OF_UNION = 11, ///< Member of union 160210127Srdivacky IMAGE_SYM_CLASS_UNION_TAG = 12, ///< Union tag 161210127Srdivacky IMAGE_SYM_CLASS_TYPE_DEFINITION = 13, ///< Type definition 162210127Srdivacky IMAGE_SYM_CLASS_UNDEFINED_STATIC = 14, ///< Undefined static 163210127Srdivacky IMAGE_SYM_CLASS_ENUM_TAG = 15, ///< Enumeration tag 164210127Srdivacky IMAGE_SYM_CLASS_MEMBER_OF_ENUM = 16, ///< Member of enumeration 165210127Srdivacky IMAGE_SYM_CLASS_REGISTER_PARAM = 17, ///< Register parameter 166210127Srdivacky IMAGE_SYM_CLASS_BIT_FIELD = 18, ///< Bit field 167210127Srdivacky /// ".bb" or ".eb" - beginning or end of block 168210006Srdivacky IMAGE_SYM_CLASS_BLOCK = 100, 169210127Srdivacky /// ".bf" or ".ef" - beginning or end of function 170210006Srdivacky IMAGE_SYM_CLASS_FUNCTION = 101, 171210127Srdivacky IMAGE_SYM_CLASS_END_OF_STRUCT = 102, ///< End of structure 172210127Srdivacky IMAGE_SYM_CLASS_FILE = 103, ///< File name 173210127Srdivacky /// Line number, reformatted as symbol 174210006Srdivacky IMAGE_SYM_CLASS_SECTION = 104, 175210127Srdivacky IMAGE_SYM_CLASS_WEAK_EXTERNAL = 105, ///< Duplicate tag 176210127Srdivacky /// External symbol in dmert public lib 177210006Srdivacky IMAGE_SYM_CLASS_CLR_TOKEN = 107 178210006Srdivacky }; 179210006Srdivacky 180210127Srdivacky enum SymbolBaseType { 181210127Srdivacky IMAGE_SYM_TYPE_NULL = 0, ///< No type information or unknown base type. 182210127Srdivacky IMAGE_SYM_TYPE_VOID = 1, ///< Used with void pointers and functions. 183210127Srdivacky IMAGE_SYM_TYPE_CHAR = 2, ///< A character (signed byte). 184210127Srdivacky IMAGE_SYM_TYPE_SHORT = 3, ///< A 2-byte signed integer. 185210127Srdivacky IMAGE_SYM_TYPE_INT = 4, ///< A natural integer type on the target. 186210127Srdivacky IMAGE_SYM_TYPE_LONG = 5, ///< A 4-byte signed integer. 187210127Srdivacky IMAGE_SYM_TYPE_FLOAT = 6, ///< A 4-byte floating-point number. 188210127Srdivacky IMAGE_SYM_TYPE_DOUBLE = 7, ///< An 8-byte floating-point number. 189210127Srdivacky IMAGE_SYM_TYPE_STRUCT = 8, ///< A structure. 190210127Srdivacky IMAGE_SYM_TYPE_UNION = 9, ///< An union. 191210127Srdivacky IMAGE_SYM_TYPE_ENUM = 10, ///< An enumerated type. 192210127Srdivacky IMAGE_SYM_TYPE_MOE = 11, ///< A member of enumeration (a specific value). 193210127Srdivacky IMAGE_SYM_TYPE_BYTE = 12, ///< A byte; unsigned 1-byte integer. 194210127Srdivacky IMAGE_SYM_TYPE_WORD = 13, ///< A word; unsigned 2-byte integer. 195210127Srdivacky IMAGE_SYM_TYPE_UINT = 14, ///< An unsigned integer of natural size. 196210127Srdivacky IMAGE_SYM_TYPE_DWORD = 15 ///< An unsigned 4-byte integer. 197210127Srdivacky }; 198210127Srdivacky 199210127Srdivacky enum SymbolComplexType { 200218893Sdim IMAGE_SYM_DTYPE_NULL = 0, ///< No complex type; simple scalar variable. 201210127Srdivacky IMAGE_SYM_DTYPE_POINTER = 1, ///< A pointer to base type. 202210127Srdivacky IMAGE_SYM_DTYPE_FUNCTION = 2, ///< A function that returns a base type. 203210127Srdivacky IMAGE_SYM_DTYPE_ARRAY = 3, ///< An array of base type. 204218893Sdim 205210127Srdivacky /// Type is formed as (base + (derived << SCT_COMPLEX_TYPE_SHIFT)) 206218893Sdim SCT_COMPLEX_TYPE_SHIFT = 4 207210127Srdivacky }; 208210127Srdivacky 209210006Srdivacky struct section { 210210006Srdivacky char Name[NameSize]; 211210006Srdivacky uint32_t VirtualSize; 212210006Srdivacky uint32_t VirtualAddress; 213210006Srdivacky uint32_t SizeOfRawData; 214210006Srdivacky uint32_t PointerToRawData; 215210006Srdivacky uint32_t PointerToRelocations; 216210006Srdivacky uint32_t PointerToLineNumbers; 217210006Srdivacky uint16_t NumberOfRelocations; 218210006Srdivacky uint16_t NumberOfLineNumbers; 219210006Srdivacky uint32_t Characteristics; 220210006Srdivacky }; 221210006Srdivacky 222210127Srdivacky enum SectionCharacteristics { 223239462Sdim SC_Invalid = 0xffffffff, 224239462Sdim 225210006Srdivacky IMAGE_SCN_TYPE_NO_PAD = 0x00000008, 226210006Srdivacky IMAGE_SCN_CNT_CODE = 0x00000020, 227210006Srdivacky IMAGE_SCN_CNT_INITIALIZED_DATA = 0x00000040, 228210006Srdivacky IMAGE_SCN_CNT_UNINITIALIZED_DATA = 0x00000080, 229210006Srdivacky IMAGE_SCN_LNK_OTHER = 0x00000100, 230210006Srdivacky IMAGE_SCN_LNK_INFO = 0x00000200, 231210006Srdivacky IMAGE_SCN_LNK_REMOVE = 0x00000800, 232210006Srdivacky IMAGE_SCN_LNK_COMDAT = 0x00001000, 233210006Srdivacky IMAGE_SCN_GPREL = 0x00008000, 234210006Srdivacky IMAGE_SCN_MEM_PURGEABLE = 0x00020000, 235210006Srdivacky IMAGE_SCN_MEM_16BIT = 0x00020000, 236210006Srdivacky IMAGE_SCN_MEM_LOCKED = 0x00040000, 237210006Srdivacky IMAGE_SCN_MEM_PRELOAD = 0x00080000, 238210006Srdivacky IMAGE_SCN_ALIGN_1BYTES = 0x00100000, 239210006Srdivacky IMAGE_SCN_ALIGN_2BYTES = 0x00200000, 240210006Srdivacky IMAGE_SCN_ALIGN_4BYTES = 0x00300000, 241210006Srdivacky IMAGE_SCN_ALIGN_8BYTES = 0x00400000, 242210006Srdivacky IMAGE_SCN_ALIGN_16BYTES = 0x00500000, 243210006Srdivacky IMAGE_SCN_ALIGN_32BYTES = 0x00600000, 244210006Srdivacky IMAGE_SCN_ALIGN_64BYTES = 0x00700000, 245210006Srdivacky IMAGE_SCN_ALIGN_128BYTES = 0x00800000, 246210006Srdivacky IMAGE_SCN_ALIGN_256BYTES = 0x00900000, 247210006Srdivacky IMAGE_SCN_ALIGN_512BYTES = 0x00A00000, 248210006Srdivacky IMAGE_SCN_ALIGN_1024BYTES = 0x00B00000, 249210006Srdivacky IMAGE_SCN_ALIGN_2048BYTES = 0x00C00000, 250210006Srdivacky IMAGE_SCN_ALIGN_4096BYTES = 0x00D00000, 251210006Srdivacky IMAGE_SCN_ALIGN_8192BYTES = 0x00E00000, 252210006Srdivacky IMAGE_SCN_LNK_NRELOC_OVFL = 0x01000000, 253210006Srdivacky IMAGE_SCN_MEM_DISCARDABLE = 0x02000000, 254210006Srdivacky IMAGE_SCN_MEM_NOT_CACHED = 0x04000000, 255210006Srdivacky IMAGE_SCN_MEM_NOT_PAGED = 0x08000000, 256210006Srdivacky IMAGE_SCN_MEM_SHARED = 0x10000000, 257210006Srdivacky IMAGE_SCN_MEM_EXECUTE = 0x20000000, 258210006Srdivacky IMAGE_SCN_MEM_READ = 0x40000000, 259210006Srdivacky IMAGE_SCN_MEM_WRITE = 0x80000000 260210006Srdivacky }; 261210006Srdivacky 262210006Srdivacky struct relocation { 263210006Srdivacky uint32_t VirtualAddress; 264210006Srdivacky uint32_t SymbolTableIndex; 265210006Srdivacky uint16_t Type; 266210006Srdivacky }; 267210006Srdivacky 268210127Srdivacky enum RelocationTypeX86 { 269210006Srdivacky IMAGE_REL_I386_ABSOLUTE = 0x0000, 270210006Srdivacky IMAGE_REL_I386_DIR16 = 0x0001, 271210006Srdivacky IMAGE_REL_I386_REL16 = 0x0002, 272210006Srdivacky IMAGE_REL_I386_DIR32 = 0x0006, 273210006Srdivacky IMAGE_REL_I386_DIR32NB = 0x0007, 274210006Srdivacky IMAGE_REL_I386_SEG12 = 0x0009, 275210006Srdivacky IMAGE_REL_I386_SECTION = 0x000A, 276210006Srdivacky IMAGE_REL_I386_SECREL = 0x000B, 277210006Srdivacky IMAGE_REL_I386_TOKEN = 0x000C, 278210006Srdivacky IMAGE_REL_I386_SECREL7 = 0x000D, 279212904Sdim IMAGE_REL_I386_REL32 = 0x0014, 280212904Sdim 281212904Sdim IMAGE_REL_AMD64_ABSOLUTE = 0x0000, 282212904Sdim IMAGE_REL_AMD64_ADDR64 = 0x0001, 283212904Sdim IMAGE_REL_AMD64_ADDR32 = 0x0002, 284212904Sdim IMAGE_REL_AMD64_ADDR32NB = 0x0003, 285212904Sdim IMAGE_REL_AMD64_REL32 = 0x0004, 286212904Sdim IMAGE_REL_AMD64_REL32_1 = 0x0005, 287212904Sdim IMAGE_REL_AMD64_REL32_2 = 0x0006, 288212904Sdim IMAGE_REL_AMD64_REL32_3 = 0x0007, 289212904Sdim IMAGE_REL_AMD64_REL32_4 = 0x0008, 290212904Sdim IMAGE_REL_AMD64_REL32_5 = 0x0009, 291212904Sdim IMAGE_REL_AMD64_SECTION = 0x000A, 292212904Sdim IMAGE_REL_AMD64_SECREL = 0x000B, 293212904Sdim IMAGE_REL_AMD64_SECREL7 = 0x000C, 294212904Sdim IMAGE_REL_AMD64_TOKEN = 0x000D, 295212904Sdim IMAGE_REL_AMD64_SREL32 = 0x000E, 296212904Sdim IMAGE_REL_AMD64_PAIR = 0x000F, 297212904Sdim IMAGE_REL_AMD64_SSPAN32 = 0x0010 298210006Srdivacky }; 299210006Srdivacky 300234353Sdim enum RelocationTypesARM { 301234353Sdim IMAGE_REL_ARM_ABSOLUTE = 0x0000, 302234353Sdim IMAGE_REL_ARM_ADDR32 = 0x0001, 303234353Sdim IMAGE_REL_ARM_ADDR32NB = 0x0002, 304234353Sdim IMAGE_REL_ARM_BRANCH24 = 0x0003, 305234353Sdim IMAGE_REL_ARM_BRANCH11 = 0x0004, 306234353Sdim IMAGE_REL_ARM_TOKEN = 0x0005, 307234353Sdim IMAGE_REL_ARM_BLX24 = 0x0008, 308234353Sdim IMAGE_REL_ARM_BLX11 = 0x0009, 309234353Sdim IMAGE_REL_ARM_SECTION = 0x000E, 310234353Sdim IMAGE_REL_ARM_SECREL = 0x000F, 311234353Sdim IMAGE_REL_ARM_MOV32A = 0x0010, 312234353Sdim IMAGE_REL_ARM_MOV32T = 0x0011, 313234353Sdim IMAGE_REL_ARM_BRANCH20T = 0x0012, 314234353Sdim IMAGE_REL_ARM_BRANCH24T = 0x0014, 315234353Sdim IMAGE_REL_ARM_BLX23T = 0x0015 316234353Sdim }; 317234353Sdim 318212904Sdim enum COMDATType { 319210006Srdivacky IMAGE_COMDAT_SELECT_NODUPLICATES = 1, 320210006Srdivacky IMAGE_COMDAT_SELECT_ANY, 321210006Srdivacky IMAGE_COMDAT_SELECT_SAME_SIZE, 322210006Srdivacky IMAGE_COMDAT_SELECT_EXACT_MATCH, 323210006Srdivacky IMAGE_COMDAT_SELECT_ASSOCIATIVE, 324249423Sdim IMAGE_COMDAT_SELECT_LARGEST, 325249423Sdim IMAGE_COMDAT_SELECT_NEWEST 326210006Srdivacky }; 327210006Srdivacky 328212904Sdim // Auxiliary Symbol Formats 329212904Sdim struct AuxiliaryFunctionDefinition { 330212904Sdim uint32_t TagIndex; 331212904Sdim uint32_t TotalSize; 332212904Sdim uint32_t PointerToLinenumber; 333212904Sdim uint32_t PointerToNextFunction; 334212904Sdim uint8_t unused[2]; 335212904Sdim }; 336212904Sdim 337212904Sdim struct AuxiliarybfAndefSymbol { 338212904Sdim uint8_t unused1[4]; 339212904Sdim uint16_t Linenumber; 340212904Sdim uint8_t unused2[6]; 341212904Sdim uint32_t PointerToNextFunction; 342212904Sdim uint8_t unused3[2]; 343212904Sdim }; 344212904Sdim 345212904Sdim struct AuxiliaryWeakExternal { 346212904Sdim uint32_t TagIndex; 347212904Sdim uint32_t Characteristics; 348212904Sdim uint8_t unused[10]; 349212904Sdim }; 350212904Sdim 351212904Sdim /// These are not documented in the spec, but are located in WinNT.h. 352212904Sdim enum WeakExternalCharacteristics { 353212904Sdim IMAGE_WEAK_EXTERN_SEARCH_NOLIBRARY = 1, 354212904Sdim IMAGE_WEAK_EXTERN_SEARCH_LIBRARY = 2, 355212904Sdim IMAGE_WEAK_EXTERN_SEARCH_ALIAS = 3 356212904Sdim }; 357212904Sdim 358212904Sdim struct AuxiliaryFile { 359212904Sdim uint8_t FileName[18]; 360212904Sdim }; 361212904Sdim 362212904Sdim struct AuxiliarySectionDefinition { 363212904Sdim uint32_t Length; 364212904Sdim uint16_t NumberOfRelocations; 365212904Sdim uint16_t NumberOfLinenumbers; 366212904Sdim uint32_t CheckSum; 367212904Sdim uint16_t Number; 368212904Sdim uint8_t Selection; 369212904Sdim uint8_t unused[3]; 370212904Sdim }; 371212904Sdim 372212904Sdim union Auxiliary { 373212904Sdim AuxiliaryFunctionDefinition FunctionDefinition; 374212904Sdim AuxiliarybfAndefSymbol bfAndefSymbol; 375212904Sdim AuxiliaryWeakExternal WeakExternal; 376212904Sdim AuxiliaryFile File; 377212904Sdim AuxiliarySectionDefinition SectionDefinition; 378212904Sdim }; 379212904Sdim 380234353Sdim /// @brief The Import Directory Table. 381234353Sdim /// 382234353Sdim /// There is a single array of these and one entry per imported DLL. 383234353Sdim struct ImportDirectoryTableEntry { 384234353Sdim uint32_t ImportLookupTableRVA; 385234353Sdim uint32_t TimeDateStamp; 386234353Sdim uint32_t ForwarderChain; 387234353Sdim uint32_t NameRVA; 388234353Sdim uint32_t ImportAddressTableRVA; 389234353Sdim }; 390234353Sdim 391234353Sdim /// @brief The PE32 Import Lookup Table. 392234353Sdim /// 393234353Sdim /// There is an array of these for each imported DLL. It represents either 394234353Sdim /// the ordinal to import from the target DLL, or a name to lookup and import 395234353Sdim /// from the target DLL. 396234353Sdim /// 397234353Sdim /// This also happens to be the same format used by the Import Address Table 398234353Sdim /// when it is initially written out to the image. 399234353Sdim struct ImportLookupTableEntry32 { 400234353Sdim uint32_t data; 401234353Sdim 402234353Sdim /// @brief Is this entry specified by ordinal, or name? 403234353Sdim bool isOrdinal() const { return data & 0x80000000; } 404234353Sdim 405234353Sdim /// @brief Get the ordinal value of this entry. isOrdinal must be true. 406234353Sdim uint16_t getOrdinal() const { 407234353Sdim assert(isOrdinal() && "ILT entry is not an ordinal!"); 408234353Sdim return data & 0xFFFF; 409234353Sdim } 410234353Sdim 411234353Sdim /// @brief Set the ordinal value and set isOrdinal to true. 412234353Sdim void setOrdinal(uint16_t o) { 413234353Sdim data = o; 414234353Sdim data |= 0x80000000; 415234353Sdim } 416234353Sdim 417234353Sdim /// @brief Get the Hint/Name entry RVA. isOrdinal must be false. 418234353Sdim uint32_t getHintNameRVA() const { 419234353Sdim assert(!isOrdinal() && "ILT entry is not a Hint/Name RVA!"); 420234353Sdim return data; 421234353Sdim } 422234353Sdim 423234353Sdim /// @brief Set the Hint/Name entry RVA and set isOrdinal to false. 424234353Sdim void setHintNameRVA(uint32_t rva) { data = rva; } 425234353Sdim }; 426234353Sdim 427234353Sdim /// @brief The DOS compatible header at the front of all PEs. 428234353Sdim struct DOSHeader { 429234353Sdim uint16_t Magic; 430234353Sdim uint16_t UsedBytesInTheLastPage; 431234353Sdim uint16_t FileSizeInPages; 432234353Sdim uint16_t NumberOfRelocationItems; 433234353Sdim uint16_t HeaderSizeInParagraphs; 434234353Sdim uint16_t MinimumExtraParagraphs; 435234353Sdim uint16_t MaximumExtraParagraphs; 436234353Sdim uint16_t InitialRelativeSS; 437234353Sdim uint16_t InitialSP; 438234353Sdim uint16_t Checksum; 439234353Sdim uint16_t InitialIP; 440234353Sdim uint16_t InitialRelativeCS; 441234353Sdim uint16_t AddressOfRelocationTable; 442234353Sdim uint16_t OverlayNumber; 443234353Sdim uint16_t Reserved[4]; 444234353Sdim uint16_t OEMid; 445234353Sdim uint16_t OEMinfo; 446234353Sdim uint16_t Reserved2[10]; 447234353Sdim uint32_t AddressOfNewExeHeader; 448234353Sdim }; 449234353Sdim 450234353Sdim struct PEHeader { 451234353Sdim uint32_t Signature; 452234353Sdim header COFFHeader; 453234353Sdim uint16_t Magic; 454234353Sdim uint8_t MajorLinkerVersion; 455234353Sdim uint8_t MinorLinkerVersion; 456234353Sdim uint32_t SizeOfCode; 457234353Sdim uint32_t SizeOfInitializedData; 458234353Sdim uint32_t SizeOfUninitializedData; 459234353Sdim uint32_t AddressOfEntryPoint; // RVA 460234353Sdim uint32_t BaseOfCode; // RVA 461234353Sdim uint32_t BaseOfData; // RVA 462234353Sdim uint64_t ImageBase; 463234353Sdim uint32_t SectionAlignment; 464234353Sdim uint32_t FileAlignment; 465234353Sdim uint16_t MajorOperatingSystemVersion; 466234353Sdim uint16_t MinorOperatingSystemVersion; 467234353Sdim uint16_t MajorImageVersion; 468234353Sdim uint16_t MinorImageVersion; 469234353Sdim uint16_t MajorSubsystemVersion; 470234353Sdim uint16_t MinorSubsystemVersion; 471234353Sdim uint32_t Win32VersionValue; 472234353Sdim uint32_t SizeOfImage; 473234353Sdim uint32_t SizeOfHeaders; 474234353Sdim uint32_t CheckSum; 475234353Sdim uint16_t Subsystem; 476234353Sdim uint16_t DLLCharacteristics; 477234353Sdim uint64_t SizeOfStackReserve; 478234353Sdim uint64_t SizeOfStackCommit; 479234353Sdim uint64_t SizeOfHeapReserve; 480234353Sdim uint64_t SizeOfHeapCommit; 481234353Sdim uint32_t LoaderFlags; 482234353Sdim uint32_t NumberOfRvaAndSize; 483234353Sdim }; 484234353Sdim 485234353Sdim struct DataDirectory { 486234353Sdim uint32_t RelativeVirtualAddress; 487234353Sdim uint32_t Size; 488234353Sdim }; 489234353Sdim 490234353Sdim enum WindowsSubsystem { 491234353Sdim IMAGE_SUBSYSTEM_UNKNOWN = 0, ///< An unknown subsystem. 492234353Sdim IMAGE_SUBSYSTEM_NATIVE = 1, ///< Device drivers and native Windows processes 493234353Sdim IMAGE_SUBSYSTEM_WINDOWS_GUI = 2, ///< The Windows GUI subsystem. 494234353Sdim IMAGE_SUBSYSTEM_WINDOWS_CUI = 3, ///< The Windows character subsystem. 495234353Sdim IMAGE_SUBSYSTEM_POSIX_CUI = 7, ///< The POSIX character subsystem. 496234353Sdim IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9, ///< Windows CE. 497234353Sdim IMAGE_SUBSYSTEM_EFI_APPLICATION = 10, ///< An EFI application. 498234353Sdim IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 11, ///< An EFI driver with boot 499234353Sdim /// services. 500234353Sdim IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER = 12, ///< An EFI driver with run-time 501234353Sdim /// services. 502234353Sdim IMAGE_SUBSYSTEM_EFI_ROM = 13, ///< An EFI ROM image. 503234353Sdim IMAGE_SUBSYSTEM_XBOX = 14 ///< XBOX. 504234353Sdim }; 505234353Sdim 506234353Sdim enum DLLCharacteristics { 507234353Sdim /// DLL can be relocated at load time. 508234353Sdim IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE = 0x0040, 509234353Sdim /// Code integrity checks are enforced. 510234353Sdim IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY = 0x0080, 511234353Sdim IMAGE_DLL_CHARACTERISTICS_NX_COMPAT = 0x0100, ///< Image is NX compatible. 512234353Sdim /// Isolation aware, but do not isolate the image. 513234353Sdim IMAGE_DLL_CHARACTERISTICS_NO_ISOLATION = 0x0200, 514234353Sdim /// Does not use structured exception handling (SEH). No SEH handler may be 515234353Sdim /// called in this image. 516234353Sdim IMAGE_DLL_CHARACTERISTICS_NO_SEH = 0x0400, 517234353Sdim /// Do not bind the image. 518234353Sdim IMAGE_DLL_CHARACTERISTICS_NO_BIND = 0x0800, 519234353Sdim IMAGE_DLL_CHARACTERISTICS_WDM_DRIVER = 0x2000, ///< A WDM driver. 520234353Sdim /// Terminal Server aware. 521234353Sdim IMAGE_DLL_CHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000 522234353Sdim }; 523234353Sdim 524234353Sdim enum DebugType { 525234353Sdim IMAGE_DEBUG_TYPE_UNKNOWN = 0, 526234353Sdim IMAGE_DEBUG_TYPE_COFF = 1, 527234353Sdim IMAGE_DEBUG_TYPE_CODEVIEW = 2, 528234353Sdim IMAGE_DEBUG_TYPE_FPO = 3, 529234353Sdim IMAGE_DEBUG_TYPE_MISC = 4, 530234353Sdim IMAGE_DEBUG_TYPE_EXCEPTION = 5, 531234353Sdim IMAGE_DEBUG_TYPE_FIXUP = 6, 532234353Sdim IMAGE_DEBUG_TYPE_OMAP_TO_SRC = 7, 533234353Sdim IMAGE_DEBUG_TYPE_OMAP_FROM_SRC = 8, 534234353Sdim IMAGE_DEBUG_TYPE_BORLAND = 9, 535234353Sdim IMAGE_DEBUG_TYPE_CLSID = 11 536234353Sdim }; 537234353Sdim 538234353Sdim enum BaseRelocationType { 539234353Sdim IMAGE_REL_BASED_ABSOLUTE = 0, 540234353Sdim IMAGE_REL_BASED_HIGH = 1, 541234353Sdim IMAGE_REL_BASED_LOW = 2, 542234353Sdim IMAGE_REL_BASED_HIGHLOW = 3, 543234353Sdim IMAGE_REL_BASED_HIGHADJ = 4, 544234353Sdim IMAGE_REL_BASED_MIPS_JMPADDR = 5, 545234353Sdim IMAGE_REL_BASED_ARM_MOV32A = 5, 546234353Sdim IMAGE_REL_BASED_ARM_MOV32T = 7, 547234353Sdim IMAGE_REL_BASED_MIPS_JMPADDR16 = 9, 548234353Sdim IMAGE_REL_BASED_DIR64 = 10 549234353Sdim }; 550234353Sdim 551234353Sdim enum ImportType { 552234353Sdim IMPORT_CODE = 0, 553234353Sdim IMPORT_DATA = 1, 554234353Sdim IMPORT_CONST = 2 555234353Sdim }; 556234353Sdim 557234353Sdim enum ImportNameType { 558234353Sdim /// Import is by ordinal. This indicates that the value in the Ordinal/Hint 559234353Sdim /// field of the import header is the import's ordinal. If this constant is 560234353Sdim /// not specified, then the Ordinal/Hint field should always be interpreted 561234353Sdim /// as the import's hint. 562234353Sdim IMPORT_ORDINAL = 0, 563234353Sdim /// The import name is identical to the public symbol name 564234353Sdim IMPORT_NAME = 1, 565234353Sdim /// The import name is the public symbol name, but skipping the leading ?, 566234353Sdim /// @, or optionally _. 567234353Sdim IMPORT_NAME_NOPREFIX = 2, 568234353Sdim /// The import name is the public symbol name, but skipping the leading ?, 569234353Sdim /// @, or optionally _, and truncating at the first @. 570234353Sdim IMPORT_NAME_UNDECORATE = 3 571234353Sdim }; 572234353Sdim 573234353Sdim struct ImportHeader { 574234353Sdim uint16_t Sig1; ///< Must be IMAGE_FILE_MACHINE_UNKNOWN (0). 575234353Sdim uint16_t Sig2; ///< Must be 0xFFFF. 576234353Sdim uint16_t Version; 577234353Sdim uint16_t Machine; 578234353Sdim uint32_t TimeDateStamp; 579234353Sdim uint32_t SizeOfData; 580234353Sdim uint16_t OrdinalHint; 581234353Sdim uint16_t TypeInfo; 582234353Sdim 583234353Sdim ImportType getType() const { 584234353Sdim return static_cast<ImportType>(TypeInfo & 0x3); 585234353Sdim } 586234353Sdim 587234353Sdim ImportNameType getNameType() const { 588234353Sdim return static_cast<ImportNameType>((TypeInfo & 0x1C) >> 3); 589234353Sdim } 590234353Sdim }; 591234353Sdim 592234353Sdim} // End namespace COFF. 593210006Srdivacky} // End namespace llvm. 594210006Srdivacky 595210006Srdivacky#endif 596