[llvm] r263537 - [llvm-objdump] Add support for dumping the PE TLS directory

David Majnemer via llvm-commits llvm-commits at lists.llvm.org
Mon Mar 14 23:14:01 PDT 2016


Author: majnemer
Date: Tue Mar 15 01:14:01 2016
New Revision: 263537

URL: http://llvm.org/viewvc/llvm-project?rev=263537&view=rev
Log:
[llvm-objdump] Add support for dumping the PE TLS directory

The PE TLS directory contains information about where the TLS data
resides in the image, what functions should be executed when threads are
created, etc.

Added:
    llvm/trunk/test/tools/llvm-objdump/Inputs/tls.exe.coff-x86_64
Modified:
    llvm/trunk/include/llvm/Object/COFF.h
    llvm/trunk/test/tools/llvm-objdump/coff-private-headers.test
    llvm/trunk/tools/llvm-objdump/COFFDump.cpp

Modified: llvm/trunk/include/llvm/Object/COFF.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Object/COFF.h?rev=263537&r1=263536&r2=263537&view=diff
==============================================================================
--- llvm/trunk/include/llvm/Object/COFF.h (original)
+++ llvm/trunk/include/llvm/Object/COFF.h Tue Mar 15 01:14:01 2016
@@ -485,6 +485,23 @@ struct coff_import_directory_table_entry
   support::ulittle32_t ImportAddressTableRVA;
 };
 
+template <typename IntTy>
+struct coff_tls_directory {
+  IntTy StartAddressOfRawData;
+  IntTy EndAddressOfRawData;
+  IntTy AddressOfIndex;
+  IntTy AddressOfCallBacks;
+  support::ulittle32_t SizeOfZeroFill;
+  support::ulittle32_t Characteristics;
+  uint32_t getAlignment() const {
+    uint32_t AlignBit = (Characteristics & 0x00F00000) >> 20;
+    return AlignBit ? 1 << (AlignBit - 1) : 0;
+  }
+};
+
+typedef coff_tls_directory<support::little32_t> coff_tls_directory32;
+typedef coff_tls_directory<support::little64_t> coff_tls_directory64;
+
 struct coff_load_configuration32 {
   support::ulittle32_t Characteristics;
   support::ulittle32_t TimeDateStamp;

Added: llvm/trunk/test/tools/llvm-objdump/Inputs/tls.exe.coff-x86_64
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/Inputs/tls.exe.coff-x86_64?rev=263537&view=auto
==============================================================================
Binary files llvm/trunk/test/tools/llvm-objdump/Inputs/tls.exe.coff-x86_64 (added) and llvm/trunk/test/tools/llvm-objdump/Inputs/tls.exe.coff-x86_64 Tue Mar 15 01:14:01 2016 differ

Modified: llvm/trunk/test/tools/llvm-objdump/coff-private-headers.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/coff-private-headers.test?rev=263537&r1=263536&r2=263537&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-objdump/coff-private-headers.test (original)
+++ llvm/trunk/test/tools/llvm-objdump/coff-private-headers.test Tue Mar 15 01:14:01 2016
@@ -43,6 +43,18 @@ EXPORT-NEXT:  Ordinal      RVA  Name
 EXPORT-NEXT:        5   0x2008
 EXPORT-NEXT:        6   0x2010  exportfn2
 
+// RUN: llvm-objdump -p %p/Inputs/tls.exe.coff-x86_64 | \
+// RUN:   FileCheck -check-prefix=TLS %s
+
+TLS:      TLS directory:
+TLS-NEXT:  StartAddressOfRawData: 0x00000000000000
+TLS-NEXT:  EndAddressOfRawData: 0x00000000000000
+TLS-NEXT:  AddressOfIndex: 0x00000000000000
+TLS-NEXT:  AddressOfCallBacks: 0x00000000000000
+TLS-NEXT:  SizeOfZeroFill: 0
+TLS-NEXT:  Characteristics: 0
+TLS-NEXT:  Alignment: 0
+
 // RUN: llvm-objdump -p %p/Inputs/nop.exe.coff-i386 | \
 // RUN:   FileCheck -check-prefix=LOADCFG %s
 

Modified: llvm/trunk/tools/llvm-objdump/COFFDump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/COFFDump.cpp?rev=263537&r1=263536&r2=263537&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objdump/COFFDump.cpp (original)
+++ llvm/trunk/tools/llvm-objdump/COFFDump.cpp Tue Mar 15 01:14:01 2016
@@ -252,6 +252,56 @@ printSEHTable(const COFFObjectFile *Obj,
   outs() << "\n\n";
 }
 
+template <typename T>
+static void printTLSDirectoryT(const coff_tls_directory<T> *TLSDir) {
+  size_t FormatWidth = sizeof(T) * 2;
+  outs() << "TLS directory:"
+         << "\n  StartAddressOfRawData: "
+         << format_hex(TLSDir->StartAddressOfRawData, FormatWidth)
+         << "\n  EndAddressOfRawData: "
+         << format_hex(TLSDir->EndAddressOfRawData, FormatWidth)
+         << "\n  AddressOfIndex: "
+         << format_hex(TLSDir->AddressOfIndex, FormatWidth)
+         << "\n  AddressOfCallBacks: "
+         << format_hex(TLSDir->AddressOfCallBacks, FormatWidth)
+         << "\n  SizeOfZeroFill: "
+         << TLSDir->SizeOfZeroFill
+         << "\n  Characteristics: "
+         << TLSDir->Characteristics
+         << "\n  Alignment: "
+         << TLSDir->getAlignment()
+         << "\n\n";
+}
+
+static void printTLSDirectory(const COFFObjectFile *Obj) {
+  const pe32_header *PE32Header;
+  error(Obj->getPE32Header(PE32Header));
+
+  const pe32plus_header *PE32PlusHeader;
+  error(Obj->getPE32PlusHeader(PE32PlusHeader));
+
+  // Skip if it's not executable.
+  if (!PE32Header && !PE32PlusHeader)
+    return;
+
+  const data_directory *DataDir;
+  error(Obj->getDataDirectory(COFF::TLS_TABLE, DataDir));
+  uintptr_t IntPtr = 0;
+  if (DataDir->RelativeVirtualAddress == 0)
+    return;
+  error(Obj->getRvaPtr(DataDir->RelativeVirtualAddress, IntPtr));
+
+  if (PE32Header) {
+    auto *TLSDir = reinterpret_cast<const coff_tls_directory32 *>(IntPtr);
+    printTLSDirectoryT(TLSDir);
+  } else {
+    auto *TLSDir = reinterpret_cast<const coff_tls_directory64 *>(IntPtr);
+    printTLSDirectoryT(TLSDir);
+  }
+
+  outs() << "\n";
+}
+
 static void printLoadConfiguration(const COFFObjectFile *Obj) {
   // Skip if it's not executable.
   const pe32_header *PE32Header;
@@ -555,6 +605,7 @@ void llvm::printCOFFUnwindInfo(const COF
 
 void llvm::printCOFFFileHeader(const object::ObjectFile *Obj) {
   const COFFObjectFile *file = dyn_cast<const COFFObjectFile>(Obj);
+  printTLSDirectory(file);
   printLoadConfiguration(file);
   printImportTables(file);
   printExportTable(file);




More information about the llvm-commits mailing list