[llvm] 23fd6e3 - [llvm-readobj] Fix JSON output for Relocations

Paul Kirth via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 17 16:58:07 PDT 2023


Author: Paul Kirth
Date: 2023-03-17T23:57:58Z
New Revision: 23fd6e360c2cfe1263474c65c5cb605dfbf0dfeb

URL: https://github.com/llvm/llvm-project/commit/23fd6e360c2cfe1263474c65c5cb605dfbf0dfeb
DIFF: https://github.com/llvm/llvm-project/commit/23fd6e360c2cfe1263474c65c5cb605dfbf0dfeb.diff

LOG: [llvm-readobj] Fix JSON output for Relocations

The existing JSON incorrectly outputs line breaks and other invalid JSON.

Example Before this patch:

```
...
"Relocations":[Section (9) .rela.dyn {
  0xA3B0 R_X86_64_RELATIVE - 0x43D0
  0xA3B8 R_X86_64_RELATIVE - 0x4A30
...
```

Example After this patch:

```
...
"Relocations":[Section (9) .rela.dyn {
{"Relocation":{"Offset":41904,"Type":{"Value":"R_X86_64_RELATIVE","RawValue":8},
"Symbol":{"Value":"","RawValue":0},"Addend":17360}},
{"Relocation":{"Offset":41912,"Type":{"Value":"R_X86_64_RELATIVE","RawValue":8},
"Symbol":{"Value":"","RawValue":0},"Addend":18992}},
{"Relocation":{"Offset":41920,"Type":{"Value":"R_X86_64_RELATIVE","RawValue":8},
"Symbol":{"Value":"","RawValue":0},"Addend":17440}},
...
```

Note there are still issues with the Section, but each Relocation is
now a valid JSON object that can be parsed. Future patches will address
the issues regarding JSON output for the Section.

Reviewed By: jhenderson

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

Added: 
    

Modified: 
    llvm/test/tools/llvm-readobj/ELF/relocations.test
    llvm/tools/llvm-readobj/ELFDumper.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/test/tools/llvm-readobj/ELF/relocations.test b/llvm/test/tools/llvm-readobj/ELF/relocations.test
index 360d3689d665..5c9e0293e496 100644
--- a/llvm/test/tools/llvm-readobj/ELF/relocations.test
+++ b/llvm/test/tools/llvm-readobj/ELF/relocations.test
@@ -47,8 +47,7 @@
 # GNU-64-NEXT:ffffffffffffffff  0000000800000001 R_X86_64_64            0000000000000003 rela_minneg - 8000000000000000
 # GNU-64-NEXT:0000000000000009  000000090000000b R_X86_64_32S           ffffffffffffffff rela_maxpos + 7fffffffffffffff
 
-## Show that --expand-relocs expands the relocation dump for LLVM style only
-## (and not GNU).
+## Show that --expand-relocs expands the relocation dump for LLVM style and not GNU.
 # RUN: llvm-readobj -r --expand-relocs %t64 \
 # RUN:   | FileCheck %s --check-prefix=LLVM-EXPAND-64 --match-full-lines --strict-whitespace
 # RUN: llvm-readelf -r --expand-relocs %t64 \
@@ -111,6 +110,137 @@
 # LLVM-EXPAND-64-NEXT:  }
 # LLVM-EXPAND-64-NEXT:]
 
+## Show that JSON relocations are always expanded.
+# RUN: llvm-readobj -r %t64 --elf-output-style=JSON --pretty-print \
+# RUN:   | FileCheck %s --check-prefix=JSON-EXPAND-64
+# 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:       "Value": "R_X86_64_NONE",
+# JSON-EXPAND-64-NEXT:       "RawValue": 0
+# JSON-EXPAND-64-NEXT:     },
+# JSON-EXPAND-64-NEXT:     "Symbol": {
+# JSON-EXPAND-64-NEXT:       "Value": "rel_0",
+# JSON-EXPAND-64-NEXT:       "RawValue": 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:       "Value": "R_X86_64_PC32",
+# JSON-EXPAND-64-NEXT:       "RawValue": 2
+# JSON-EXPAND-64-NEXT:     },
+# JSON-EXPAND-64-NEXT:     "Symbol": {
+# JSON-EXPAND-64-NEXT:       "Value": "rel_neg",
+# JSON-EXPAND-64-NEXT:       "RawValue": 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:       "Value": "R_X86_64_PLT32",
+# JSON-EXPAND-64-NEXT:       "RawValue": 4
+# JSON-EXPAND-64-NEXT:     },
+# JSON-EXPAND-64-NEXT:     "Symbol": {
+# JSON-EXPAND-64-NEXT:       "Value": "rel_pos",
+# JSON-EXPAND-64-NEXT:       "RawValue": 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:       "Value": "R_X86_64_64",
+# JSON-EXPAND-64-NEXT:       "RawValue": 1
+# JSON-EXPAND-64-NEXT:     },
+# JSON-EXPAND-64-NEXT:     "Symbol": {
+# JSON-EXPAND-64-NEXT:       "Value": "rel_64",
+# JSON-EXPAND-64-NEXT:       "RawValue": 4
+# 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:       "Value": "R_X86_64_NONE",
+# JSON-EXPAND-64-NEXT:       "RawValue": 0
+# JSON-EXPAND-64-NEXT:     },
+# JSON-EXPAND-64-NEXT:     "Symbol": {
+# JSON-EXPAND-64-NEXT:       "Value": "rela_0",
+# JSON-EXPAND-64-NEXT:       "RawValue": 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:       "Value": "R_X86_64_PC32",
+# JSON-EXPAND-64-NEXT:       "RawValue": 2
+# JSON-EXPAND-64-NEXT:     },
+# JSON-EXPAND-64-NEXT:     "Symbol": {
+# JSON-EXPAND-64-NEXT:       "Value": "rela_neg",
+# JSON-EXPAND-64-NEXT:       "RawValue": 6
+# 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:       "Value": "R_X86_64_PLT32",
+# JSON-EXPAND-64-NEXT:       "RawValue": 4
+# JSON-EXPAND-64-NEXT:     },
+# JSON-EXPAND-64-NEXT:     "Symbol": {
+# JSON-EXPAND-64-NEXT:       "Value": "rela_pos",
+# JSON-EXPAND-64-NEXT:       "RawValue": 7
+# 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:       "Value": "R_X86_64_64",
+# JSON-EXPAND-64-NEXT:       "RawValue": 1
+# JSON-EXPAND-64-NEXT:     },
+# JSON-EXPAND-64-NEXT:     "Symbol": {
+# JSON-EXPAND-64-NEXT:       "Value": "rela_minneg",
+# JSON-EXPAND-64-NEXT:       "RawValue": 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:       "Value": "R_X86_64_32S",
+# JSON-EXPAND-64-NEXT:       "RawValue": 11
+# JSON-EXPAND-64-NEXT:     },
+# JSON-EXPAND-64-NEXT:     "Symbol": {
+# JSON-EXPAND-64-NEXT:       "Value": "rela_maxpos",
+# JSON-EXPAND-64-NEXT:       "RawValue": 9
+# JSON-EXPAND-64-NEXT:     },
+# JSON-EXPAND-64-NEXT:     "Addend": 9223372036854775807
+# JSON-EXPAND-64-NEXT:   }
+# JSON-EXPAND-64-NEXT: }}
+
 --- !ELF
 FileHeader:
   Class:   ELFCLASS64
@@ -330,8 +460,7 @@ Symbols:
 # GNU-32-NEXT:ffffffff  00000701 R_386_32               00000003   rela_minneg - 80000000
 # GNU-32-NEXT:00000009  00000803 R_386_GOT32            ffffffff   rela_maxpos + 7fffffff
 
-## Show that --expand-relocs expands the relocation dump for LLVM style only
-## (and not GNU).
+## Show that --expand-relocs expands the relocation dump for LLVM style and not GNU.
 # RUN: llvm-readobj -r --expand-relocs %t32 \
 # RUN:   | FileCheck %s --check-prefix=LLVM-EXPAND-32 --strict-whitespace --match-full-lines
 # RUN: llvm-readelf -r --expand-relocs %t32 \

diff  --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp
index 7e832ed6d787..a0911de8f12e 100644
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -713,6 +713,13 @@ template <typename ELFT> class LLVMELFDumper : public ELFDumper<ELFT> {
 
 protected:
   void printSymbolOtherField(const Elf_Sym &Symbol) const;
+  virtual void printExpandedRelRelaReloc(const Relocation<ELFT> &R,
+                                         StringRef SymbolName,
+                                         StringRef RelocName);
+  virtual void printDefaultRelRelaReloc(const Relocation<ELFT> &R,
+                                        StringRef SymbolName,
+                                        StringRef RelocName);
+
   ScopedPrinter &W;
 };
 
@@ -730,6 +737,10 @@ template <typename ELFT> class JSONELFDumper : public LLVMELFDumper<ELFT> {
                         const Archive *A) override;
   virtual void printZeroSymbolOtherField(const Elf_Sym &Symbol) const override;
 
+  void printDefaultRelRelaReloc(const Relocation<ELFT> &R,
+                                StringRef SymbolName,
+                                StringRef RelocName) override;
+
 private:
   std::unique_ptr<DictScope> FileScope;
 };
@@ -6743,6 +6754,30 @@ void LLVMELFDumper<ELFT>::printRelrReloc(const Elf_Relr &R) {
   W.startLine() << W.hex(R) << "\n";
 }
 
+template <class ELFT>
+void LLVMELFDumper<ELFT>::printExpandedRelRelaReloc(const Relocation<ELFT> &R,
+                                                    StringRef SymbolName,
+                                                    StringRef RelocName) {
+  DictScope Group(W, "Relocation");
+  W.printHex("Offset", R.Offset);
+  W.printNumber("Type", RelocName, R.Type);
+  W.printNumber("Symbol", !SymbolName.empty() ? SymbolName : "-", R.Symbol);
+  if (R.Addend)
+    W.printHex("Addend", (uintX_t)*R.Addend);
+}
+
+template <class ELFT>
+void LLVMELFDumper<ELFT>::printDefaultRelRelaReloc(const Relocation<ELFT> &R,
+                                                   StringRef SymbolName,
+                                                   StringRef RelocName) {
+  raw_ostream &OS = W.startLine();
+  OS << W.hex(R.Offset) << " " << RelocName << " "
+     << (!SymbolName.empty() ? SymbolName : "-");
+  if (R.Addend)
+    OS << " " << W.hex((uintX_t)*R.Addend);
+  OS << "\n";
+}
+
 template <class ELFT>
 void LLVMELFDumper<ELFT>::printRelRelaReloc(const Relocation<ELFT> &R,
                                             const RelSymbol<ELFT> &RelSym) {
@@ -6751,19 +6786,9 @@ void LLVMELFDumper<ELFT>::printRelRelaReloc(const Relocation<ELFT> &R,
   this->Obj.getRelocationTypeName(R.Type, RelocName);
 
   if (opts::ExpandRelocs) {
-    DictScope Group(W, "Relocation");
-    W.printHex("Offset", R.Offset);
-    W.printNumber("Type", RelocName, R.Type);
-    W.printNumber("Symbol", !SymbolName.empty() ? SymbolName : "-", R.Symbol);
-    if (R.Addend)
-      W.printHex("Addend", (uintX_t)*R.Addend);
+    printExpandedRelRelaReloc(R, SymbolName, RelocName);
   } else {
-    raw_ostream &OS = W.startLine();
-    OS << W.hex(R.Offset) << " " << RelocName << " "
-       << (!SymbolName.empty() ? SymbolName : "-");
-    if (R.Addend)
-      OS << " " << W.hex((uintX_t)*R.Addend);
-    OS << "\n";
+    printDefaultRelRelaReloc(R, SymbolName, RelocName);
   }
 }
 
@@ -7682,3 +7707,10 @@ void JSONELFDumper<ELFT>::printZeroSymbolOtherField(
   // always print the `Other` field the same way.
   this->printSymbolOtherField(Symbol);
 }
+
+template <class ELFT>
+void JSONELFDumper<ELFT>::printDefaultRelRelaReloc(const Relocation<ELFT> &R,
+                                                   StringRef SymbolName,
+                                                   StringRef RelocName) {
+  this->printExpandedRelRelaReloc(R, SymbolName, RelocName);
+}


        


More information about the llvm-commits mailing list