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 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 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; }