1001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer//===- COFF.h - COFF object file implementation -----------------*- C++ -*-===// 2001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer// 3001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer// The LLVM Compiler Infrastructure 4001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer// 5001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer// This file is distributed under the University of Illinois Open Source 6001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer// License. See LICENSE.TXT for details. 7001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer// 8001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer//===----------------------------------------------------------------------===// 9001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer// 10001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer// This file declares the COFFObjectFile class. 11001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer// 12001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer//===----------------------------------------------------------------------===// 13001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 14001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer#ifndef LLVM_OBJECT_COFF_H 15001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer#define LLVM_OBJECT_COFF_H 16001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 17001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer#include "llvm/Object/ObjectFile.h" 18001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer#include "llvm/Support/COFF.h" 19001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer#include "llvm/Support/Endian.h" 20001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 21001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencernamespace llvm { 221f6e3f9544c93213111a2f8b314c926c0d0e30e5Michael J. Spencer template <typename T> 231f6e3f9544c93213111a2f8b314c926c0d0e30e5Michael J. Spencer class ArrayRef; 241f6e3f9544c93213111a2f8b314c926c0d0e30e5Michael J. Spencer 25001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencernamespace object { 26001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 270a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama/// The DOS compatible header at the front of all PE/COFF executables. 280a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyamastruct dos_header { 290a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t Magic; 300a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t UsedBytesInTheLastPage; 310a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t FileSizeInPages; 320a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t NumberOfRelocationItems; 330a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t HeaderSizeInParagraphs; 340a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MinimumExtraParagraphs; 350a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MaximumExtraParagraphs; 360a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t InitialRelativeSS; 370a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t InitialSP; 380a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t Checksum; 390a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t InitialIP; 400a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t InitialRelativeCS; 410a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t AddressOfRelocationTable; 420a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t OverlayNumber; 430a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t Reserved[4]; 440a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t OEMid; 450a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t OEMinfo; 460a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t Reserved2[10]; 470a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t AddressOfNewExeHeader; 480a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama}; 490a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama 50001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerstruct coff_file_header { 51001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle16_t Machine; 52001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle16_t NumberOfSections; 53001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t TimeDateStamp; 54001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t PointerToSymbolTable; 55001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t NumberOfSymbols; 56001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle16_t SizeOfOptionalHeader; 57001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle16_t Characteristics; 58001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer}; 59001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 601a4f2a33fbd94c840d620ff572dd25540c650f70Rui Ueyama/// The 32-bit PE header that follows the COFF header. 610a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyamastruct pe32_header { 620a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t Magic; 630a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama uint8_t MajorLinkerVersion; 640a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama uint8_t MinorLinkerVersion; 650a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfCode; 660a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfInitializedData; 670a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfUninitializedData; 680a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t AddressOfEntryPoint; 690a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t BaseOfCode; 700a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t BaseOfData; 710a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t ImageBase; 720a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SectionAlignment; 730a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t FileAlignment; 740a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MajorOperatingSystemVersion; 750a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MinorOperatingSystemVersion; 760a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MajorImageVersion; 770a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MinorImageVersion; 780a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MajorSubsystemVersion; 790a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MinorSubsystemVersion; 800a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t Win32VersionValue; 810a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfImage; 820a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfHeaders; 830a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t CheckSum; 840a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t Subsystem; 850a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t DLLCharacteristics; 860a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfStackReserve; 870a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfStackCommit; 880a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfHeapReserve; 890a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfHeapCommit; 900a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t LoaderFlags; 910a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t NumberOfRvaAndSize; 920a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama}; 930a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama 941a4f2a33fbd94c840d620ff572dd25540c650f70Rui Ueyama/// The 64-bit PE header that follows the COFF header. 950a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyamastruct pe32plus_header { 960a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t Magic; 970a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama uint8_t MajorLinkerVersion; 980a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama uint8_t MinorLinkerVersion; 990a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfCode; 1000a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfInitializedData; 1010a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfUninitializedData; 1020a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t AddressOfEntryPoint; 1030a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t BaseOfCode; 1040a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle64_t ImageBase; 1050a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SectionAlignment; 1060a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t FileAlignment; 1070a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MajorOperatingSystemVersion; 1080a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MinorOperatingSystemVersion; 1090a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MajorImageVersion; 1100a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MinorImageVersion; 1110a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MajorSubsystemVersion; 1120a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t MinorSubsystemVersion; 1130a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t Win32VersionValue; 1140a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfImage; 1150a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t SizeOfHeaders; 1160a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t CheckSum; 1170a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t Subsystem; 1180a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle16_t DLLCharacteristics; 1190a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle64_t SizeOfStackReserve; 1200a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle64_t SizeOfStackCommit; 1210a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle64_t SizeOfHeapReserve; 1220a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle64_t SizeOfHeapCommit; 1230a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t LoaderFlags; 1240a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t NumberOfRvaAndSize; 1250a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama}; 1260a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama 1270a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyamastruct data_directory { 1280a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t RelativeVirtualAddress; 1290a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama support::ulittle32_t Size; 1300a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama}; 1310a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama 13220a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyamastruct import_directory_table_entry { 13320a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama support::ulittle32_t ImportLookupTableRVA; 13420a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama support::ulittle32_t TimeDateStamp; 13520a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama support::ulittle32_t ForwarderChain; 13620a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama support::ulittle32_t NameRVA; 13720a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama support::ulittle32_t ImportAddressTableRVA; 13820a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama}; 13920a91bfd362bf119a1bbaf27d19518328c5e3e90Rui Ueyama 140001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerstruct coff_symbol { 141001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer struct StringTableOffset { 142001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t Zeroes; 143001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t Offset; 144001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer }; 145001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 146001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer union { 147001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer char ShortName[8]; 148001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer StringTableOffset Offset; 149001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer } Name; 150001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 151001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t Value; 152001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::little16_t SectionNumber; 153001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 1545e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer support::ulittle16_t Type; 155001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 156001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle8_t StorageClass; 157001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle8_t NumberOfAuxSymbols; 1585e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer 1595e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer uint8_t getBaseType() const { 1605e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer return Type & 0x0F; 1615e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer } 1625e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer 1635e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer uint8_t getComplexType() const { 1645e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer return (Type & 0xF0) >> 4; 1655e3a082c797f0214d44858b05a13543872dfd413Michael J. Spencer } 166001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer}; 167001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 168001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerstruct coff_section { 169001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer char Name[8]; 170001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t VirtualSize; 171001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t VirtualAddress; 172001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t SizeOfRawData; 173001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t PointerToRawData; 174001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t PointerToRelocations; 175001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t PointerToLinenumbers; 176001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle16_t NumberOfRelocations; 177001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle16_t NumberOfLinenumbers; 178001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer support::ulittle32_t Characteristics; 179001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer}; 180001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 1810fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramerstruct coff_relocation { 1820fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer support::ulittle32_t VirtualAddress; 1830fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer support::ulittle32_t SymbolTableIndex; 1840fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer support::ulittle16_t Type; 1850fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer}; 1860fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer 1870e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencerstruct coff_aux_section_definition { 1880e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer support::ulittle32_t Length; 1890e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer support::ulittle16_t NumberOfRelocations; 1900e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer support::ulittle16_t NumberOfLinenumbers; 1910e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer support::ulittle32_t CheckSum; 1920e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer support::ulittle16_t Number; 1930e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer support::ulittle8_t Selection; 1940e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer char Unused[3]; 1950e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer}; 1960e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer 197001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerclass COFFObjectFile : public ObjectFile { 198001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerprivate: 1994bf771b4e6d37ae1d6ae08ea27c4070a3a09784dRui Ueyama const coff_file_header *COFFHeader; 2004bf771b4e6d37ae1d6ae08ea27c4070a3a09784dRui Ueyama const pe32_header *PE32Header; 2012f6c0484d68270f09eecac03b7e56053153203f3Rui Ueyama const data_directory *DataDirectory; 202001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer const coff_section *SectionTable; 203001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer const coff_symbol *SymbolTable; 204001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer const char *StringTable; 20525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer uint32_t StringTableSize; 206001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 20725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer error_code getString(uint32_t offset, StringRef &Res) const; 20825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer 20925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer const coff_symbol *toSymb(DataRefImpl Symb) const; 21025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer const coff_section *toSec(DataRefImpl Sec) const; 2110fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer const coff_relocation *toRel(DataRefImpl Rel) const; 212001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 213001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerprotected: 21425b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const; 21525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolName(DataRefImpl Symb, StringRef &Res) const; 216b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev virtual error_code getSymbolFileOffset(DataRefImpl Symb, uint64_t &Res) const; 21725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const; 21825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const; 21925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSymbolNMTypeChar(DataRefImpl Symb, char &Res) const; 220c46255a32ec92c427e621b6d7eabd887962ce4a4David Meyer virtual error_code getSymbolFlags(DataRefImpl Symb, uint32_t &Res) const; 2211130a799ab2fd7042625163a2506518960394884Michael J. Spencer virtual error_code getSymbolType(DataRefImpl Symb, SymbolRef::Type &Res) const; 2229b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer virtual error_code getSymbolSection(DataRefImpl Symb, 2239b2b812fea4df160437e7b7d56e38f6335189ad0Michael J. Spencer section_iterator &Res) const; 224a41dce3c642e50775352cce49e3a3d0cd004d393Tim Northover virtual error_code getSymbolValue(DataRefImpl Symb, uint64_t &Val) const; 22525b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer 22625b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const; 22725b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const; 22825b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const; 22925b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const; 23025b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res) const; 231e2f2f07be7cf2b55b7e5501291bbcede87e43fd6Michael J. Spencer virtual error_code getSectionAlignment(DataRefImpl Sec, uint64_t &Res) const; 23225b15777df42d5d608810f6881b6c98107481d69Michael J. Spencer virtual error_code isSectionText(DataRefImpl Sec, bool &Res) const; 23313afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const; 23413afc5eff2d7370ab486d5039886ab8bbf9039daMichael J. Spencer virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const; 235c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd virtual error_code isSectionVirtual(DataRefImpl Sec, bool &Res) const; 236c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd virtual error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const; 2373a129c85920404e7ccdb7e655c89fa60a0309cfdAndrew Kaylor virtual error_code isSectionReadOnlyData(DataRefImpl Sec, bool &Res) const; 238c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd virtual error_code isSectionRequiredForExecution(DataRefImpl Sec, 239c68dda815e64fb2fb463318d1eaa304e22199d50Preston Gurd bool &Res) const; 24007ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer virtual error_code sectionContainsSymbol(DataRefImpl Sec, DataRefImpl Symb, 24107ea23aa2d17f701fa125442c20c1eba75b55fdbBenjamin Kramer bool &Result) const; 2424344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer virtual relocation_iterator getSectionRelBegin(DataRefImpl Sec) const; 2434344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer virtual relocation_iterator getSectionRelEnd(DataRefImpl Sec) const; 244001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 2450fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer virtual error_code getRelocationNext(DataRefImpl Rel, 2460fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer RelocationRef &Res) const; 2470fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer virtual error_code getRelocationAddress(DataRefImpl Rel, 2480fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer uint64_t &Res) const; 249b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev virtual error_code getRelocationOffset(DataRefImpl Rel, 250b0436a73054fe676b216a0cf872d1fc433125c62Danil Malyshev uint64_t &Res) const; 2516c1202c459ffa6d693ad92fa84e43902bc780bcaRafael Espindola virtual symbol_iterator getRelocationSymbol(DataRefImpl Rel) const; 2520fcab076f0358890e2f1b213f4303c780e05d99dBenjamin Kramer virtual error_code getRelocationType(DataRefImpl Rel, 2539472b8d220fc746498429f430cb4c4dbfbd38f2aOwen Anderson uint64_t &Res) const; 2544344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer virtual error_code getRelocationTypeName(DataRefImpl Rel, 2554344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer SmallVectorImpl<char> &Result) const; 2564344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer virtual error_code getRelocationValueString(DataRefImpl Rel, 2574344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer SmallVectorImpl<char> &Result) const; 2584344b1ef9b3721a5ebc2e024f753772a1e4ddd92Michael J. Spencer 2595c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer virtual error_code getLibraryNext(DataRefImpl LibData, 2605c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer LibraryRef &Result) const; 2615c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer virtual error_code getLibraryPath(DataRefImpl LibData, 2625c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer StringRef &Result) const; 2635c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer 264001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencerpublic: 265001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer COFFObjectFile(MemoryBuffer *Object, error_code &ec); 266001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer virtual symbol_iterator begin_symbols() const; 267001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer virtual symbol_iterator end_symbols() const; 268dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer virtual symbol_iterator begin_dynamic_symbols() const; 269dfa1896b6b61e708f002b814794890ff308172eeMichael J. Spencer virtual symbol_iterator end_dynamic_symbols() const; 2705c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer virtual library_iterator begin_libraries_needed() const; 2715c2b4ea73c8f48bb5f96c86fe437385b8fb3dcdaDavid Meyer virtual library_iterator end_libraries_needed() const; 272001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer virtual section_iterator begin_sections() const; 273001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer virtual section_iterator end_sections() const; 274001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 275d4d03e09d3686d317da1166b578ca5ca35593970Marshall Clow const coff_section *getCOFFSection(section_iterator &It) const; 276d4d03e09d3686d317da1166b578ca5ca35593970Marshall Clow const coff_symbol *getCOFFSymbol(symbol_iterator &It) const; 2779ac0f1d7255d7941c331b0a62a830a3b033358fdMarshall Clow const coff_relocation *getCOFFRelocation(relocation_iterator &It) const; 2780a972fa1ef70c0523091732d41f35f660f97e107Rui Ueyama 279001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer virtual uint8_t getBytesInAddress() const; 280001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer virtual StringRef getFileFormatName() const; 281001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer virtual unsigned getArch() const; 28297f7787bfb56ad31fe20ec0bb9c3c9f3253d14fbDavid Meyer virtual StringRef getLoadName() const; 283ab6bcf35aefe823894d349773ebd53f465f122b7Michael J. Spencer 2840e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer error_code getHeader(const coff_file_header *&Res) const; 2854bf771b4e6d37ae1d6ae08ea27c4070a3a09784dRui Ueyama error_code getCOFFHeader(const coff_file_header *&Res) const; 2864bf771b4e6d37ae1d6ae08ea27c4070a3a09784dRui Ueyama error_code getPE32Header(const pe32_header *&Res) const; 2872f6c0484d68270f09eecac03b7e56053153203f3Rui Ueyama error_code getDataDirectory(uint32_t index, const data_directory *&Res) const; 2880e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer error_code getSection(int32_t index, const coff_section *&Res) const; 2890e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer error_code getSymbol(uint32_t index, const coff_symbol *&Res) const; 2900e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer template <typename T> 2910e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer error_code getAuxSymbol(uint32_t index, const T *&Res) const { 2920e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer const coff_symbol *s; 2930e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer error_code ec = getSymbol(index, s); 2940e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer Res = reinterpret_cast<const T*>(s); 2950e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer return ec; 2960e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer } 2970e752cb4b4eb5676aace4d9f3d7c2e2334c13777Michael J. Spencer error_code getSymbolName(const coff_symbol *symbol, StringRef &Res) const; 298d4d03e09d3686d317da1166b578ca5ca35593970Marshall Clow ArrayRef<uint8_t> getSymbolAuxData(const coff_symbol *symbol) const; 299d4d03e09d3686d317da1166b578ca5ca35593970Marshall Clow 300b35a896e072ff46c38905419b7f55aaccdb1d702Michael J. Spencer error_code getSectionName(const coff_section *Sec, StringRef &Res) const; 3011f6e3f9544c93213111a2f8b314c926c0d0e30e5Michael J. Spencer error_code getSectionContents(const coff_section *Sec, 3021f6e3f9544c93213111a2f8b314c926c0d0e30e5Michael J. Spencer ArrayRef<uint8_t> &Res) const; 303ab6bcf35aefe823894d349773ebd53f465f122b7Michael J. Spencer 304ab6bcf35aefe823894d349773ebd53f465f122b7Michael J. Spencer static inline bool classof(const Binary *v) { 3056f9489a86f33624f9ff5388411d12359ce9cef20David Meyer return v->isCOFF(); 306ab6bcf35aefe823894d349773ebd53f465f122b7Michael J. Spencer } 307001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer}; 308001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 309001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer} 310001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer} 311001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer 312001c9205fca2220480589ec355cb6ec701a37e08Michael J. Spencer#endif 313