[llvm] r241447 - Check that COFF .obj files have sections with zero virtual address spaces.

Rafael Espindola rafael.espindola at gmail.com
Mon Jul 6 07:26:07 PDT 2015


Author: rafael
Date: Mon Jul  6 09:26:07 2015
New Revision: 241447

URL: http://llvm.org/viewvc/llvm-project?rev=241447&view=rev
Log:
Check that COFF .obj files have sections with zero virtual address spaces.

When talking about the virtual address of sections the coff spec says:
  ... for simplicity, compilers should set this to zero. Otherwise, it is an
  arbitrary value that is subtracted from offsets during relocation.

We don't currently subtract it, so check that it is zero.

If some producer does create such files, we can change getRelocationOffset
instead.

Added:
    llvm/trunk/test/Object/Inputs/invalid-bad-section-address.coff
    llvm/trunk/test/Object/coff-invalid.test
Modified:
    llvm/trunk/lib/Object/COFFObjectFile.cpp
    llvm/trunk/tools/llvm-readobj/COFFDumper.cpp

Modified: llvm/trunk/lib/Object/COFFObjectFile.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Object/COFFObjectFile.cpp?rev=241447&r1=241446&r2=241447&view=diff
==============================================================================
--- llvm/trunk/lib/Object/COFFObjectFile.cpp (original)
+++ llvm/trunk/lib/Object/COFFObjectFile.cpp Mon Jul  6 09:26:07 2015
@@ -361,6 +361,8 @@ getFirstReloc(const coff_section *Sec, M
 relocation_iterator COFFObjectFile::section_rel_begin(DataRefImpl Ref) const {
   const coff_section *Sec = toSec(Ref);
   const coff_relocation *begin = getFirstReloc(Sec, Data, base());
+  if (begin && Sec->VirtualAddress != 0)
+    report_fatal_error("Sections with relocations should have an address of 0");
   DataRefImpl Ret;
   Ret.p = reinterpret_cast<uintptr_t>(begin);
   return relocation_iterator(RelocationRef(Ret, this));

Added: llvm/trunk/test/Object/Inputs/invalid-bad-section-address.coff
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/Inputs/invalid-bad-section-address.coff?rev=241447&view=auto
==============================================================================
Binary files llvm/trunk/test/Object/Inputs/invalid-bad-section-address.coff (added) and llvm/trunk/test/Object/Inputs/invalid-bad-section-address.coff Mon Jul  6 09:26:07 2015 differ

Added: llvm/trunk/test/Object/coff-invalid.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Object/coff-invalid.test?rev=241447&view=auto
==============================================================================
--- llvm/trunk/test/Object/coff-invalid.test (added)
+++ llvm/trunk/test/Object/coff-invalid.test Mon Jul  6 09:26:07 2015
@@ -0,0 +1,13 @@
+RUN: llvm-readobj -s %p/Inputs/invalid-bad-section-address.coff 2>&1 | \
+RUN: FileCheck --check-prefix=SECTIONS %s
+
+SECTIONS:      Section {
+SECTIONS-NEXT:   Number: 1
+SECTIONS-NEXT:   Name: .text (2E 74 65 78 74 00 00 00)
+SECTIONS-NEXT:   VirtualSize: 0x0
+SECTIONS-NEXT:   VirtualAddress: 0x1000000
+
+RUN: not llvm-readobj -r %p/Inputs/invalid-bad-section-address.coff 2>&1 | \
+RUN: FileCheck %s
+
+CHECK: Sections with relocations should have an address of 0

Modified: llvm/trunk/tools/llvm-readobj/COFFDumper.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-readobj/COFFDumper.cpp?rev=241447&r1=241446&r2=241447&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-readobj/COFFDumper.cpp (original)
+++ llvm/trunk/tools/llvm-readobj/COFFDumper.cpp Mon Jul  6 09:26:07 2015
@@ -48,7 +48,6 @@ public:
   COFFDumper(const llvm::object::COFFObjectFile *Obj, StreamWriter& Writer)
     : ObjDumper(Writer)
     , Obj(Obj) {
-    cacheRelocations();
   }
 
   void printFileHeaders() override;
@@ -92,6 +91,7 @@ private:
   typedef DenseMap<const coff_section*, std::vector<RelocationRef> > RelocMapTy;
 
   const llvm::object::COFFObjectFile *Obj;
+  bool RelocCached = false;
   RelocMapTy RelocMap;
   StringRef CVFileIndexToStringOffsetTable;
   StringRef CVStringTable;
@@ -119,6 +119,7 @@ std::error_code createCOFFDumper(const o
 // symbol used for the relocation at the offset.
 std::error_code COFFDumper::resolveSymbol(const coff_section *Section,
                                           uint64_t Offset, SymbolRef &Sym) {
+  cacheRelocations();
   const auto &Relocations = RelocMap[Section];
   for (const auto &Relocation : Relocations) {
     uint64_t RelocationOffset = Relocation.getOffset();
@@ -339,6 +340,10 @@ static std::error_code getSymbolAuxData(
 }
 
 void COFFDumper::cacheRelocations() {
+  if (RelocCached)
+    return;
+  RelocCached = true;
+
   for (const SectionRef &S : Obj->sections()) {
     const coff_section *Section = Obj->getCOFFSection(S);
 





More information about the llvm-commits mailing list