llvm-readobj: Print out address table when dumping COFF delay-import table
authorRui Ueyama <ruiu@google.com>
Thu, 13 Nov 2014 03:22:54 +0000 (03:22 +0000)
committerRui Ueyama <ruiu@google.com>
Thu, 13 Nov 2014 03:22:54 +0000 (03:22 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@221855 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Object/COFF.h
lib/Object/COFFObjectFile.cpp
test/tools/llvm-readobj/imports.test
tools/llvm-readobj/COFFDumper.cpp

index 579cbadbc9454b266a20f73284128a5b30148231..cf98285e8fbbd2496fa97c49098e1a1e2289a4db 100644 (file)
@@ -688,6 +688,7 @@ public:
                               StringRef &Name) const;
 
   bool isRelocatableObject() const override;
+  bool is64() const { return PE32PlusHeader; }
 
   static inline bool classof(const Binary *v) { return v->isCOFF(); }
 };
@@ -740,6 +741,7 @@ public:
   std::error_code getName(StringRef &Result) const;
   std::error_code getDelayImportTable(
       const delay_import_directory_table_entry *&Result) const;
+  std::error_code getImportAddress(int AddrIndex, uint64_t &Result) const;
 
 private:
   const delay_import_directory_table_entry *Table;
index eea84c78762baa5fd966233b0d36ec70498cda47..dadad1f2603a7a9129a81fd3bc93772829510314 100644 (file)
@@ -1258,6 +1258,20 @@ getDelayImportTable(const delay_import_directory_table_entry *&Result) const {
   return object_error::success;
 }
 
+std::error_code DelayImportDirectoryEntryRef::
+getImportAddress(int AddrIndex, uint64_t &Result) const {
+  uint32_t RVA = Table[Index].DelayImportAddressTable +
+      AddrIndex * (OwningObject->is64() ? 8 : 4);
+  uintptr_t IntPtr = 0;
+  if (std::error_code EC = OwningObject->getRvaPtr(RVA, IntPtr))
+    return EC;
+  if (OwningObject->is64())
+    Result = *reinterpret_cast<const uint64_t *>(IntPtr);
+  else
+    Result = *reinterpret_cast<const uint32_t *>(IntPtr);
+  return object_error::success;
+}
+
 bool ExportDirectoryEntryRef::
 operator==(const ExportDirectoryEntryRef &Other) const {
   return ExportTable == Other.ExportTable && Index == Other.Index;
index 82b7dc711c8d02ef37a9862d0c88064ac152f337..58512f42adcdf81bdba4b57da16bb731af4cc11f 100644 (file)
@@ -34,8 +34,14 @@ X86-NEXT:   ImportAddressTable: 0x3010
 X86-NEXT:   ImportNameTable: 0x2090
 X86-NEXT:   BoundDelayImportTable: 0x20AC
 X86-NEXT:   UnloadDelayImportTable: 0x0
-X86-NEXT:   Symbol: Func5 (0)
-X86-NEXT:   Symbol: Func4 (0)
+X86-NEXT:   Import {
+X86-NEXT:     Symbol: Func5 (0)
+X86-NEXT:     Address: 0x401073
+X86-NEXT:   }
+X86-NEXT:   Import {
+X86-NEXT:     Symbol: Func4 (0)
+X86-NEXT:     Address: 0x401052
+X86-NEXT:   }
 X86-NEXT: }
 
 X64:      Import {
@@ -71,6 +77,12 @@ X64-NEXT:   ImportAddressTable: 0x3010
 X64-NEXT:   ImportNameTable: 0x20E0
 X64-NEXT:   BoundDelayImportTable: 0x2108
 X64-NEXT:   UnloadDelayImportTable: 0x0
-X64-NEXT:   Symbol: Func5 (0)
-X64-NEXT:   Symbol: Func4 (0)
+X64-NEXT:   Import {
+X64-NEXT:     Symbol: Func5 (0)
+X64-NEXT:     Address: 0x1400010F1
+X64-NEXT:   }
+X64-NEXT:   Import {
+X64-NEXT:     Symbol: Func4 (0)
+X64-NEXT:     Address: 0x140001066
+X64-NEXT:   }
 X64-NEXT: }
index 65659ad9fc92749de3914f678f96d952dfd86450..7c12f068a82d96b9e83e55977d39af005cb9b75f 100644 (file)
@@ -81,6 +81,9 @@ private:
   std::error_code resolveSymbolName(const coff_section *Section,
                                     uint64_t Offset, StringRef &Name);
   void printImportedSymbols(iterator_range<imported_symbol_iterator> Range);
+  void printDelayImportedSymbols(
+      const DelayImportDirectoryEntryRef &I,
+      iterator_range<imported_symbol_iterator> Range);
 
   typedef DenseMap<const coff_section*, std::vector<RelocationRef> > RelocMapTy;
 
@@ -1002,6 +1005,23 @@ void COFFDumper::printImportedSymbols(
   }
 }
 
+void COFFDumper::printDelayImportedSymbols(
+    const DelayImportDirectoryEntryRef &I,
+    iterator_range<imported_symbol_iterator> Range) {
+  int Index = 0;
+  for (const ImportedSymbolRef &S : Range) {
+    DictScope Import(W, "Import");
+    StringRef Sym;
+    if (error(S.getSymbolName(Sym))) return;
+    uint16_t Ordinal;
+    if (error(S.getOrdinal(Ordinal))) return;
+    W.printNumber("Symbol", Sym, Ordinal);
+    uint64_t Addr;
+    if (error(I.getImportAddress(Index++, Addr))) return;
+    W.printHex("Address", Addr);
+  }
+}
+
 void COFFDumper::printCOFFImports() {
   // Regular imports
   for (const ImportDirectoryEntryRef &I : Obj->import_directories()) {
@@ -1031,7 +1051,7 @@ void COFFDumper::printCOFFImports() {
     W.printHex("ImportNameTable", Table->DelayImportNameTable);
     W.printHex("BoundDelayImportTable", Table->BoundDelayImportTable);
     W.printHex("UnloadDelayImportTable", Table->UnloadDelayImportTable);
-    printImportedSymbols(I.imported_symbols());
+    printDelayImportedSymbols(I, I.imported_symbols());
   }
 }