diff --git a/llvm/test/tools/llvm-readobj/ELF/relocations.test b/llvm/test/tools/llvm-readobj/ELF/relocations.test --- a/llvm/test/tools/llvm-readobj/ELF/relocations.test +++ b/llvm/test/tools/llvm-readobj/ELF/relocations.test @@ -116,130 +116,140 @@ # RUN: llvm-readobj -r --expand-relocs %t64 --elf-output-style=JSON --pretty-print \ # RUN: | FileCheck %s --check-prefix=JSON-EXPAND-64 -# JSON-EXPAND-64: "Relocations": [Section (2) .rel.text { -# JSON-EXPAND-64: "Relocation": { -# JSON-EXPAND-64-NEXT: "Offset": 0, -# JSON-EXPAND-64-NEXT: "Type": { -# JSON-EXPAND-64-NEXT: "Name": "R_X86_64_NONE", -# JSON-EXPAND-64-NEXT: "Value": 0 +# JSON-EXPAND-64: "Relocations": [ +# JSON-EXPAND-64-NEXT: { +# JSON-EXPAND-64-NEXT: "SectionIndex": 2 +# JSON-EXPAND-64-NEXT: "Relocs": [ +# JSON-EXPAND-64-NEXT: { +# JSON-EXPAND-64-NEXT: "Relocation": { +# JSON-EXPAND-64-NEXT: "Offset": 0, +# JSON-EXPAND-64-NEXT: "Type": { +# JSON-EXPAND-64-NEXT: "Name": "R_X86_64_NONE", +# JSON-EXPAND-64-NEXT: "Value": 0 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Symbol": { +# JSON-EXPAND-64-NEXT: "Name": "rel_0", +# JSON-EXPAND-64-NEXT: "Value": 1 +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: } # JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: "Symbol": { -# JSON-EXPAND-64-NEXT: "Name": "rel_0", -# JSON-EXPAND-64-NEXT: "Value": 1 -# JSON-EXPAND-64-NEXT: } -# JSON-EXPAND-64-NEXT: } -# JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: { -# JSON-EXPAND-64-NEXT: "Relocation": { -# JSON-EXPAND-64-NEXT: "Offset": 1, -# JSON-EXPAND-64-NEXT: "Type": { -# JSON-EXPAND-64-NEXT: "Name": "R_X86_64_PC32", -# JSON-EXPAND-64-NEXT: "Value": 2 -# JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: "Symbol": { -# JSON-EXPAND-64-NEXT: "Name": "rel_neg", -# JSON-EXPAND-64-NEXT: "Value": 2 -# JSON-EXPAND-64-NEXT: } -# JSON-EXPAND-64-NEXT: } -# JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: { -# JSON-EXPAND-64-NEXT: "Relocation": { -# JSON-EXPAND-64-NEXT: "Offset": 5, -# JSON-EXPAND-64-NEXT: "Type": { -# JSON-EXPAND-64-NEXT: "Name": "R_X86_64_PLT32", -# JSON-EXPAND-64-NEXT: "Value": 4 +# JSON-EXPAND-64-NEXT: { +# JSON-EXPAND-64-NEXT: "Relocation": { +# JSON-EXPAND-64-NEXT: "Offset": 1, +# JSON-EXPAND-64-NEXT: "Type": { +# JSON-EXPAND-64-NEXT: "Name": "R_X86_64_PC32", +# JSON-EXPAND-64-NEXT: "Value": 2 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Symbol": { +# JSON-EXPAND-64-NEXT: "Name": "rel_neg", +# JSON-EXPAND-64-NEXT: "Value": 2 +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: } # JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: "Symbol": { -# JSON-EXPAND-64-NEXT: "Name": "rel_pos", -# JSON-EXPAND-64-NEXT: "Value": 3 -# JSON-EXPAND-64-NEXT: } -# JSON-EXPAND-64-NEXT: } -# JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: { -# JSON-EXPAND-64-NEXT: "Relocation": { -# JSON-EXPAND-64-NEXT: "Offset": 9, -# JSON-EXPAND-64-NEXT: "Type": { -# JSON-EXPAND-64-NEXT: "Name": "R_X86_64_64", -# JSON-EXPAND-64-NEXT: "Value": 1 +# JSON-EXPAND-64-NEXT: { +# JSON-EXPAND-64-NEXT: "Relocation": { +# JSON-EXPAND-64-NEXT: "Offset": 5, +# JSON-EXPAND-64-NEXT: "Type": { +# JSON-EXPAND-64-NEXT: "Name": "R_X86_64_PLT32", +# JSON-EXPAND-64-NEXT: "Value": 4 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Symbol": { +# JSON-EXPAND-64-NEXT: "Name": "rel_pos", +# JSON-EXPAND-64-NEXT: "Value": 3 +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: } # JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: "Symbol": { -# JSON-EXPAND-64-NEXT: "Name": "rel_64", -# JSON-EXPAND-64-NEXT: "Value": 4 +# JSON-EXPAND-64-NEXT: { +# JSON-EXPAND-64-NEXT: "Relocation": { +# JSON-EXPAND-64-NEXT: "Offset": 9, +# JSON-EXPAND-64-NEXT: "Type": { +# JSON-EXPAND-64-NEXT: "Name": "R_X86_64_64", +# JSON-EXPAND-64-NEXT: "Value": 1 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Symbol": { +# JSON-EXPAND-64-NEXT: "Name": "rel_64", +# JSON-EXPAND-64-NEXT: "Value": 4 +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: } # JSON-EXPAND-64-NEXT: } -# JSON-EXPAND-64-NEXT: } -# JSON-EXPAND-64-NEXT: }} -# JSON-EXPAND-64-NEXT: Section (3) .rela.text { -# JSON-EXPAND-64-NEXT: , -# JSON-EXPAND-64-NEXT: { -# JSON-EXPAND-64-NEXT: "Relocation": { -# JSON-EXPAND-64-NEXT: "Offset": 0, -# JSON-EXPAND-64-NEXT: "Type": { -# JSON-EXPAND-64-NEXT: "Name": "R_X86_64_NONE", -# JSON-EXPAND-64-NEXT: "Value": 0 -# JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: "Symbol": { -# JSON-EXPAND-64-NEXT: "Name": "rela_0", -# JSON-EXPAND-64-NEXT: "Value": 5 -# JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: "Addend": 0 -# JSON-EXPAND-64-NEXT: } -# JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: { -# JSON-EXPAND-64-NEXT: "Relocation": { -# JSON-EXPAND-64-NEXT: "Offset": 1, -# JSON-EXPAND-64-NEXT: "Type": { -# JSON-EXPAND-64-NEXT: "Name": "R_X86_64_PC32", -# JSON-EXPAND-64-NEXT: "Value": 2 +# JSON-EXPAND-64-NEXT: ] +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: { +# JSON-EXPAND-64-NEXT: "SectionIndex": 3, +# JSON-EXPAND-64-NEXT: "Relocs": [ +# JSON-EXPAND-64-NEXT: { +# JSON-EXPAND-64-NEXT: "Relocation": { +# JSON-EXPAND-64-NEXT: "Offset": 0, +# JSON-EXPAND-64-NEXT: "Type": { +# JSON-EXPAND-64-NEXT: "Name": "R_X86_64_NONE", +# JSON-EXPAND-64-NEXT: "Value": 0 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Symbol": { +# JSON-EXPAND-64-NEXT: "Name": "rela_0", +# JSON-EXPAND-64-NEXT: "Value": 5 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Addend": 0 +# JSON-EXPAND-64-NEXT: } # JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: "Symbol": { -# JSON-EXPAND-64-NEXT: "Name": "rela_neg", -# JSON-EXPAND-64-NEXT: "Value": 6 +# JSON-EXPAND-64-NEXT: { +# JSON-EXPAND-64-NEXT: "Relocation": { +# JSON-EXPAND-64-NEXT: "Offset": 1, +# JSON-EXPAND-64-NEXT: "Type": { +# JSON-EXPAND-64-NEXT: "Name": "R_X86_64_PC32", +# JSON-EXPAND-64-NEXT: "Value": 2 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Symbol": { +# JSON-EXPAND-64-NEXT: "Name": "rela_neg", +# JSON-EXPAND-64-NEXT: "Value": 6 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Addend": 18446744073709551615 +# JSON-EXPAND-64-NEXT: } # JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: "Addend": 18446744073709551615 -# JSON-EXPAND-64-NEXT: } -# JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: { -# JSON-EXPAND-64-NEXT: "Relocation": { -# JSON-EXPAND-64-NEXT: "Offset": 5, -# JSON-EXPAND-64-NEXT: "Type": { -# JSON-EXPAND-64-NEXT: "Name": "R_X86_64_PLT32", -# JSON-EXPAND-64-NEXT: "Value": 4 +# JSON-EXPAND-64-NEXT: { +# JSON-EXPAND-64-NEXT: "Relocation": { +# JSON-EXPAND-64-NEXT: "Offset": 5, +# JSON-EXPAND-64-NEXT: "Type": { +# JSON-EXPAND-64-NEXT: "Name": "R_X86_64_PLT32", +# JSON-EXPAND-64-NEXT: "Value": 4 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Symbol": { +# JSON-EXPAND-64-NEXT: "Name": "rela_pos", +# JSON-EXPAND-64-NEXT: "Value": 7 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Addend": 2 +# JSON-EXPAND-64-NEXT: } # JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: "Symbol": { -# JSON-EXPAND-64-NEXT: "Name": "rela_pos", -# JSON-EXPAND-64-NEXT: "Value": 7 +# JSON-EXPAND-64-NEXT: { +# JSON-EXPAND-64-NEXT: "Relocation": { +# JSON-EXPAND-64-NEXT: "Offset": 18446744073709551615, +# JSON-EXPAND-64-NEXT: "Type": { +# JSON-EXPAND-64-NEXT: "Name": "R_X86_64_64", +# JSON-EXPAND-64-NEXT: "Value": 1 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Symbol": { +# JSON-EXPAND-64-NEXT: "Name": "rela_minneg", +# JSON-EXPAND-64-NEXT: "Value": 8 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Addend": 9223372036854775808 +# JSON-EXPAND-64-NEXT: } # JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: "Addend": 2 -# JSON-EXPAND-64-NEXT: } -# JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: { -# JSON-EXPAND-64-NEXT: "Relocation": { -# JSON-EXPAND-64-NEXT: "Offset": 18446744073709551615, -# JSON-EXPAND-64-NEXT: "Type": { -# JSON-EXPAND-64-NEXT: "Name": "R_X86_64_64", -# JSON-EXPAND-64-NEXT: "Value": 1 -# JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: "Symbol": { -# JSON-EXPAND-64-NEXT: "Name": "rela_minneg", -# JSON-EXPAND-64-NEXT: "Value": 8 -# JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: "Addend": 9223372036854775808 -# JSON-EXPAND-64-NEXT: } -# JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: { -# JSON-EXPAND-64-NEXT: "Relocation": { -# JSON-EXPAND-64-NEXT: "Offset": 9, -# JSON-EXPAND-64-NEXT: "Type": { -# JSON-EXPAND-64-NEXT: "Name": "R_X86_64_32S", -# JSON-EXPAND-64-NEXT: "Value": 11 -# JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: "Symbol": { -# JSON-EXPAND-64-NEXT: "Name": "rela_maxpos", -# JSON-EXPAND-64-NEXT: "Value": 9 -# JSON-EXPAND-64-NEXT: }, -# JSON-EXPAND-64-NEXT: "Addend": 9223372036854775807 -# JSON-EXPAND-64-NEXT: } -# JSON-EXPAND-64-NEXT: }} +# JSON-EXPAND-64-NEXT: { +# JSON-EXPAND-64-NEXT: "Relocation": { +# JSON-EXPAND-64-NEXT: "Offset": 9, +# JSON-EXPAND-64-NEXT: "Type": { +# JSON-EXPAND-64-NEXT: "Name": "R_X86_64_32S", +# JSON-EXPAND-64-NEXT: "Value": 11 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Symbol": { +# JSON-EXPAND-64-NEXT: "Name": "rela_maxpos", +# JSON-EXPAND-64-NEXT: "Value": 9 +# JSON-EXPAND-64-NEXT: }, +# JSON-EXPAND-64-NEXT: "Addend": 9223372036854775807 +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: ] +# JSON-EXPAND-64-NEXT: } +# JSON-EXPAND-64-NEXT: ] --- !ELF FileHeader: diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -719,6 +719,8 @@ virtual void printDefaultRelRelaReloc(const Relocation &R, StringRef SymbolName, StringRef RelocName); + virtual void printRelocationSectionInfo(const Elf_Shdr &Sec, StringRef Name, + const unsigned SecNdx); ScopedPrinter &W; }; @@ -741,6 +743,9 @@ StringRef SymbolName, StringRef RelocName) override; + void printRelocationSectionInfo(const Elf_Shdr &Sec, StringRef Name, + const unsigned SecNdx) override; + private: std::unique_ptr FileScope; }; @@ -6741,11 +6746,7 @@ StringRef Name = this->getPrintableSectionName(Sec); unsigned SecNdx = &Sec - &cantFail(this->Obj.sections()).front(); - W.startLine() << "Section (" << SecNdx << ") " << Name << " {\n"; - W.indent(); - this->printRelocationsHelper(Sec); - W.unindent(); - W.startLine() << "}\n"; + printRelocationSectionInfo(Sec, Name, SecNdx); } } @@ -6778,6 +6779,14 @@ OS << "\n"; } +template +void LLVMELFDumper::printRelocationSectionInfo(const Elf_Shdr &Sec, + StringRef Name, + const unsigned SecNdx) { + DictScope D(W, (Twine("Section (") + Twine(SecNdx) + ") " + Name).str()); + this->printRelocationsHelper(Sec); +} + template void LLVMELFDumper::printRelRelaReloc(const Relocation &R, const RelSymbol &RelSym) { @@ -7714,3 +7723,13 @@ StringRef RelocName) { this->printExpandedRelRelaReloc(R, SymbolName, RelocName); } + +template +void JSONELFDumper::printRelocationSectionInfo(const Elf_Shdr &Sec, + StringRef Name, + const unsigned SecNdx) { + DictScope Group(this->W); + this->W.printNumber("SectionIndex", SecNdx); + ListScope D(this->W, "Relocs"); + this->printRelocationsHelper(Sec); +}