LLVM API Documentation

 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Object/COFF.h
Go to the documentation of this file.
1 //===- COFF.h - COFF object file implementation -----------------*- 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 declares the COFFObjectFile class.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_OBJECT_COFF_H
15 #define LLVM_OBJECT_COFF_H
16 
17 #include "llvm/Object/ObjectFile.h"
18 #include "llvm/Support/COFF.h"
19 #include "llvm/Support/Endian.h"
20 
21 namespace llvm {
22  template <typename T>
23  class ArrayRef;
24 
25 namespace object {
28 
29 /// The DOS compatible header at the front of all PE/COFF executables.
30 struct dos_header {
50 };
51 
60 
61  bool isImportLibrary() const { return NumberOfSections == 0xffff; }
62 };
63 
64 /// The 32-bit PE header that follows the COFF header.
65 struct pe32_header {
96 };
97 
98 /// The 64-bit PE header that follows the COFF header.
129 };
130 
134 };
135 
142 };
143 
146 
147  bool isOrdinal() const { return data & 0x80000000; }
148 
149  uint16_t getOrdinal() const {
150  assert(isOrdinal() && "ILT entry is not an ordinal!");
151  return data & 0xFFFF;
152  }
153 
154  uint32_t getHintNameRVA() const {
155  assert(!isOrdinal() && "ILT entry is not a Hint/Name RVA!");
156  return data;
157  }
158 };
159 
160 struct coff_symbol {
164  };
165 
166  union {
167  char ShortName[8];
169  } Name;
170 
173 
175 
178 
179  uint8_t getBaseType() const {
180  return Type & 0x0F;
181  }
182 
183  uint8_t getComplexType() const {
184  return (Type & 0xF0) >> 4;
185  }
186 };
187 
188 struct coff_section {
189  char Name[8];
199 };
200 
205 };
206 
210  char Unused[10];
211 };
212 
220  char Unused[3];
221 };
222 
223 class COFFObjectFile : public ObjectFile {
224 private:
226  const coff_file_header *COFFHeader;
227  const pe32_header *PE32Header;
228  const data_directory *DataDirectory;
229  const coff_section *SectionTable;
230  const coff_symbol *SymbolTable;
231  const char *StringTable;
232  uint32_t StringTableSize;
233  const import_directory_table_entry *ImportDirectory;
234  uint32_t NumberOfImportDirectory;
235 
236  error_code getString(uint32_t offset, StringRef &Res) const;
237 
238  const coff_symbol *toSymb(DataRefImpl Symb) const;
239  const coff_section *toSec(DataRefImpl Sec) const;
240  const coff_relocation *toRel(DataRefImpl Rel) const;
241 
242  error_code initSymbolTablePtr();
243  error_code initImportTablePtr();
244 
245 protected:
246  virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const;
247  virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const;
248  virtual error_code getSymbolFileOffset(DataRefImpl Symb, uint64_t &Res) const;
249  virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const;
250  virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const;
251  virtual error_code getSymbolFlags(DataRefImpl Symb, uint32_t &Res) const;
252  virtual error_code getSymbolType(DataRefImpl Symb, SymbolRef::Type &Res) const;
254  section_iterator &Res) const;
255  virtual error_code getSymbolValue(DataRefImpl Symb, uint64_t &Val) const;
256 
257  virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const;
258  virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const;
259  virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const;
260  virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const;
261  virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res) const;
262  virtual error_code getSectionAlignment(DataRefImpl Sec, uint64_t &Res) const;
263  virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const;
264  virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const;
265  virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const;
266  virtual error_code isSectionVirtual(DataRefImpl Sec, bool &Res) const;
267  virtual error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const;
268  virtual error_code isSectionReadOnlyData(DataRefImpl Sec, bool &Res) const;
270  bool &Res) const;
272  bool &Result) const;
275 
277  RelocationRef &Res) const;
279  uint64_t &Res) const;
281  uint64_t &Res) const;
284  uint64_t &Res) const;
286  SmallVectorImpl<char> &Result) const;
288  SmallVectorImpl<char> &Result) const;
289 
290  virtual error_code getLibraryNext(DataRefImpl LibData,
291  LibraryRef &Result) const;
292  virtual error_code getLibraryPath(DataRefImpl LibData,
293  StringRef &Result) const;
294 
295 public:
296  COFFObjectFile(MemoryBuffer *Object, error_code &ec);
297  virtual symbol_iterator begin_symbols() const;
298  virtual symbol_iterator end_symbols() const;
299  virtual symbol_iterator begin_dynamic_symbols() const;
300  virtual symbol_iterator end_dynamic_symbols() const;
302  virtual library_iterator end_libraries_needed() const;
303  virtual section_iterator begin_sections() const;
304  virtual section_iterator end_sections() const;
305 
306  const coff_section *getCOFFSection(section_iterator &It) const;
307  const coff_symbol *getCOFFSymbol(symbol_iterator &It) const;
309 
310  virtual uint8_t getBytesInAddress() const;
311  virtual StringRef getFileFormatName() const;
312  virtual unsigned getArch() const;
313  virtual StringRef getLoadName() const;
314 
317 
318  error_code getHeader(const coff_file_header *&Res) const;
319  error_code getCOFFHeader(const coff_file_header *&Res) const;
320  error_code getPE32Header(const pe32_header *&Res) const;
321  error_code getDataDirectory(uint32_t index, const data_directory *&Res) const;
322  error_code getSection(int32_t index, const coff_section *&Res) const;
323  error_code getSymbol(uint32_t index, const coff_symbol *&Res) const;
324  template <typename T>
325  error_code getAuxSymbol(uint32_t index, const T *&Res) const {
326  const coff_symbol *s;
327  error_code ec = getSymbol(index, s);
328  Res = reinterpret_cast<const T*>(s);
329  return ec;
330  }
331  error_code getSymbolName(const coff_symbol *symbol, StringRef &Res) const;
332  ArrayRef<uint8_t> getSymbolAuxData(const coff_symbol *symbol) const;
333 
334  error_code getSectionName(const coff_section *Sec, StringRef &Res) const;
336  ArrayRef<uint8_t> &Res) const;
337 
338  error_code getRvaPtr(uint32_t Rva, uintptr_t &Res) const;
339  error_code getHintName(uint32_t Rva, uint16_t &Hint, StringRef &Name) const;
340 
341  static inline bool classof(const Binary *v) {
342  return v->isCOFF();
343  }
344 };
345 
346 // The iterator for the import directory table.
348 public:
349  ImportDirectoryEntryRef() : OwningObject(0) {}
351  const COFFObjectFile *Owner)
352  : ImportDirectoryPimpl(ImportDirectory), OwningObject(Owner) {}
353 
354  bool operator==(const ImportDirectoryEntryRef &Other) const;
356  error_code getName(StringRef &Result) const;
357 
358  error_code
360 
361  error_code
363 
364 private:
365  DataRefImpl ImportDirectoryPimpl;
366  const COFFObjectFile *OwningObject;
367 };
368 } // end namespace object
369 } // end namespace llvm
370 
371 #endif
bool operator==(const ImportDirectoryEntryRef &Other) const
support::ulittle64_t SizeOfStackReserve
Definition: Object/COFF.h:123
support::ulittle16_t DLLCharacteristics
Definition: Object/COFF.h:89
support::ulittle32_t ImportAddressTableRVA
Definition: Object/COFF.h:141
The 64-bit PE header that follows the COFF header.
Definition: Object/COFF.h:99
support::ulittle32_t SizeOfImage
Definition: Object/COFF.h:118
support::ulittle16_t Machine
Definition: Object/COFF.h:53
support::ulittle16_t InitialIP
Definition: Object/COFF.h:41
support::ulittle32_t SizeOfStackCommit
Definition: Object/COFF.h:91
support::ulittle16_t MaximumExtraParagraphs
Definition: Object/COFF.h:37
support::ulittle16_t MinorOperatingSystemVersion
Definition: Object/COFF.h:112
support::ulittle32_t PointerToLinenumbers
Definition: Object/COFF.h:195
error_code getAuxSymbol(uint32_t index, const T *&Res) const
Definition: Object/COFF.h:325
support::ulittle32_t CheckSum
Definition: Object/COFF.h:87
support::ulittle32_t SizeOfUninitializedData
Definition: Object/COFF.h:71
support::ulittle16_t Type
Definition: Object/COFF.h:174
virtual relocation_iterator section_rel_end(DataRefImpl Sec) const
support::ulittle32_t SizeOfHeaders
Definition: Object/COFF.h:119
support::ulittle32_t VirtualAddress
Definition: Object/COFF.h:191
import_directory_iterator import_directory_end() const
support::ulittle16_t Reserved[4]
Definition: Object/COFF.h:45
virtual uint8_t getBytesInAddress() const
The number of bytes used to represent an address in this object file format.
error_code getNext(ImportDirectoryEntryRef &Result) const
virtual section_iterator begin_sections() const
support::ulittle16_t NumberOfSections
Definition: Object/COFF.h:54
error_code getDataDirectory(uint32_t index, const data_directory *&Res) const
support::ulittle32_t SizeOfImage
Definition: Object/COFF.h:85
support::little16_t SectionNumber
Definition: Object/COFF.h:172
support::ulittle32_t PointerToRelocations
Definition: Object/COFF.h:194
virtual error_code getRelocationOffset(DataRefImpl Rel, uint64_t &Res) const
virtual error_code getSymbolSection(DataRefImpl Symb, section_iterator &Res) const
error_code getRvaPtr(uint32_t Rva, uintptr_t &Res) const
virtual library_iterator end_libraries_needed() const
virtual error_code isSectionVirtual(DataRefImpl Sec, bool &Res) const
support::ulittle8_t NumberOfAuxSymbols
Definition: Object/COFF.h:177
support::ulittle16_t UsedBytesInTheLastPage
Definition: Object/COFF.h:32
error_code getSection(int32_t index, const coff_section *&Res) const
support::ulittle64_t SizeOfHeapCommit
Definition: Object/COFF.h:126
error_code getImportLookupEntry(const import_lookup_table_entry32 *&Result) const
uint8_t getComplexType() const
Definition: Object/COFF.h:183
support::ulittle16_t MajorOperatingSystemVersion
Definition: Object/COFF.h:78
virtual error_code getRelocationType(DataRefImpl Rel, uint64_t &Res) const
virtual error_code getRelocationNext(DataRefImpl Rel, RelocationRef &Res) const
support::ulittle16_t HeaderSizeInParagraphs
Definition: Object/COFF.h:35
support::ulittle64_t ImageBase
Definition: Object/COFF.h:108
virtual error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const
support::ulittle32_t LoaderFlags
Definition: Object/COFF.h:127
support::ulittle32_t SizeOfInitializedData
Definition: Object/COFF.h:104
support::ulittle32_t AddressOfEntryPoint
Definition: Object/COFF.h:72
virtual unsigned getArch() const
support::ulittle32_t TimeDateStamp
Definition: Object/COFF.h:55
support::ulittle32_t LoaderFlags
Definition: Object/COFF.h:94
support::ulittle16_t SizeOfOptionalHeader
Definition: Object/COFF.h:58
support::ulittle32_t SizeOfUninitializedData
Definition: Object/COFF.h:105
virtual error_code getSymbolFlags(DataRefImpl Symb, uint32_t &Res) const
virtual symbol_iterator getRelocationSymbol(DataRefImpl Rel) const
virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const
support::ulittle16_t MajorOperatingSystemVersion
Definition: Object/COFF.h:111
support::ulittle32_t ImportLookupTableRVA
Definition: Object/COFF.h:137
support::ulittle16_t MinorSubsystemVersion
Definition: Object/COFF.h:83
support::ulittle32_t VirtualSize
Definition: Object/COFF.h:190
support::ulittle16_t InitialRelativeSS
Definition: Object/COFF.h:38
virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const
virtual error_code getLibraryPath(DataRefImpl LibData, StringRef &Result) const
support::ulittle32_t NameRVA
Definition: Object/COFF.h:140
support::ulittle16_t Magic
Definition: Object/COFF.h:31
support::ulittle16_t InitialSP
Definition: Object/COFF.h:39
virtual error_code getSymbolFileOffset(DataRefImpl Symb, uint64_t &Res) const
support::ulittle32_t SizeOfInitializedData
Definition: Object/COFF.h:70
error_code getImportTableEntry(const import_directory_table_entry *&Result) const
support::ulittle32_t Win32VersionValue
Definition: Object/COFF.h:117
virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const
support::ulittle16_t MajorImageVersion
Definition: Object/COFF.h:113
support::ulittle16_t OEMinfo
Definition: Object/COFF.h:47
virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const
ImportDirectoryEntryRef(DataRefImpl ImportDirectory, const COFFObjectFile *Owner)
Definition: Object/COFF.h:350
bool isCOFF() const
Definition: Binary.h:103
support::ulittle16_t Magic
Definition: Object/COFF.h:66
support::ulittle32_t Characteristics
Definition: Object/COFF.h:198
support::ulittle32_t NumberOfRvaAndSize
Definition: Object/COFF.h:128
support::ulittle32_t FileAlignment
Definition: Object/COFF.h:77
support::ulittle32_t Characteristics
Definition: Object/COFF.h:209
virtual error_code getRelocationAddress(DataRefImpl Rel, uint64_t &Res) const
support::ulittle16_t MinorSubsystemVersion
Definition: Object/COFF.h:116
support::ulittle16_t InitialRelativeCS
Definition: Object/COFF.h:42
support::ulittle64_t SizeOfHeapReserve
Definition: Object/COFF.h:125
virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const
support::ulittle32_t CheckSum
Definition: Object/COFF.h:120
support::ulittle32_t Win32VersionValue
Definition: Object/COFF.h:84
support::ulittle16_t MinorImageVersion
Definition: Object/COFF.h:81
virtual StringRef getFileFormatName() const
support::ulittle64_t SizeOfStackCommit
Definition: Object/COFF.h:124
support::ulittle16_t Characteristics
Definition: Object/COFF.h:59
The 32-bit PE header that follows the COFF header.
Definition: Object/COFF.h:65
virtual error_code getLibraryNext(DataRefImpl LibData, LibraryRef &Result) const
support::ulittle32_t RelativeVirtualAddress
Definition: Object/COFF.h:132
support::ulittle16_t FileSizeInPages
Definition: Object/COFF.h:33
support::ulittle16_t Magic
Definition: Object/COFF.h:100
support::ulittle16_t MajorSubsystemVersion
Definition: Object/COFF.h:115
virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const
support::ulittle16_t Subsystem
Definition: Object/COFF.h:88
support::ulittle16_t Type
Definition: Object/COFF.h:204
support::ulittle16_t MajorSubsystemVersion
Definition: Object/COFF.h:82
support::ulittle8_t StorageClass
Definition: Object/COFF.h:176
virtual section_iterator end_sections() const
support::ulittle16_t Reserved2[10]
Definition: Object/COFF.h:48
virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res) const
support::ulittle32_t SizeOfRawData
Definition: Object/COFF.h:192
virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const
support::ulittle32_t SizeOfHeapCommit
Definition: Object/COFF.h:93
content_iterator< ImportDirectoryEntryRef > import_directory_iterator
Definition: Object/COFF.h:26
support::ulittle32_t VirtualAddress
Definition: Object/COFF.h:202
const coff_symbol * getCOFFSymbol(symbol_iterator &It) const
const coff_relocation * getCOFFRelocation(relocation_iterator &It) const
support::ulittle32_t SymbolTableIndex
Definition: Object/COFF.h:203
support::ulittle16_t MajorImageVersion
Definition: Object/COFF.h:80
virtual error_code isSectionRequiredForExecution(DataRefImpl Sec, bool &Res) const
support::ulittle16_t MinorOperatingSystemVersion
Definition: Object/COFF.h:79
virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb, bool &Result) const
virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const
error_code getHintName(uint32_t Rva, uint16_t &Hint, StringRef &Name) const
ArrayRef< uint8_t > getSymbolAuxData(const coff_symbol *symbol) const
import_directory_iterator import_directory_begin() const
support::ulittle16_t AddressOfRelocationTable
Definition: Object/COFF.h:43
support::ulittle32_t PointerToRawData
Definition: Object/COFF.h:193
support::ulittle32_t SizeOfStackReserve
Definition: Object/COFF.h:90
support::ulittle32_t SizeOfCode
Definition: Object/COFF.h:69
support::ulittle16_t Subsystem
Definition: Object/COFF.h:121
support::ulittle32_t BaseOfData
Definition: Object/COFF.h:74
support::ulittle32_t SectionAlignment
Definition: Object/COFF.h:76
support::ulittle16_t DLLCharacteristics
Definition: Object/COFF.h:122
union llvm::object::coff_symbol::@72 Name
support::ulittle32_t SizeOfHeaders
Definition: Object/COFF.h:86
error_code getPE32Header(const pe32_header *&Res) const
error_code getSymbol(uint32_t index, const coff_symbol *&Res) const
COFFObjectFile(MemoryBuffer *Object, error_code &ec)
support::ulittle32_t Value
Definition: Object/COFF.h:171
The DOS compatible header at the front of all PE/COFF executables.
Definition: Object/COFF.h:30
support::ulittle32_t ForwarderChain
Definition: Object/COFF.h:139
virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const
support::ulittle32_t SizeOfCode
Definition: Object/COFF.h:103
support::ulittle32_t AddressOfEntryPoint
Definition: Object/COFF.h:106
virtual error_code getSymbolType(DataRefImpl Symb, SymbolRef::Type &Res) const
support::ulittle32_t Size
Definition: Object/COFF.h:133
support::ulittle32_t ImageBase
Definition: Object/COFF.h:75
support::ulittle32_t TimeDateStamp
Definition: Object/COFF.h:138
support::ulittle32_t BaseOfCode
Definition: Object/COFF.h:73
support::ulittle16_t Checksum
Definition: Object/COFF.h:40
virtual relocation_iterator section_rel_begin(DataRefImpl Sec) const
support::ulittle16_t MinimumExtraParagraphs
Definition: Object/COFF.h:36
virtual error_code isSectionReadOnlyData(DataRefImpl Sec, bool &Res) const
support::ulittle32_t SectionAlignment
Definition: Object/COFF.h:109
support::ulittle16_t MinorImageVersion
Definition: Object/COFF.h:114
virtual library_iterator begin_libraries_needed() const
support::ulittle16_t NumberOfLinenumbers
Definition: Object/COFF.h:197
virtual symbol_iterator begin_dynamic_symbols() const
error_code getCOFFHeader(const coff_file_header *&Res) const
const coff_section * getCOFFSection(section_iterator &It) const
virtual symbol_iterator end_symbols() const
uint8_t getBaseType() const
Definition: Object/COFF.h:179
support::ulittle16_t NumberOfRelocations
Definition: Object/COFF.h:196
support::ulittle32_t AddressOfNewExeHeader
Definition: Object/COFF.h:49
support::ulittle32_t BaseOfCode
Definition: Object/COFF.h:107
static bool classof(const Binary *v)
Definition: Object/COFF.h:341
support::ulittle16_t NumberOfRelocationItems
Definition: Object/COFF.h:34
virtual error_code getSectionAlignment(DataRefImpl Sec, uint64_t &Res) const
virtual error_code getSymbolValue(DataRefImpl Symb, uint64_t &Val) const
virtual symbol_iterator begin_symbols() const
support::ulittle32_t FileAlignment
Definition: Object/COFF.h:110
virtual error_code getRelocationTypeName(DataRefImpl Rel, SmallVectorImpl< char > &Result) const
support::ulittle32_t NumberOfRvaAndSize
Definition: Object/COFF.h:95
virtual symbol_iterator end_dynamic_symbols() const
support::ulittle32_t NumberOfSymbols
Definition: Object/COFF.h:57
error_code getHeader(const coff_file_header *&Res) const
support::ulittle32_t PointerToSymbolTable
Definition: Object/COFF.h:56
virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const
Definition: Object/COFF.h:136
support::ulittle32_t SizeOfHeapReserve
Definition: Object/COFF.h:92
support::ulittle16_t OverlayNumber
Definition: Object/COFF.h:44
StringTableOffset Offset
Definition: Object/COFF.h:168
virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const
support::ulittle16_t OEMid
Definition: Object/COFF.h:46
error_code getName(StringRef &Result) const
virtual error_code getRelocationValueString(DataRefImpl Rel, SmallVectorImpl< char > &Result) const
virtual StringRef getLoadName() const