24 using namespace object;
47 const size_t Size =
sizeof(
T)) {
48 uintptr_t Addr = uintptr_t(Ptr);
49 if (Addr + Size < Addr ||
54 Obj =
reinterpret_cast<const T *
>(Addr);
64 uintptr_t offset = uintptr_t(addr) - uintptr_t(
base());
65 if (offset < COFFHeader->PointerToSymbolTable
71 == 0 &&
"Symbol did not point to the beginning of a symbol");
82 if (addr < SectionTable
86 uintptr_t offset = uintptr_t(addr) - uintptr_t(SectionTable);
88 "Section did not point to the beginning of a section");
98 Symb.
p =
reinterpret_cast<uintptr_t
>(symb);
110 uint64_t &Result)
const {
121 Result = symb->
Value;
126 uint64_t &Result)
const {
137 Result = symb->
Value;
159 if (Characteristics & COFF::IMAGE_SCN_MEM_READ &&
160 ~Characteristics & COFF::IMAGE_SCN_MEM_WRITE)
168 uint32_t &Result)
const {
170 Result = SymbolRef::SF_None;
176 Result |= SymbolRef::SF_Undefined;
180 Result |= SymbolRef::SF_Global;
183 Result |= SymbolRef::SF_Weak;
186 Result |= SymbolRef::SF_Absolute;
192 uint64_t &Result)
const {
219 Sec.
p =
reinterpret_cast<uintptr_t
>(sec);
226 uint64_t &Val)
const {
234 Sec.
p =
reinterpret_cast<uintptr_t
>(sec);
246 uint64_t &Result)
const {
253 uint64_t &Result)
const {
269 uint64_t &Res)
const {
273 Res = uint64_t(1) << (((sec->
Characteristics & 0x00F00000) >> 20) - 1);
278 bool &Result)
const {
285 bool &Result)
const {
292 bool &Result)
const {
294 Result = sec->
Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA;
299 bool &Result)
const {
306 bool &Result)
const {
308 Result = sec->
Characteristics & COFF::IMAGE_SCN_CNT_UNINITIALIZED_DATA;
313 bool &Result)
const {
320 bool &Result)
const {
328 bool &Result)
const {
357 ret.
p =
reinterpret_cast<uintptr_t
>(
366 error_code COFFObjectFile::initSymbolTablePtr() {
375 const uint8_t *StringTableAddr =
379 if (
error_code ec = getObject(StringTableSizePtr,
Data, StringTableAddr))
381 StringTableSize = *StringTableSizePtr;
383 getObject(StringTable,
Data, StringTableAddr, StringTableSize))
387 if (StringTableSize < 4 ||
388 (StringTableSize > 4 && StringTable[StringTableSize - 1] != 0))
403 if (SectionStart <= Rva && Rva < SectionEnd) {
404 uint32_t Offset = Rva - SectionStart;
416 uintptr_t IntPtr = 0;
419 const uint8_t *Ptr =
reinterpret_cast<const uint8_t *
>(IntPtr);
420 Hint = *
reinterpret_cast<const ulittle16_t *
>(Ptr);
421 Name =
StringRef(reinterpret_cast<const char *>(Ptr + 2));
426 error_code COFFObjectFile::initImportTablePtr() {
438 NumberOfImportDirectory = DataEntry->
Size /
443 uintptr_t IntPtr = 0;
446 ImportDirectory =
reinterpret_cast<
463 , NumberOfImportDirectory(0) {
472 bool hasPEHeader =
false;
475 if (
base()[0] == 0x4d &&
base()[1] == 0x5a) {
478 if (!checkSize(
Data, ec, 0x3c + 8))
return;
489 if ((ec = getObject(COFFHeader,
Data,
base() + CurPtr)))
494 if ((ec = getObject(PE32Header,
Data,
base() + CurPtr)))
496 if (PE32Header->
Magic != 0x10b) {
504 if ((ec = getObject(DataDirectory,
Data, addr, size)))
511 if ((ec = getObject(SectionTable,
Data,
base() + CurPtr,
517 if ((ec = initSymbolTablePtr()))
521 if ((ec = initImportTablePtr()))
529 ret.
p =
reinterpret_cast<uintptr_t
>(SymbolTable);
536 ret.
p =
reinterpret_cast<uintptr_t
>(StringTable);
567 Imp.
p =
reinterpret_cast<uintptr_t
>(ImportDirectory);
573 if (ImportDirectory) {
574 Imp.
p =
reinterpret_cast<uintptr_t
>(
575 ImportDirectory + (NumberOfImportDirectory - 1));
584 ret.
p =
reinterpret_cast<uintptr_t
>(SectionTable);
592 ret.
p =
reinterpret_cast<uintptr_t
>(SectionTable + numSections);
605 return "COFF-x86-64";
607 return "COFF-<unknown arch>";
643 Res = &DataDirectory[index];
654 else if (index > 0 && index <= COFFHeader->NumberOfSections)
656 Result = SectionTable + (index - 1);
662 error_code COFFObjectFile::getString(uint32_t offset,
664 if (StringTableSize <= 4)
667 if (offset >= StringTableSize)
669 Result =
StringRef(StringTable + offset);
675 if (index < COFFHeader->NumberOfSymbols)
676 Result = SymbolTable + index;
703 const uint8_t *aux = NULL;
707 aux =
reinterpret_cast<const uint8_t *
>(symbol + 1);
710 uintptr_t offset = uintptr_t(aux) - uintptr_t(
base());
711 if (offset < COFFHeader->PointerToSymbolTable
717 == 0 &&
"Aux Symbol data did not point to the beginning of a symbol");
726 if (Sec->
Name[7] == 0)
734 if (Name[0] ==
'/') {
765 Rel.
p =
reinterpret_cast<uintptr_t
>(
771 uint64_t &Res)
const {
775 uint64_t &Res)
const {
786 uint64_t &Res)
const {
793 return toSec(It->getRawDataRefImpl());
797 return toSymb(It->getRawDataRefImpl());
802 return toRel(It->getRawDataRefImpl());
805 #define LLVM_COFF_SWITCH_RELOC_TYPE_NAME(enum) \
806 case COFF::enum: res = #enum; break;
814 switch (reloc->
Type) {
837 switch (reloc->
Type) {
860 #undef LLVM_COFF_SWITCH_RELOC_TYPE_NAME
868 sym.
p =
reinterpret_cast<uintptr_t
>(symb);
887 return ImportDirectoryPimpl == Other.ImportDirectoryPimpl;
899 Next.
p =
reinterpret_cast<uintptr_t
>(Dir);
912 uintptr_t IntPtr = 0;
915 const char *Ptr =
reinterpret_cast<const char *
>(IntPtr);
923 uintptr_t IntPtr = 0;
bool operator==(const ImportDirectoryEntryRef &Other) const
ImportDirectoryEntryRef()
#define LLVM_COFF_SWITCH_RELOC_TYPE_NAME(enum)
virtual relocation_iterator section_rel_end(DataRefImpl Sec) const
const uint8_t * base() const
support::ulittle32_t VirtualAddress
import_directory_iterator import_directory_end() const
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
StringRef substr(size_t Start, size_t N=npos) const
virtual section_iterator begin_sections() const
error_code getDataDirectory(uint32_t index, const data_directory *&Res) const
support::little16_t SectionNumber
support::ulittle32_t PointerToRelocations
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
error_code getSection(int32_t index, const coff_section *&Res) const
error_code getImportLookupEntry(const import_lookup_table_entry32 *&Result) const
LLVM_ATTRIBUTE_NORETURN void report_fatal_error(const char *reason, bool gen_crash_diag=true)
uint8_t getComplexType() const
virtual error_code getRelocationType(DataRefImpl Rel, uint64_t &Res) const
virtual error_code getRelocationNext(DataRefImpl Rel, RelocationRef &Res) const
virtual error_code isSectionZeroInit(DataRefImpl Sec, bool &Res) const
virtual unsigned getArch() const
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::ulittle32_t ImportLookupTableRVA
support::ulittle32_t VirtualSize
virtual error_code getSymbolAddress(DataRefImpl Symb, uint64_t &Res) const
virtual error_code getLibraryPath(DataRefImpl LibData, StringRef &Result) const
support::ulittle32_t NameRVA
virtual error_code getSymbolFileOffset(DataRefImpl Symb, uint64_t &Res) const
error_code getImportTableEntry(const import_directory_table_entry *&Result) const
virtual error_code getSectionSize(DataRefImpl Sec, uint64_t &Res) const
virtual error_code isSectionData(DataRefImpl Sec, bool &Res) const
size_t size() const
size - Get the array size.
content_iterator< SectionRef > section_iterator
int memcmp(const void *s1, const void *s2, size_t n);
support::ulittle32_t Characteristics
virtual error_code getRelocationAddress(DataRefImpl Rel, uint64_t &Res) const
* if(!EatIfPresent(lltok::kw_thread_local)) return false
detail::packed_endian_specific_integral< uint8_t, little, unaligned > ulittle8_t
virtual error_code isSectionBSS(DataRefImpl Sec, bool &Res) const
virtual StringRef getFileFormatName() const
content_iterator< SymbolRef > symbol_iterator
virtual error_code getLibraryNext(DataRefImpl LibData, LibraryRef &Result) const
support::ulittle32_t RelativeVirtualAddress
virtual error_code getSymbolNext(DataRefImpl Symb, SymbolRef &Res) const
A function that returns a base type.
support::ulittle16_t Type
support::ulittle8_t StorageClass
virtual section_iterator end_sections() const
virtual error_code getSectionContents(DataRefImpl Sec, StringRef &Res) const
support::ulittle32_t SizeOfRawData
void append(in_iter in_start, in_iter in_end)
virtual error_code getSectionName(DataRefImpl Sec, StringRef &Res) const
content_iterator< RelocationRef > relocation_iterator
enable_if_c< std::numeric_limits< T >::is_signed, bool >::type getAsInteger(unsigned Radix, T &Result) const
content_iterator< ImportDirectoryEntryRef > import_directory_iterator
support::ulittle32_t VirtualAddress
const coff_symbol * getCOFFSymbol(symbol_iterator &It) const
const coff_relocation * getCOFFRelocation(relocation_iterator &It) const
support::ulittle32_t SymbolTableIndex
virtual error_code isSectionRequiredForExecution(DataRefImpl Sec, bool &Res) const
friend class ImportDirectoryEntryRef
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
content_iterator & increment(error_code &err)
support::ulittle32_t PointerToRawData
friend class RelocationRef
union llvm::object::coff_symbol::@72 Name
error_code getPE32Header(const pe32_header *&Res) const
static const import_directory_table_entry * toImportEntry(DataRefImpl Imp)
detail::packed_endian_specific_integral< int16_t, little, unaligned > little16_t
error_code getSymbol(uint32_t index, const coff_symbol *&Res) const
const uint64_t UnknownAddressOrSize
COFFObjectFile(MemoryBuffer *Object, error_code &ec)
support::ulittle32_t Value
virtual error_code getSymbolSize(DataRefImpl Symb, uint64_t &Res) const
virtual error_code getSymbolType(DataRefImpl Symb, SymbolRef::Type &Res) const
support::ulittle32_t Size
detail::packed_endian_specific_integral< uint16_t, little, unaligned > ulittle16_t
size_t getBufferSize() const
virtual relocation_iterator section_rel_begin(DataRefImpl Sec) const
virtual error_code isSectionReadOnlyData(DataRefImpl Sec, bool &Res) const
virtual library_iterator begin_libraries_needed() const
virtual symbol_iterator begin_dynamic_symbols() const
const char * getBufferEnd() const
error_code getCOFFHeader(const coff_file_header *&Res) const
const coff_section * getCOFFSection(section_iterator &It) const
virtual symbol_iterator end_symbols() const
support::ulittle16_t NumberOfRelocations
detail::packed_endian_specific_integral< uint32_t, little, unaligned > ulittle32_t
support::ulittle32_t Zeroes
virtual error_code getSectionAlignment(DataRefImpl Sec, uint64_t &Res) const
static ObjectFile * createCOFFObjectFile(MemoryBuffer *Object)
virtual error_code getSymbolValue(DataRefImpl Symb, uint64_t &Val) const
virtual symbol_iterator begin_symbols() const
virtual error_code getRelocationTypeName(DataRefImpl Rel, SmallVectorImpl< char > &Result) const
virtual symbol_iterator end_dynamic_symbols() const
error_code getHeader(const coff_file_header *&Res) const
COFF::SectionCharacteristics Characteristics
support::ulittle32_t Offset
virtual error_code getSectionNext(DataRefImpl Sec, SectionRef &Res) const
virtual error_code getSectionAddress(DataRefImpl Sec, uint64_t &Res) const
error_code getName(StringRef &Result) const
virtual error_code getRelocationValueString(DataRefImpl Rel, SmallVectorImpl< char > &Result) const
virtual StringRef getLoadName() const