<div dir="ltr">On Thu, Jul 14, 2016 at 3:13 PM, Tim Northover via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: tnorthover<br>
Date: Thu Jul 14 17:13:32 2016<br>
New Revision: 275487<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=275487&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=275487&view=rev</a><br>
Log:<br>
llvm-objdump: handle stubbed and malformed dylibs better<br>
<br>
We were quite happy to read past the end of the valid section data when<br>
disassembling. Instead we entirely skip stub dylibs, and tell the user what's<br>
happened if their section only has partial data.<br>
<br>
Added:<br>
    llvm/trunk/test/tools/llvm-objdump/X86/Inputs/stubbed.dylib.macho-x86_64   (with props)<br>
    llvm/trunk/test/tools/llvm-objdump/X86/Inputs/truncated-section.dylib.macho-x86_64   (with props)<br></blockquote><div><br></div><div>I assume that this file can't work with yaml2obj because it is malformed?</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
    llvm/trunk/test/tools/llvm-objdump/X86/stubbed-dylib.test<br>
    llvm/trunk/test/tools/llvm-objdump/X86/truncated-section.test<br>
Modified:<br>
    llvm/trunk/tools/llvm-objdump/MachODump.cpp<br>
<br>
Added: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/stubbed.dylib.macho-x86_64<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/Inputs/stubbed.dylib.macho-x86_64?rev=275487&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/Inputs/stubbed.dylib.macho-x86_64?rev=275487&view=auto</a><br>
==============================================================================<br>
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<br>
<br>
Propchange: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/stubbed.dylib.macho-x86_64<br>
------------------------------------------------------------------------------<br>
    svn:executable = *<br>
<br>
Added: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/truncated-section.dylib.macho-x86_64<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/Inputs/truncated-section.dylib.macho-x86_64?rev=275487&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/Inputs/truncated-section.dylib.macho-x86_64?rev=275487&view=auto</a><br>
==============================================================================<br>
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<br>
<br>
Propchange: llvm/trunk/test/tools/llvm-objdump/X86/Inputs/truncated-section.dylib.macho-x86_64<br>
------------------------------------------------------------------------------<br>
    svn:executable = *<br>
<br>
Added: llvm/trunk/test/tools/llvm-objdump/X86/stubbed-dylib.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/stubbed-dylib.test?rev=275487&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/stubbed-dylib.test?rev=275487&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/tools/llvm-objdump/X86/stubbed-dylib.test (added)<br>
+++ llvm/trunk/test/tools/llvm-objdump/X86/stubbed-dylib.test Thu Jul 14 17:13:32 2016<br>
@@ -0,0 +1,5 @@<br>
+RUN: llvm-objdump -macho -d %p/Inputs/stubbed.dylib.macho-x86_64 | FileCheck %s<br>
+<br>
+CHECK: (__TEXT,__text) section<br>
+CHECK-NOT: func<br>
+CHECK-NOT: func2<br>
<br>
Added: llvm/trunk/test/tools/llvm-objdump/X86/truncated-section.test<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/truncated-section.test?rev=275487&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-objdump/X86/truncated-section.test?rev=275487&view=auto</a><br>
==============================================================================<br>
--- llvm/trunk/test/tools/llvm-objdump/X86/truncated-section.test (added)<br>
+++ llvm/trunk/test/tools/llvm-objdump/X86/truncated-section.test Thu Jul 14 17:13:32 2016<br>
@@ -0,0 +1,7 @@<br>
+RUN: llvm-objdump -macho -d %p/Inputs/truncated-section.dylib.macho-x86_64 | FileCheck %s<br>
+<br>
+CHECK: _func:<br>
+CHECK:     retq<br>
+CHECK:     retq<br>
+<br>
+CHECK: section data ends, _func2 lies outside valid range<br>
<br>
Modified: llvm/trunk/tools/llvm-objdump/MachODump.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/MachODump.cpp?rev=275487&r1=275486&r2=275487&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-objdump/MachODump.cpp?rev=275487&r1=275486&r2=275487&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/tools/llvm-objdump/MachODump.cpp (original)<br>
+++ llvm/trunk/tools/llvm-objdump/MachODump.cpp Thu Jul 14 17:13:32 2016<br>
@@ -6662,6 +6662,10 @@ static void DisassembleMachO(StringRef F<br>
<br>
     unsigned int Arch = MachOOF->getArch();<br>
<br>
+    // Skip all symbols if this is a stubs file.<br>
+    if (Bytes.size() == 0)<br>
+      return;<br>
+<br>
     // Disassemble symbol by symbol.<br>
     for (unsigned SymIdx = 0; SymIdx != Symbols.size(); SymIdx++) {<br>
       Expected<StringRef> SymNameOrErr = Symbols[SymIdx].getName();<br>
@@ -6716,10 +6720,17 @@ static void DisassembleMachO(StringRef F<br>
         continue;<br>
<br>
       // Start at the address of the symbol relative to the section's address.<br>
+      uint64_t SectSize = Sections[SectIdx].getSize();<br>
       uint64_t Start = Symbols[SymIdx].getValue();<br>
       uint64_t SectionAddress = Sections[SectIdx].getAddress();<br>
       Start -= SectionAddress;<br>
<br>
+      if (Start > SectSize) {<br>
+        outs() << "section data ends, " << SymName<br>
+               << " lies outside valid range\n";<br>
+        return;<br>
+      }<br>
+<br>
       // Stop disassembling either at the beginning of the next symbol or at<br>
       // the end of the section.<br>
       bool containsNextSym = false;<br>
@@ -6745,8 +6756,7 @@ static void DisassembleMachO(StringRef F<br>
         ++NextSymIdx;<br>
       }<br>
<br>
-      uint64_t SectSize = Sections[SectIdx].getSize();<br>
-      uint64_t End = containsNextSym ? NextSym : SectSize;<br>
+      uint64_t End = containsNextSym ? std::min(NextSym, SectSize) : SectSize;<br>
       uint64_t Size;<br>
<br>
       symbolTableWorked = true;<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">Saleem Abdulrasool<br>compnerd (at) compnerd (dot) org</div>
</div></div>