[llvm] r275487 - llvm-objdump: handle stubbed and malformed dylibs better

Tim Northover via llvm-commits llvm-commits at lists.llvm.org
Thu Jul 14 15:13:32 PDT 2016


Author: tnorthover
Date: Thu Jul 14 17:13:32 2016
New Revision: 275487

URL: http://llvm.org/viewvc/llvm-project?rev=275487&view=rev
Log:
llvm-objdump: handle stubbed and malformed dylibs better

We were quite happy to read past the end of the valid section data when
disassembling. Instead we entirely skip stub dylibs, and tell the user what's
happened if their section only has partial data.

Added:
    llvm/trunk/test/tools/llvm-objdump/X86/Inputs/stubbed.dylib.macho-x86_64   (with props)
    llvm/trunk/test/tools/llvm-objdump/X86/Inputs/truncated-section.dylib.macho-x86_64   (with props)
    llvm/trunk/test/tools/llvm-objdump/X86/stubbed-dylib.test
    llvm/trunk/test/tools/llvm-objdump/X86/truncated-section.test
Modified:
    llvm/trunk/tools/llvm-objdump/MachODump.cpp

Added: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/stubbed.dylib.macho-x86_64
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/Inputs/stubbed.dylib.macho-x86_64?rev=275487&view=auto
==============================================================================
Binary files llvm/trunk/test/tools/llvm-objdump/X86/Inputs/stubbed.dylib.macho-x86_64 (added) and llvm/trunk/test/tools/llvm-objdump/X86/Inputs/stubbed.dylib.macho-x86_64 Thu Jul 14 17:13:32 2016 differ

Propchange: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/stubbed.dylib.macho-x86_64
------------------------------------------------------------------------------
    svn:executable = *

Added: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/truncated-section.dylib.macho-x86_64
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/Inputs/truncated-section.dylib.macho-x86_64?rev=275487&view=auto
==============================================================================
Binary files llvm/trunk/test/tools/llvm-objdump/X86/Inputs/truncated-section.dylib.macho-x86_64 (added) and llvm/trunk/test/tools/llvm-objdump/X86/Inputs/truncated-section.dylib.macho-x86_64 Thu Jul 14 17:13:32 2016 differ

Propchange: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/truncated-section.dylib.macho-x86_64
------------------------------------------------------------------------------
    svn:executable = *

Added: llvm/trunk/test/tools/llvm-objdump/X86/stubbed-dylib.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/stubbed-dylib.test?rev=275487&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objdump/X86/stubbed-dylib.test (added)
+++ llvm/trunk/test/tools/llvm-objdump/X86/stubbed-dylib.test Thu Jul 14 17:13:32 2016
@@ -0,0 +1,5 @@
+RUN: llvm-objdump -macho -d %p/Inputs/stubbed.dylib.macho-x86_64 | FileCheck %s
+
+CHECK: (__TEXT,__text) section
+CHECK-NOT: func
+CHECK-NOT: func2

Added: llvm/trunk/test/tools/llvm-objdump/X86/truncated-section.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/truncated-section.test?rev=275487&view=auto
==============================================================================
--- llvm/trunk/test/tools/llvm-objdump/X86/truncated-section.test (added)
+++ llvm/trunk/test/tools/llvm-objdump/X86/truncated-section.test Thu Jul 14 17:13:32 2016
@@ -0,0 +1,7 @@
+RUN: llvm-objdump -macho -d %p/Inputs/truncated-section.dylib.macho-x86_64 | FileCheck %s
+
+CHECK: _func:
+CHECK:     retq
+CHECK:     retq
+
+CHECK: section data ends, _func2 lies outside valid range

Modified: llvm/trunk/tools/llvm-objdump/MachODump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/MachODump.cpp?rev=275487&r1=275486&r2=275487&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-objdump/MachODump.cpp (original)
+++ llvm/trunk/tools/llvm-objdump/MachODump.cpp Thu Jul 14 17:13:32 2016
@@ -6662,6 +6662,10 @@ static void DisassembleMachO(StringRef F
 
     unsigned int Arch = MachOOF->getArch();
 
+    // Skip all symbols if this is a stubs file.
+    if (Bytes.size() == 0)
+      return;
+
     // Disassemble symbol by symbol.
     for (unsigned SymIdx = 0; SymIdx != Symbols.size(); SymIdx++) {
       Expected<StringRef> SymNameOrErr = Symbols[SymIdx].getName();
@@ -6716,10 +6720,17 @@ static void DisassembleMachO(StringRef F
         continue;
 
       // Start at the address of the symbol relative to the section's address.
+      uint64_t SectSize = Sections[SectIdx].getSize();
       uint64_t Start = Symbols[SymIdx].getValue();
       uint64_t SectionAddress = Sections[SectIdx].getAddress();
       Start -= SectionAddress;
 
+      if (Start > SectSize) {
+        outs() << "section data ends, " << SymName
+               << " lies outside valid range\n";
+        return;
+      }
+
       // Stop disassembling either at the beginning of the next symbol or at
       // the end of the section.
       bool containsNextSym = false;
@@ -6745,8 +6756,7 @@ static void DisassembleMachO(StringRef F
         ++NextSymIdx;
       }
 
-      uint64_t SectSize = Sections[SectIdx].getSize();
-      uint64_t End = containsNextSym ? NextSym : SectSize;
+      uint64_t End = containsNextSym ? std::min(NextSym, SectSize) : SectSize;
       uint64_t Size;
 
       symbolTableWorked = true;




More information about the llvm-commits mailing list