[llvm-readobj] -u: don't crash when dumping SHT_ARM_EXIDX if .symtab doesn't exist

Reviewed By: kongyi

Differential Revision: https://reviews.llvm.org/D62567

llvm-svn: 361929
This commit is contained in:
Fangrui Song 2019-05-29 06:18:34 +00:00
parent b3bcbb5b66
commit ed6fa44f23
2 changed files with 90 additions and 83 deletions

View File

@ -1,5 +1,8 @@
@ RUN: llvm-mc -triple armv7-linux-eabi -filetype obj -o - %s \ @ RUN: llvm-mc -triple armv7-linux-eabi -filetype obj %s -o %t
@ RUN: | llvm-readobj -u | FileCheck %s @ RUN: llvm-readobj -u %t | FileCheck --check-prefixes=CHECK,SYM %s
@@ If .symtab doesn't exist, we can still dump some information.
@ RUN: llvm-objcopy --allow-broken-links --strip-all %t - | llvm-readobj -u - | FileCheck %s
.syntax unified .syntax unified
@ -151,7 +154,7 @@ spare:
@ CHECK: Entries [ @ CHECK: Entries [
@ CHECK: Entry { @ CHECK: Entry {
@ CHECK: FunctionAddress: 0x0 @ CHECK: FunctionAddress: 0x0
@ CHECK: FunctionName: __personality @ SYM: FunctionName: __personality
@ CHECK: Model: Compact (Inline) @ CHECK: Model: Compact (Inline)
@ CHECK: PersonalityIndex: 0 @ CHECK: PersonalityIndex: 0
@ CHECK: Opcodes [ @ CHECK: Opcodes [
@ -167,7 +170,7 @@ spare:
@ CHECK: Entries [ @ CHECK: Entries [
@ CHECK: Entry { @ CHECK: Entry {
@ CHECK: FunctionAddress: 0x0 @ CHECK: FunctionAddress: 0x0
@ CHECK: FunctionName: personality0 @ SYM: FunctionName: personality0
@ CHECK: Model: Compact (Inline) @ CHECK: Model: Compact (Inline)
@ CHECK: PersonalityIndex: 0 @ CHECK: PersonalityIndex: 0
@ CHECK: Opcodes [ @ CHECK: Opcodes [
@ -183,18 +186,18 @@ spare:
@ CHECK: Entries [ @ CHECK: Entries [
@ CHECK: Entry { @ CHECK: Entry {
@ CHECK: FunctionAddress: 0x0 @ CHECK: FunctionAddress: 0x0
@ CHECK: FunctionName: personality1 @ SYM: FunctionName: personality1
@ CHECK: ExceptionHandlingTable: .ARM.extab.personality1 @ SYM: ExceptionHandlingTable: .ARM.extab.personality1
@ CHECK: TableEntryOffset: 0x0 @ SYM: TableEntryOffset: 0x0
@ CHECK: Model: Compact @ SYM: Model: Compact
@ CHECK: PersonalityIndex: 1 @ SYM: PersonalityIndex: 1
@ CHECK: Opcodes [ @ SYM: Opcodes [
@ CHECK: 0xB1 0x0F ; pop {r0, r1, r2, r3} @ SYM: 0xB1 0x0F ; pop {r0, r1, r2, r3}
@ CHECK: 0xA7 ; pop {r4, r5, r6, r7, r8, r9, r10, fp} @ SYM: 0xA7 ; pop {r4, r5, r6, r7, r8, r9, r10, fp}
@ CHECK: 0x3F ; vsp = vsp + 256 @ SYM: 0x3F ; vsp = vsp + 256
@ CHECK: 0xB0 ; finish @ SYM: 0xB0 ; finish
@ CHECK: 0xB0 ; finish @ SYM: 0xB0 ; finish
@ CHECK: ] @ SYM: ]
@ CHECK: } @ CHECK: }
@ CHECK: ] @ CHECK: ]
@ CHECK: } @ CHECK: }
@ -203,11 +206,11 @@ spare:
@ CHECK: Entries [ @ CHECK: Entries [
@ CHECK: Entry { @ CHECK: Entry {
@ CHECK: FunctionAddress: 0x0 @ CHECK: FunctionAddress: 0x0
@ CHECK: FunctionName: custom_personality @ SYM: FunctionName: custom_personality
@ CHECK: ExceptionHandlingTable: .ARM.extab.custom_personality @ SYM: ExceptionHandlingTable: .ARM.extab.custom_personality
@ CHECK: TableEntryOffset: 0x0 @ SYM: TableEntryOffset: 0x0
@ CHECK: Model: Generic @ SYM: Model: Generic
@ CHECK: PersonalityRoutineAddress: 0x0 @ SYM: PersonalityRoutineAddress: 0x0
@ CHECK: } @ CHECK: }
@ CHECK: ] @ CHECK: ]
@ CHECK: } @ CHECK: }
@ -216,7 +219,7 @@ spare:
@ CHECK: Entries [ @ CHECK: Entries [
@ CHECK: Entry { @ CHECK: Entry {
@ CHECK: FunctionAddress: 0x0 @ CHECK: FunctionAddress: 0x0
@ CHECK: FunctionName: opcodes @ SYM: FunctionName: opcodes
@ CHECK: Model: Compact (Inline) @ CHECK: Model: Compact (Inline)
@ CHECK: PersonalityIndex: 0 @ CHECK: PersonalityIndex: 0
@ CHECK: Opcodes [ @ CHECK: Opcodes [
@ -231,7 +234,7 @@ spare:
@ CHECK: Entries [ @ CHECK: Entries [
@ CHECK: Entry { @ CHECK: Entry {
@ CHECK: FunctionAddress: 0x0 @ CHECK: FunctionAddress: 0x0
@ CHECK: FunctionName: function0 @ SYM: FunctionName: function0
@ CHECK: Model: Compact (Inline) @ CHECK: Model: Compact (Inline)
@ CHECK: PersonalityIndex: 0 @ CHECK: PersonalityIndex: 0
@ CHECK: Opcodes [ @ CHECK: Opcodes [
@ -242,14 +245,14 @@ spare:
@ CHECK: } @ CHECK: }
@ CHECK: Entry { @ CHECK: Entry {
@ CHECK: FunctionAddress: 0x4 @ CHECK: FunctionAddress: 0x4
@ CHECK: FunctionName: function1 @ SYM: FunctionName: function1
@ CHECK: ExceptionHandlingTable: .ARM.extab.multiple @ SYM: ExceptionHandlingTable: .ARM.extab.multiple
@ CHECK: Model: Generic @ SYM: Model: Generic
@ CHECK: PersonalityRoutineAddress: 0x0 @ SYM: PersonalityRoutineAddress: 0x0
@ CHECK: } @ CHECK: }
@ CHECK: Entry { @ CHECK: Entry {
@ CHECK: FunctionAddress: 0x8 @ CHECK: FunctionAddress: 0x8
@ CHECK: FunctionName: function2 @ SYM: FunctionName: function2
@ CHECK: Model: Compact (Inline) @ CHECK: Model: Compact (Inline)
@ CHECK: PersonalityIndex: 0 @ CHECK: PersonalityIndex: 0
@ CHECK: Opcodes [ @ CHECK: Opcodes [
@ -263,63 +266,63 @@ spare:
@ CHECK: UnwindIndexTable { @ CHECK: UnwindIndexTable {
@ CHECK: SectionName: .ARM.exidx.raw @ CHECK: SectionName: .ARM.exidx.raw
@ CHECK: Entries [ @ CHECK: Entries [
@ CHECK: Opcodes [ @ SYM: Opcodes [
@ CHECK: 0xD7 ; pop {d8, d9, d10, d11, d12, d13, d14, d15} @ SYM: 0xD7 ; pop {d8, d9, d10, d11, d12, d13, d14, d15}
@ CHECK: 0xC9 0x02 ; pop {d0, d1, d2} @ SYM: 0xC9 0x02 ; pop {d0, d1, d2}
@ CHECK: 0xC8 0x02 ; pop {d16, d17, d18} @ SYM: 0xC8 0x02 ; pop {d16, d17, d18}
@ CHECK: 0xC7 0x03 ; pop {wCGR0, wCGR1} @ SYM: 0xC7 0x03 ; pop {wCGR0, wCGR1}
@ CHECK: 0xC6 0x02 ; pop {wR0, wR1, wR2} @ SYM: 0xC6 0x02 ; pop {wR0, wR1, wR2}
@ CHECK: 0xC2 ; pop {wR10, wR11, wR12} @ SYM: 0xC2 ; pop {wR10, wR11, wR12}
@ CHECK: 0xBA ; pop {d8, d9, d10} @ SYM: 0xBA ; pop {d8, d9, d10}
@ CHECK: 0xB3 0x12 ; pop {d1, d2, d3} @ SYM: 0xB3 0x12 ; pop {d1, d2, d3}
@ CHECK: 0xB2 0x80 0x04 ; vsp = vsp + 2564 @ SYM: 0xB2 0x80 0x04 ; vsp = vsp + 2564
@ CHECK: 0xB1 0x01 ; pop {r0} @ SYM: 0xB1 0x01 ; pop {r0}
@ CHECK: 0xB0 ; finish @ SYM: 0xB0 ; finish
@ CHECK: 0xA9 ; pop {r4, r5, lr} @ SYM: 0xA9 ; pop {r4, r5, lr}
@ CHECK: 0xA1 ; pop {r4, r5} @ SYM: 0xA1 ; pop {r4, r5}
@ CHECK: 0x91 ; vsp = r1 @ SYM: 0x91 ; vsp = r1
@ CHECK: 0x84 0xC0 ; pop {r10, fp, lr} @ SYM: 0x84 0xC0 ; pop {r10, fp, lr}
@ CHECK: 0x80 0xC0 ; pop {r10, fp} @ SYM: 0x80 0xC0 ; pop {r10, fp}
@ CHECK: 0x80 0x01 ; pop {r4} @ SYM: 0x80 0x01 ; pop {r4}
@ CHECK: 0x81 0x00 ; pop {ip} @ SYM: 0x81 0x00 ; pop {ip}
@ CHECK: 0x80 0x00 ; refuse to unwind @ SYM: 0x80 0x00 ; refuse to unwind
@ CHECK: 0x42 ; vsp = vsp - 12 @ SYM: 0x42 ; vsp = vsp - 12
@ CHECK: 0x02 ; vsp = vsp + 12 @ SYM: 0x02 ; vsp = vsp + 12
@ CHECK: ] @ SYM: ]
@ CHECK: ] @ CHECK: ]
@ CHECK: } @ CHECK: }
@ CHECK: UnwindIndexTable { @ CHECK: UnwindIndexTable {
@ CHECK: SectionName: .ARM.exidx.spare @ CHECK: SectionName: .ARM.exidx.spare
@ CHECK: Entries [ @ CHECK: Entries [
@ CHECK: Opcodes [ @ SYM: Opcodes [
@ CHECK: 0xD8 ; spare @ SYM: 0xD8 ; spare
@ CHECK: 0xD0 ; pop {d8} @ SYM: 0xD0 ; pop {d8}
@ CHECK: 0xCA ; spare @ SYM: 0xCA ; spare
@ CHECK: 0xC9 0x00 ; pop {d0} @ SYM: 0xC9 0x00 ; pop {d0}
@ CHECK: 0xC8 0x00 ; pop {d16} @ SYM: 0xC8 0x00 ; pop {d16}
@ CHECK: 0xC7 0x10 ; spare @ SYM: 0xC7 0x10 ; spare
@ CHECK: 0xC7 0x01 ; pop {wCGR0} @ SYM: 0xC7 0x01 ; pop {wCGR0}
@ CHECK: 0xC7 0x00 ; spare @ SYM: 0xC7 0x00 ; spare
@ CHECK: 0xC6 0x00 ; pop {wR0} @ SYM: 0xC6 0x00 ; pop {wR0}
@ CHECK: 0xC0 ; pop {wR10} @ SYM: 0xC0 ; pop {wR10}
@ CHECK: 0xB8 ; pop {d8} @ SYM: 0xB8 ; pop {d8}
@ CHECK: 0xB4 ; spare @ SYM: 0xB4 ; spare
@ CHECK: 0xB3 0x00 ; pop {d0} @ SYM: 0xB3 0x00 ; pop {d0}
@ CHECK: 0xB2 0x00 ; vsp = vsp + 516 @ SYM: 0xB2 0x00 ; vsp = vsp + 516
@ CHECK: 0xB1 0x10 ; spare @ SYM: 0xB1 0x10 ; spare
@ CHECK: 0xB1 0x01 ; pop {r0} @ SYM: 0xB1 0x01 ; pop {r0}
@ CHECK: 0xB1 0x00 ; spare @ SYM: 0xB1 0x00 ; spare
@ CHECK: 0xB0 ; finish @ SYM: 0xB0 ; finish
@ CHECK: 0xA8 ; pop {r4, lr} @ SYM: 0xA8 ; pop {r4, lr}
@ CHECK: 0xA0 ; pop {r4} @ SYM: 0xA0 ; pop {r4}
@ CHECK: 0x9F ; reserved (WiMMX MOVrr) @ SYM: 0x9F ; reserved (WiMMX MOVrr)
@ CHECK: 0x9D ; reserved (ARM MOVrr) @ SYM: 0x9D ; reserved (ARM MOVrr)
@ CHECK: 0x91 ; vsp = r1 @ SYM: 0x91 ; vsp = r1
@ CHECK: 0x88 0x00 ; pop {pc} @ SYM: 0x88 0x00 ; pop {pc}
@ CHECK: 0x80 0x00 ; refuse to unwind @ SYM: 0x80 0x00 ; refuse to unwind
@ CHECK: 0x40 ; vsp = vsp - 4 @ SYM: 0x40 ; vsp = vsp - 4
@ CHECK: 0x00 ; vsp = vsp + 4 @ SYM: 0x00 ; vsp = vsp + 4
@ CHECK: ] @ SYM: ]
@ CHECK: ] @ CHECK: ]
@ CHECK: } @ CHECK: }
@ CHECK: } @ CHECK: }

View File

@ -365,6 +365,8 @@ template <typename ET>
ErrorOr<StringRef> ErrorOr<StringRef>
PrinterContext<ET>::FunctionAtAddress(unsigned Section, PrinterContext<ET>::FunctionAtAddress(unsigned Section,
uint64_t Address) const { uint64_t Address) const {
if (!Symtab)
return readobj_error::unknown_symbol;
auto StrTableOrErr = ELF->getStringTableForSymtab(*Symtab); auto StrTableOrErr = ELF->getStringTableForSymtab(*Symtab);
if (!StrTableOrErr) if (!StrTableOrErr)
error(StrTableOrErr.takeError()); error(StrTableOrErr.takeError());
@ -550,13 +552,15 @@ void PrinterContext<ET>::PrintIndexTable(unsigned SectionIndex,
const Elf_Shdr *EHT = const Elf_Shdr *EHT =
FindExceptionTable(SectionIndex, Entry * IndexTableEntrySize + 4); FindExceptionTable(SectionIndex, Entry * IndexTableEntrySize + 4);
if (auto Name = ELF->getSectionName(EHT)) if (EHT)
SW.printString("ExceptionHandlingTable", *Name); if (auto Name = ELF->getSectionName(EHT))
SW.printString("ExceptionHandlingTable", *Name);
uint64_t TableEntryOffset = PREL31(Word1, IT->sh_addr); uint64_t TableEntryOffset = PREL31(Word1, IT->sh_addr);
SW.printHex("TableEntryOffset", TableEntryOffset); SW.printHex("TableEntryOffset", TableEntryOffset);
PrintExceptionTable(IT, EHT, TableEntryOffset); if (EHT)
PrintExceptionTable(IT, EHT, TableEntryOffset);
} }
} }
} }