[PATCH] D47800: llvm-readobj: fix printing number of relocations in Android packed format.

Rahul Chaudhry via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Jun 5 14:27:18 PDT 2018


rahulchaudhry created this revision.
rahulchaudhry added a reviewer: pcc.
Herald added subscribers: llvm-commits, srhines.

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.


Repository:
  rL LLVM

https://reviews.llvm.org/D47800

Files:
  test/tools/llvm-readobj/elf-packed-relocs.test
  tools/llvm-readobj/ELFDumper.cpp


Index: tools/llvm-readobj/ELFDumper.cpp
===================================================================
--- tools/llvm-readobj/ELFDumper.cpp
+++ tools/llvm-readobj/ELFDumper.cpp
@@ -2641,6 +2641,14 @@
     HasRelocSections = true;
     StringRef Name = unwrapOrError(Obj->getSectionName(&Sec));
     unsigned Entries = Sec.getEntityCount();
+    std::vector<Elf_Rela> android_relas;
+    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.
+      android_relas = unwrapOrError(Obj->android_relas(&Sec));
+      Entries = android_relas.size();
+    }
     uintX_t Offset = Sec.sh_offset;
     OS << "\nRelocation section '" << Name << "' at offset 0x"
        << to_hexString(Offset, false) << " contains " << Entries
@@ -2665,7 +2673,7 @@
       break;
     case ELF::SHT_ANDROID_REL:
     case ELF::SHT_ANDROID_RELA:
-      for (const auto &R : unwrapOrError(Obj->android_relas(&Sec)))
+      for (const auto &R : android_relas)
         printRelocation(Obj, SymTab, R, Sec.sh_type == ELF::SHT_ANDROID_RELA);
       break;
     }
Index: test/tools/llvm-readobj/elf-packed-relocs.test
===================================================================
--- test/tools/llvm-readobj/elf-packed-relocs.test
+++ 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 @@
 # 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


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D47800.150044.patch
Type: text/x-patch
Size: 2348 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180605/c5bb4109/attachment.bin>


More information about the llvm-commits mailing list