diff options
| -rwxr-xr-x | llvm/test/tools/llvm-objdump/X86/Inputs/stubbed.dylib.macho-x86_64 | bin | 0 -> 784 bytes | |||
| -rwxr-xr-x | llvm/test/tools/llvm-objdump/X86/Inputs/truncated-section.dylib.macho-x86_64 | bin | 0 -> 4208 bytes | |||
| -rw-r--r-- | llvm/test/tools/llvm-objdump/X86/stubbed-dylib.test | 5 | ||||
| -rw-r--r-- | llvm/test/tools/llvm-objdump/X86/truncated-section.test | 7 | ||||
| -rw-r--r-- | llvm/tools/llvm-objdump/MachODump.cpp | 14 |
5 files changed, 24 insertions, 2 deletions
diff --git a/llvm/test/tools/llvm-objdump/X86/Inputs/stubbed.dylib.macho-x86_64 b/llvm/test/tools/llvm-objdump/X86/Inputs/stubbed.dylib.macho-x86_64 Binary files differnew file mode 100755 index 00000000000..144738bc97d --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/Inputs/stubbed.dylib.macho-x86_64 diff --git a/llvm/test/tools/llvm-objdump/X86/Inputs/truncated-section.dylib.macho-x86_64 b/llvm/test/tools/llvm-objdump/X86/Inputs/truncated-section.dylib.macho-x86_64 Binary files differnew file mode 100755 index 00000000000..a099ee2d379 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/Inputs/truncated-section.dylib.macho-x86_64 diff --git a/llvm/test/tools/llvm-objdump/X86/stubbed-dylib.test b/llvm/test/tools/llvm-objdump/X86/stubbed-dylib.test new file mode 100644 index 00000000000..6f7f7221eb1 --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/stubbed-dylib.test @@ -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 diff --git a/llvm/test/tools/llvm-objdump/X86/truncated-section.test b/llvm/test/tools/llvm-objdump/X86/truncated-section.test new file mode 100644 index 00000000000..e9fe75da71a --- /dev/null +++ b/llvm/test/tools/llvm-objdump/X86/truncated-section.test @@ -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 diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp index 08bc1f48240..991ccee47a5 100644 --- a/llvm/tools/llvm-objdump/MachODump.cpp +++ b/llvm/tools/llvm-objdump/MachODump.cpp @@ -6662,6 +6662,10 @@ static void DisassembleMachO(StringRef Filename, MachOObjectFile *MachOOF, 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 Filename, MachOObjectFile *MachOOF, 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 Filename, MachOObjectFile *MachOOF, ++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; |

