LLVM  4.0.0
Support/COFF.h
Go to the documentation of this file.
1 //===-- llvm/Support/COFF.h -------------------------------------*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file contains an definitions used in Windows COFF Files.
11 //
12 // Structures and enums defined within this file where created using
13 // information from Microsoft's publicly available PE/COFF format document:
14 //
15 // Microsoft Portable Executable and Common Object File Format Specification
16 // Revision 8.1 - February 15, 2008
17 //
18 // As of 5/2/2010, hosted by Microsoft at:
19 // http://www.microsoft.com/whdc/system/platform/firmware/pecoff.mspx
20 //
21 //===----------------------------------------------------------------------===//
22 
23 #ifndef LLVM_SUPPORT_COFF_H
24 #define LLVM_SUPPORT_COFF_H
25 
26 #include "llvm/Support/DataTypes.h"
27 #include <cassert>
28 #include <cstring>
29 
30 namespace llvm {
31 namespace COFF {
32 
33  // The maximum number of sections that a COFF object can have (inclusive).
34  const int32_t MaxNumberOfSections16 = 65279;
35 
36  // The PE signature bytes that follows the DOS stub header.
37  static const char PEMagic[] = { 'P', 'E', '\0', '\0' };
38 
39  static const char BigObjMagic[] = {
40  '\xc7', '\xa1', '\xba', '\xd1', '\xee', '\xba', '\xa9', '\x4b',
41  '\xaf', '\x20', '\xfa', '\xf6', '\x6a', '\xa4', '\xdc', '\xb8',
42  };
43 
44  static const char ClGlObjMagic[] = {
45  '\x38', '\xfe', '\xb3', '\x0c', '\xa5', '\xd9', '\xab', '\x4d',
46  '\xac', '\x9b', '\xd6', '\xb6', '\x22', '\x26', '\x53', '\xc2',
47  };
48 
49  // Sizes in bytes of various things in the COFF format.
50  enum {
53  NameSize = 8,
58  };
59 
60  struct header {
61  uint16_t Machine;
67  uint16_t Characteristics;
68  };
69 
70  struct BigObjHeader {
71  enum : uint16_t { MinBigObjectVersion = 2 };
72 
73  uint16_t Sig1; ///< Must be IMAGE_FILE_MACHINE_UNKNOWN (0).
74  uint16_t Sig2; ///< Must be 0xFFFF.
75  uint16_t Version;
76  uint16_t Machine;
78  uint8_t UUID[16];
86  };
87 
88  enum MachineTypes {
89  MT_Invalid = 0xffff,
90 
113  };
114 
117 
118  /// The file does not contain base relocations and must be loaded at its
119  /// preferred base. If this cannot be done, the loader will error.
121  /// The file is valid and can be run.
123  /// COFF line numbers have been stripped. This is deprecated and should be
124  /// 0.
126  /// COFF symbol table entries for local symbols have been removed. This is
127  /// deprecated and should be 0.
129  /// Aggressively trim working set. This is deprecated and must be 0.
131  /// Image can handle > 2GiB addresses.
133  /// Little endian: the LSB precedes the MSB in memory. This is deprecated
134  /// and should be 0.
136  /// Machine is based on a 32bit word architecture.
138  /// Debugging info has been removed.
140  /// If the image is on removable media, fully load it and copy it to swap.
142  /// If the image is on network media, fully load it and copy it to swap.
144  /// The image file is a system file, not a user program.
146  /// The image file is a DLL.
147  IMAGE_FILE_DLL = 0x2000,
148  /// This file should only be run on a uniprocessor machine.
150  /// Big endian: the MSB precedes the LSB in memory. This is deprecated
151  /// and should be 0.
153  };
154 
155  struct symbol {
156  char Name[NameSize];
158  int32_t SectionNumber;
159  uint16_t Type;
160  uint8_t StorageClass;
162  };
163 
164  enum SymbolSectionNumber : int32_t {
168  };
169 
170  /// Storage class tells where and what the symbol represents
172  SSC_Invalid = 0xff,
173 
174  IMAGE_SYM_CLASS_END_OF_FUNCTION = -1, ///< Physical end of function
175  IMAGE_SYM_CLASS_NULL = 0, ///< No symbol
176  IMAGE_SYM_CLASS_AUTOMATIC = 1, ///< Stack variable
177  IMAGE_SYM_CLASS_EXTERNAL = 2, ///< External symbol
178  IMAGE_SYM_CLASS_STATIC = 3, ///< Static
179  IMAGE_SYM_CLASS_REGISTER = 4, ///< Register variable
180  IMAGE_SYM_CLASS_EXTERNAL_DEF = 5, ///< External definition
181  IMAGE_SYM_CLASS_LABEL = 6, ///< Label
182  IMAGE_SYM_CLASS_UNDEFINED_LABEL = 7, ///< Undefined label
183  IMAGE_SYM_CLASS_MEMBER_OF_STRUCT = 8, ///< Member of structure
184  IMAGE_SYM_CLASS_ARGUMENT = 9, ///< Function argument
185  IMAGE_SYM_CLASS_STRUCT_TAG = 10, ///< Structure tag
186  IMAGE_SYM_CLASS_MEMBER_OF_UNION = 11, ///< Member of union
187  IMAGE_SYM_CLASS_UNION_TAG = 12, ///< Union tag
188  IMAGE_SYM_CLASS_TYPE_DEFINITION = 13, ///< Type definition
189  IMAGE_SYM_CLASS_UNDEFINED_STATIC = 14, ///< Undefined static
190  IMAGE_SYM_CLASS_ENUM_TAG = 15, ///< Enumeration tag
191  IMAGE_SYM_CLASS_MEMBER_OF_ENUM = 16, ///< Member of enumeration
192  IMAGE_SYM_CLASS_REGISTER_PARAM = 17, ///< Register parameter
193  IMAGE_SYM_CLASS_BIT_FIELD = 18, ///< Bit field
194  /// ".bb" or ".eb" - beginning or end of block
196  /// ".bf" or ".ef" - beginning or end of function
198  IMAGE_SYM_CLASS_END_OF_STRUCT = 102, ///< End of structure
199  IMAGE_SYM_CLASS_FILE = 103, ///< File name
200  /// Line number, reformatted as symbol
202  IMAGE_SYM_CLASS_WEAK_EXTERNAL = 105, ///< Duplicate tag
203  /// External symbol in dmert public lib
205  };
206 
208  IMAGE_SYM_TYPE_NULL = 0, ///< No type information or unknown base type.
209  IMAGE_SYM_TYPE_VOID = 1, ///< Used with void pointers and functions.
210  IMAGE_SYM_TYPE_CHAR = 2, ///< A character (signed byte).
211  IMAGE_SYM_TYPE_SHORT = 3, ///< A 2-byte signed integer.
212  IMAGE_SYM_TYPE_INT = 4, ///< A natural integer type on the target.
213  IMAGE_SYM_TYPE_LONG = 5, ///< A 4-byte signed integer.
214  IMAGE_SYM_TYPE_FLOAT = 6, ///< A 4-byte floating-point number.
215  IMAGE_SYM_TYPE_DOUBLE = 7, ///< An 8-byte floating-point number.
216  IMAGE_SYM_TYPE_STRUCT = 8, ///< A structure.
217  IMAGE_SYM_TYPE_UNION = 9, ///< An union.
218  IMAGE_SYM_TYPE_ENUM = 10, ///< An enumerated type.
219  IMAGE_SYM_TYPE_MOE = 11, ///< A member of enumeration (a specific value).
220  IMAGE_SYM_TYPE_BYTE = 12, ///< A byte; unsigned 1-byte integer.
221  IMAGE_SYM_TYPE_WORD = 13, ///< A word; unsigned 2-byte integer.
222  IMAGE_SYM_TYPE_UINT = 14, ///< An unsigned integer of natural size.
223  IMAGE_SYM_TYPE_DWORD = 15 ///< An unsigned 4-byte integer.
224  };
225 
227  IMAGE_SYM_DTYPE_NULL = 0, ///< No complex type; simple scalar variable.
228  IMAGE_SYM_DTYPE_POINTER = 1, ///< A pointer to base type.
229  IMAGE_SYM_DTYPE_FUNCTION = 2, ///< A function that returns a base type.
230  IMAGE_SYM_DTYPE_ARRAY = 3, ///< An array of base type.
231 
232  /// Type is formed as (base + (derived << SCT_COMPLEX_TYPE_SHIFT))
234  };
235 
238  };
239 
240  struct section {
241  char Name[NameSize];
251  };
252 
254  SC_Invalid = 0xffffffff,
255 
256  IMAGE_SCN_TYPE_NOLOAD = 0x00000002,
257  IMAGE_SCN_TYPE_NO_PAD = 0x00000008,
258  IMAGE_SCN_CNT_CODE = 0x00000020,
261  IMAGE_SCN_LNK_OTHER = 0x00000100,
262  IMAGE_SCN_LNK_INFO = 0x00000200,
263  IMAGE_SCN_LNK_REMOVE = 0x00000800,
264  IMAGE_SCN_LNK_COMDAT = 0x00001000,
265  IMAGE_SCN_GPREL = 0x00008000,
267  IMAGE_SCN_MEM_16BIT = 0x00020000,
268  IMAGE_SCN_MEM_LOCKED = 0x00040000,
269  IMAGE_SCN_MEM_PRELOAD = 0x00080000,
288  IMAGE_SCN_MEM_SHARED = 0x10000000,
289  IMAGE_SCN_MEM_EXECUTE = 0x20000000,
290  IMAGE_SCN_MEM_READ = 0x40000000,
291  IMAGE_SCN_MEM_WRITE = 0x80000000
292  };
293 
294  struct relocation {
297  uint16_t Type;
298  };
299 
312  };
313 
332  };
333 
350  };
351 
352  enum COMDATType {
360  };
361 
362  // Auxiliary Symbol Formats
368  char unused[2];
369  };
370 
372  uint8_t unused1[4];
373  uint16_t Linenumber;
374  uint8_t unused2[6];
376  uint8_t unused3[2];
377  };
378 
382  uint8_t unused[10];
383  };
384 
389  };
390 
397  uint8_t Selection;
398  char unused;
399  };
400 
402  uint8_t AuxType;
403  uint8_t unused1;
405  char unused2[12];
406  };
407 
408  union Auxiliary {
413  };
414 
415  /// @brief The Import Directory Table.
416  ///
417  /// There is a single array of these and one entry per imported DLL.
424  };
425 
426  /// @brief The PE32 Import Lookup Table.
427  ///
428  /// There is an array of these for each imported DLL. It represents either
429  /// the ordinal to import from the target DLL, or a name to lookup and import
430  /// from the target DLL.
431  ///
432  /// This also happens to be the same format used by the Import Address Table
433  /// when it is initially written out to the image.
436 
437  /// @brief Is this entry specified by ordinal, or name?
438  bool isOrdinal() const { return data & 0x80000000; }
439 
440  /// @brief Get the ordinal value of this entry. isOrdinal must be true.
441  uint16_t getOrdinal() const {
442  assert(isOrdinal() && "ILT entry is not an ordinal!");
443  return data & 0xFFFF;
444  }
445 
446  /// @brief Set the ordinal value and set isOrdinal to true.
447  void setOrdinal(uint16_t o) {
448  data = o;
449  data |= 0x80000000;
450  }
451 
452  /// @brief Get the Hint/Name entry RVA. isOrdinal must be false.
454  assert(!isOrdinal() && "ILT entry is not a Hint/Name RVA!");
455  return data;
456  }
457 
458  /// @brief Set the Hint/Name entry RVA and set isOrdinal to false.
459  void setHintNameRVA(uint32_t rva) { data = rva; }
460  };
461 
462  /// @brief The DOS compatible header at the front of all PEs.
463  struct DOSHeader {
464  uint16_t Magic;
466  uint16_t FileSizeInPages;
472  uint16_t InitialSP;
473  uint16_t Checksum;
474  uint16_t InitialIP;
477  uint16_t OverlayNumber;
478  uint16_t Reserved[4];
479  uint16_t OEMid;
480  uint16_t OEMinfo;
481  uint16_t Reserved2[10];
483  };
484 
485  struct PE32Header {
486  enum {
487  PE32 = 0x10b,
488  PE32_PLUS = 0x20b
489  };
490 
491  uint16_t Magic;
513  uint16_t Subsystem;
514  // FIXME: This should be DllCharacteristics to match the COFF spec.
521  // FIXME: This should be NumberOfRvaAndSizes to match the COFF spec.
523  };
524 
525  struct DataDirectory {
528  };
529 
546 
548  };
549 
551  IMAGE_SUBSYSTEM_UNKNOWN = 0, ///< An unknown subsystem.
552  IMAGE_SUBSYSTEM_NATIVE = 1, ///< Device drivers and native Windows processes
553  IMAGE_SUBSYSTEM_WINDOWS_GUI = 2, ///< The Windows GUI subsystem.
554  IMAGE_SUBSYSTEM_WINDOWS_CUI = 3, ///< The Windows character subsystem.
555  IMAGE_SUBSYSTEM_OS2_CUI = 5, ///< The OS/2 character subsytem.
556  IMAGE_SUBSYSTEM_POSIX_CUI = 7, ///< The POSIX character subsystem.
557  IMAGE_SUBSYSTEM_NATIVE_WINDOWS = 8, ///< Native Windows 9x driver.
558  IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9, ///< Windows CE.
559  IMAGE_SUBSYSTEM_EFI_APPLICATION = 10, ///< An EFI application.
560  IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 11, ///< An EFI driver with boot
561  /// services.
562  IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER = 12, ///< An EFI driver with run-time
563  /// services.
564  IMAGE_SUBSYSTEM_EFI_ROM = 13, ///< An EFI ROM image.
565  IMAGE_SUBSYSTEM_XBOX = 14, ///< XBOX.
566  IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION = 16 ///< A BCD application.
567  };
568 
570  /// ASLR with 64 bit address space.
572  /// DLL can be relocated at load time.
574  /// Code integrity checks are enforced.
576  ///< Image is NX compatible.
578  /// Isolation aware, but do not isolate the image.
580  /// Does not use structured exception handling (SEH). No SEH handler may be
581  /// called in this image.
583  /// Do not bind the image.
585  ///< Image should execute in an AppContainer.
587  ///< A WDM driver.
589  ///< Image supports Control Flow Guard.
591  /// Terminal Server aware.
593  };
594 
595  enum DebugType {
613  };
614 
626  };
627 
628  enum ImportType {
632  };
633 
635  /// Import is by ordinal. This indicates that the value in the Ordinal/Hint
636  /// field of the import header is the import's ordinal. If this constant is
637  /// not specified, then the Ordinal/Hint field should always be interpreted
638  /// as the import's hint.
640  /// The import name is identical to the public symbol name
642  /// The import name is the public symbol name, but skipping the leading ?,
643  /// @, or optionally _.
645  /// The import name is the public symbol name, but skipping the leading ?,
646  /// @, or optionally _, and truncating at the first @.
648  };
649 
650  struct ImportHeader {
651  uint16_t Sig1; ///< Must be IMAGE_FILE_MACHINE_UNKNOWN (0).
652  uint16_t Sig2; ///< Must be 0xFFFF.
653  uint16_t Version;
654  uint16_t Machine;
657  uint16_t OrdinalHint;
658  uint16_t TypeInfo;
659 
660  ImportType getType() const {
661  return static_cast<ImportType>(TypeInfo & 0x3);
662  }
663 
665  return static_cast<ImportNameType>((TypeInfo & 0x1C) >> 2);
666  }
667  };
668 
671  };
672 
673  inline bool isReservedSectionNumber(int32_t SectionNumber) {
674  return SectionNumber <= 0;
675  }
676 
677 } // End namespace COFF.
678 } // End namespace llvm.
679 
680 #endif
A byte; unsigned 1-byte integer.
Definition: Support/COFF.h:220
uint32_t SizeOfInitializedData
Definition: Support/COFF.h:495
uint16_t MaximumExtraParagraphs
Definition: Support/COFF.h:470
The Windows character subsystem.
Definition: Support/COFF.h:554
Image can handle > 2GiB addresses.
Definition: Support/COFF.h:132
A pointer to base type.
Definition: Support/COFF.h:228
void setOrdinal(uint16_t o)
Set the ordinal value and set isOrdinal to true.
Definition: Support/COFF.h:447
ImportType getType() const
Definition: Support/COFF.h:660
Device drivers and native Windows processes.
Definition: Support/COFF.h:552
A 4-byte signed integer.
Definition: Support/COFF.h:213
Import is by ordinal.
Definition: Support/COFF.h:639
char Name[NameSize]
Definition: Support/COFF.h:241
uint16_t getOrdinal() const
Get the ordinal value of this entry. isOrdinal must be true.
Definition: Support/COFF.h:441
Aggressively trim working set. This is deprecated and must be 0.
Definition: Support/COFF.h:130
Image supports Control Flow Guard.
Definition: Support/COFF.h:588
Isolation aware, but do not isolate the image.
Definition: Support/COFF.h:579
AuxiliarySectionDefinition SectionDefinition
Definition: Support/COFF.h:412
uint16_t Reserved2[10]
Definition: Support/COFF.h:481
The Windows GUI subsystem.
Definition: Support/COFF.h:553
static const char BigObjMagic[]
Definition: Support/COFF.h:39
uint16_t MinorSubsystemVersion
Definition: Support/COFF.h:508
The import name is the public symbol name, but skipping the leading ?, @, or optionally _...
Definition: Support/COFF.h:647
COFF symbol table entries for local symbols have been removed.
Definition: Support/COFF.h:128
uint16_t Characteristics
Definition: Support/COFF.h:67
".bf" or ".ef" - beginning or end of function
Definition: Support/COFF.h:197
No complex type; simple scalar variable.
Definition: Support/COFF.h:227
The import name is identical to the public symbol name.
Definition: Support/COFF.h:641
A 2-byte signed integer.
Definition: Support/COFF.h:211
uint16_t HeaderSizeInParagraphs
Definition: Support/COFF.h:468
uint32_t PointerToSymbolTable
Definition: Support/COFF.h:64
uint16_t MajorOperatingSystemVersion
Definition: Support/COFF.h:503
bool isOrdinal() const
Is this entry specified by ordinal, or name?
Definition: Support/COFF.h:438
const int32_t MaxNumberOfSections16
Definition: Support/COFF.h:34
External symbol in dmert public lib.
Definition: Support/COFF.h:204
An unsigned integer of natural size.
Definition: Support/COFF.h:222
bool isReservedSectionNumber(int32_t SectionNumber)
Definition: Support/COFF.h:673
A 4-byte floating-point number.
Definition: Support/COFF.h:214
uint16_t AddressOfRelocationTable
Definition: Support/COFF.h:476
An array of base type.
Definition: Support/COFF.h:230
AuxiliaryWeakExternal WeakExternal
Definition: Support/COFF.h:411
uint16_t UsedBytesInTheLastPage
Definition: Support/COFF.h:465
The OS/2 character subsytem.
Definition: Support/COFF.h:555
uint16_t NumberOfRelocationItems
Definition: Support/COFF.h:467
The PE32 Import Lookup Table.
Definition: Support/COFF.h:434
uint8_t NumberOfAuxSymbols
Definition: Support/COFF.h:161
Used with void pointers and functions.
Definition: Support/COFF.h:209
The DOS compatible header at the front of all PEs.
Definition: Support/COFF.h:463
uint16_t MinimumExtraParagraphs
Definition: Support/COFF.h:469
static const char ClGlObjMagic[]
Definition: Support/COFF.h:44
Machine is based on a 32bit word architecture.
Definition: Support/COFF.h:137
An EFI driver with run-time services.
Definition: Support/COFF.h:562
An EFI driver with boot services.
Definition: Support/COFF.h:560
No type information or unknown base type.
Definition: Support/COFF.h:208
uint16_t MinorOperatingSystemVersion
Definition: Support/COFF.h:504
uint16_t SizeOfOptionalHeader
Definition: Support/COFF.h:66
ImportNameType getNameType() const
Definition: Support/COFF.h:664
Line number, reformatted as symbol.
Definition: Support/COFF.h:201
An 8-byte floating-point number.
Definition: Support/COFF.h:215
The image file is a DLL.
Definition: Support/COFF.h:147
Type is formed as (base + (derived << SCT_COMPLEX_TYPE_SHIFT))
Definition: Support/COFF.h:233
void setHintNameRVA(uint32_t rva)
Set the Hint/Name entry RVA and set isOrdinal to false.
Definition: Support/COFF.h:459
A function that returns a base type.
Definition: Support/COFF.h:229
If the image is on removable media, fully load it and copy it to swap.
Definition: Support/COFF.h:141
uint16_t NumberOfLineNumbers
Definition: Support/COFF.h:249
uint16_t Sig2
Must be 0xFFFF.
Definition: Support/COFF.h:652
A word; unsigned 2-byte integer.
Definition: Support/COFF.h:221
uint16_t MajorSubsystemVersion
Definition: Support/COFF.h:507
uint32_t TimeDateStamp
Definition: Support/COFF.h:63
Little endian: the LSB precedes the MSB in memory.
Definition: Support/COFF.h:135
An unsigned 4-byte integer.
Definition: Support/COFF.h:223
This file should only be run on a uniprocessor machine.
Definition: Support/COFF.h:149
uint32_t PointerToRelocations
Definition: Support/COFF.h:246
DLL can be relocated at load time.
Definition: Support/COFF.h:573
If the image is on network media, fully load it and copy it to swap.
Definition: Support/COFF.h:143
Debugging info has been removed.
Definition: Support/COFF.h:139
uint32_t PointerToRawData
Definition: Support/COFF.h:245
uint16_t Sig1
Must be IMAGE_FILE_MACHINE_UNKNOWN (0).
Definition: Support/COFF.h:651
SymbolStorageClass
Storage class tells where and what the symbol represents.
Definition: Support/COFF.h:171
".bb" or ".eb" - beginning or end of block
Definition: Support/COFF.h:195
COFF line numbers have been stripped.
Definition: Support/COFF.h:125
uint16_t Sig2
Must be 0xFFFF.
Definition: Support/COFF.h:74
uint32_t NumberOfSymbols
Definition: Support/COFF.h:65
Big endian: the MSB precedes the LSB in memory.
Definition: Support/COFF.h:152
A character (signed byte).
Definition: Support/COFF.h:210
uint32_t AddressOfNewExeHeader
Definition: Support/COFF.h:482
The POSIX character subsystem.
Definition: Support/COFF.h:556
The Import Directory Table.
Definition: Support/COFF.h:418
Code integrity checks are enforced.
Definition: Support/COFF.h:575
int32_t NumberOfSections
Definition: Support/COFF.h:62
static const char PEMagic[]
Definition: Support/COFF.h:37
Does not use structured exception handling (SEH).
Definition: Support/COFF.h:582
The image file is a system file, not a user program.
Definition: Support/COFF.h:145
char Name[NameSize]
Definition: Support/COFF.h:156
uint32_t SizeOfUninitializedData
Definition: Support/COFF.h:496
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
uint16_t NumberOfRelocations
Definition: Support/COFF.h:248
AuxiliaryFunctionDefinition FunctionDefinition
Definition: Support/COFF.h:409
A member of enumeration (a specific value).
Definition: Support/COFF.h:219
uint32_t PointerToLineNumbers
Definition: Support/COFF.h:247
The file does not contain base relocations and must be loaded at its preferred base.
Definition: Support/COFF.h:120
uint16_t Sig1
Must be IMAGE_FILE_MACHINE_UNKNOWN (0).
Definition: Support/COFF.h:73
uint32_t getHintNameRVA() const
Get the Hint/Name entry RVA. isOrdinal must be false.
Definition: Support/COFF.h:453
The import name is the public symbol name, but skipping the leading ?, @, or optionally _...
Definition: Support/COFF.h:644
WeakExternalCharacteristics
Definition: Support/COFF.h:385
AuxiliarybfAndefSymbol bfAndefSymbol
Definition: Support/COFF.h:410
uint32_t Characteristics
Definition: Support/COFF.h:250
The file is valid and can be run.
Definition: Support/COFF.h:122
A natural integer type on the target.
Definition: Support/COFF.h:212