[dwarfdump] Ignore scattered relocations for mach-o.

When encountering a scattered relocation, the code would assert trying to
access an unexisting section. I couldn't find a way to expose the result
of the processing of a scattered reloc, and I'm really unsure what the
right thing to do is. This patch just skips them during the processing in
DwarfContext and adds a mach-o file to the tests that exposed the asserting
behavior.
(This is a new failure that is being exposed by Rafael's recent work on
the libObject interfaces. I think the wrong behavior has always happened,
but now it's asserting)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@243778 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Frederic Riss 2015-07-31 20:22:50 +00:00
parent d353c91d49
commit 09e26a42d2
4 changed files with 14 additions and 3 deletions

View File

@ -689,9 +689,15 @@ DWARFContextInMemory::DWARFContextInMemory(const object::ObjectFile &Obj,
} else if (auto *MObj = dyn_cast<MachOObjectFile>(&Obj)) {
// MachO also has relocations that point to sections and
// scattered relocations.
// FIXME: We are not handling scattered relocations, do we have to?
RSec = MObj->getRelocationSection(Reloc.getRawDataRefImpl());
SymAddr = RSec->getAddress();
auto RelocInfo = MObj->getRelocation(Reloc.getRawDataRefImpl());
if (MObj->isRelocationScattered(RelocInfo)) {
// FIXME: it's not clear how to correctly handle scattered
// relocations.
continue;
} else {
RSec = MObj->getRelocationSection(Reloc.getRawDataRefImpl());
SymAddr = RSec->getAddress();
}
}
// If we are given load addresses for the sections, we need to adjust:

View File

@ -27,3 +27,5 @@ int main() {
// $ cp <output> output2.dwz
// $ dwz -m output.dwz -r output1.dwz output2.dwz
// $ rm output2.dwz
// The mach-o version was generated using clang-3.6.2.

Binary file not shown.

View File

@ -1,6 +1,9 @@
; RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test.elf-x86-64 -debug-dump=all | FileCheck %s -check-prefix DUMP_ALL
; RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test.elf-x86-64 -debug-dump=info | FileCheck %s -check-prefix DUMP_INFO
; RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test.elf-x86-64 -debug-dump=ranges | FileCheck %s -check-prefix DUMP_RANGES
; RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test.macho-i386.o -debug-dump=all | FileCheck %s -check-prefix DUMP_ALL
; RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test.macho-i386.o -debug-dump=info | FileCheck %s -check-prefix DUMP_INFO
; RUN: llvm-dwarfdump %p/Inputs/dwarfdump-test.macho-i386.o -debug-dump=ranges | FileCheck %s -check-prefix DUMP_RANGES
; DUMP_ALL: .debug_info
; DUMP_ALL: .debug_ranges