From: Peter Collingbourne Date: Thu, 7 Jun 2018 00:02:07 +0000 (+0000) Subject: llvm-readobj: fix printing number of relocations in Android packed format. X-Git-Tag: android-x86-7.1-r4~155 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=032b3051e3a47c01d5fac64c152815aa98ca373d;p=android-x86%2Fexternal-llvm.git llvm-readobj: fix printing number of relocations in Android packed format. With '-elf-output-style=GNU -relocations', a header containing the number of entries is printed before all the relocation entries in the section. For Android packed format, we need to perform the unpacking first before we can get the actual number of relocations in the section. Patch by Rahul Chaudhry! Differential Revision: https://reviews.llvm.org/D47800 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@334147 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/test/tools/llvm-readobj/elf-packed-relocs.test b/test/tools/llvm-readobj/elf-packed-relocs.test index 49f6b36d3a4..4a59dafe8ef 100644 --- a/test/tools/llvm-readobj/elf-packed-relocs.test +++ b/test/tools/llvm-readobj/elf-packed-relocs.test @@ -14,6 +14,7 @@ # LLVM1-NEXT: } # RUN: yaml2obj -docnum 1 %s | llvm-readobj -elf-output-style=GNU -relocations - | FileCheck --check-prefix=GNU1 %s +# GNU1: Relocation section '.rela.dyn' at offset 0x180 contains 8 entries: # GNU1: 0000000000001100 0000000000000008 R_X86_64_RELATIVE 0 # GNU1-NEXT: 0000000000001180 0000000000000008 R_X86_64_RELATIVE 0 # GNU1-NEXT: 0000000000001188 0000000100000001 R_X86_64_64 0000000000000000 sym1 + 0 @@ -60,6 +61,7 @@ Symbols: # LLVM2-NEXT: } # RUN: yaml2obj -docnum 2 %s | llvm-readobj -elf-output-style=GNU -relocations - | FileCheck --check-prefix=GNU2 %s +# GNU2: Relocation section '.rel.dyn' at offset 0xfc contains 10 entries: # GNU2: 00001008 00000101 R_386_32 00000000 sym1 # GNU2-NEXT: 00001010 00000203 R_386_GOT32 00000000 sym2 # GNU2-NEXT: 0000100c 00000008 R_386_RELATIVE diff --git a/tools/llvm-readobj/ELFDumper.cpp b/tools/llvm-readobj/ELFDumper.cpp index b6fed4f3c34..2492fa2acc2 100644 --- a/tools/llvm-readobj/ELFDumper.cpp +++ b/tools/llvm-readobj/ELFDumper.cpp @@ -2641,6 +2641,14 @@ template void GNUStyle::printRelocations(const ELFO *Obj) { HasRelocSections = true; StringRef Name = unwrapOrError(Obj->getSectionName(&Sec)); unsigned Entries = Sec.getEntityCount(); + std::vector AndroidRelas; + if (Sec.sh_type == ELF::SHT_ANDROID_REL || + Sec.sh_type == ELF::SHT_ANDROID_RELA) { + // Android's packed relocation section needs to be unpacked first + // to get the actual number of entries. + AndroidRelas = unwrapOrError(Obj->android_relas(&Sec)); + Entries = AndroidRelas.size(); + } uintX_t Offset = Sec.sh_offset; OS << "\nRelocation section '" << Name << "' at offset 0x" << to_hexString(Offset, false) << " contains " << Entries @@ -2665,7 +2673,7 @@ template void GNUStyle::printRelocations(const ELFO *Obj) { break; case ELF::SHT_ANDROID_REL: case ELF::SHT_ANDROID_RELA: - for (const auto &R : unwrapOrError(Obj->android_relas(&Sec))) + for (const auto &R : AndroidRelas) printRelocation(Obj, SymTab, R, Sec.sh_type == ELF::SHT_ANDROID_RELA); break; }