Skip to content

Commit 15230eb

Browse files
committed
[llvm-readobj][ELF] Fix broken JSON output with --dynamic-table
When printing JSON output with --dynamic-table I noticed that the output is invalid JSON. This patch overrides the printDynamicTable() function in the JSONELFDumper to return a list of dictionaries for the DynamicSection value. Before this commit the output was: { "FileSummary": { "File": "bin/llvm-readelf", "Format": "elf64-x86-64", "Arch": "x86_64", "AddressSize": "64bit", "LoadName": "<Not found>" }DynamicSection [ (35 entries) Tag Type Name/Value 0x000000000000001D RUNPATH Library runpath: [$ORIGIN/../lib:] 0x0000000000000001 NEEDED Shared library: [libm.so.6] 0x0000000000000001 NEEDED Shared library: [libz.so.1] 0x0000000000000001 NEEDED Shared library: [libzstd.so.1] Whereas now it is: "DynamicSection": [ { "Tag": 29, "Value": "Library runpath: [$ORIGIN/../lib:]", "Type": "RUNPATH" }, { "Tag": 1, "Value": "Shared library: [libm.so.6]", "Type": "NEEDED" },
1 parent 35a2b60 commit 15230eb

File tree

2 files changed

+328
-0
lines changed

2 files changed

+328
-0
lines changed

llvm/test/tools/llvm-readobj/ELF/dynamic-tags.test

Lines changed: 313 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@
88
# RUN: llvm-readelf --dynamic-table %t1 \
99
# RUN: | FileCheck %s --strict-whitespace --match-full-lines --check-prefix=GNU64
1010
# RUN: llvm-readelf -d %t1 | FileCheck %s --check-prefix=GNU64
11+
# RUN: llvm-readelf --dynamic-table --pretty-print --elf-output-style=JSON %t1 \
12+
# RUN: | FileCheck %s --check-prefix=JSON64
13+
# RUN: llvm-readelf -d --pretty-print --elf-output-style=JSON %t1 | FileCheck %s --check-prefix=JSON64
1114

1215
# LLVM64:DynamicSection [ (61 entries)
1316
# LLVM64-NEXT: Tag Type Name/Value
@@ -138,6 +141,316 @@
138141
# GNU64-NEXT: 0x0000000076543210 (<unknown:>0x76543210) 0x5555666677778888
139142
# GNU64-NEXT: 0x0000000000000000 (NULL) 0x0
140143

144+
# JSON64:"DynamicSection": [
145+
# JSON64-NEXT: {
146+
# JSON64-NEXT: "Tag": 1,
147+
# JSON64-NEXT: "Value": "Shared library: [D]",
148+
# JSON64-NEXT: "Type": "NEEDED"
149+
# JSON64-NEXT: },
150+
# JSON64-NEXT: {
151+
# JSON64-NEXT: "Tag": 2,
152+
# JSON64-NEXT: "Value": "16 (bytes)",
153+
# JSON64-NEXT: "Type": "PLTRELSZ"
154+
# JSON64-NEXT: },
155+
# JSON64-NEXT: {
156+
# JSON64-NEXT: "Tag": 3,
157+
# JSON64-NEXT: "Value": "0x1000",
158+
# JSON64-NEXT: "Type": "PLTGOT"
159+
# JSON64-NEXT: },
160+
# JSON64-NEXT: {
161+
# JSON64-NEXT: "Tag": 4,
162+
# JSON64-NEXT: "Value": "0x1000",
163+
# JSON64-NEXT: "Type": "HASH"
164+
# JSON64-NEXT: },
165+
# JSON64-NEXT: {
166+
# JSON64-NEXT: "Tag": 5,
167+
# JSON64-NEXT: "Value": "0x1000",
168+
# JSON64-NEXT: "Type": "STRTAB"
169+
# JSON64-NEXT: },
170+
# JSON64-NEXT: {
171+
# JSON64-NEXT: "Tag": 6,
172+
# JSON64-NEXT: "Value": "0x1000",
173+
# JSON64-NEXT: "Type": "SYMTAB"
174+
# JSON64-NEXT: },
175+
# JSON64-NEXT: {
176+
# JSON64-NEXT: "Tag": 7,
177+
# JSON64-NEXT: "Value": "0x1000",
178+
# JSON64-NEXT: "Type": "RELA"
179+
# JSON64-NEXT: },
180+
# JSON64-NEXT: {
181+
# JSON64-NEXT: "Tag": 8,
182+
# JSON64-NEXT: "Value": "16 (bytes)",
183+
# JSON64-NEXT: "Type": "RELASZ"
184+
# JSON64-NEXT: },
185+
# JSON64-NEXT: {
186+
# JSON64-NEXT: "Tag": 9,
187+
# JSON64-NEXT: "Value": "1929 (bytes)",
188+
# JSON64-NEXT: "Type": "RELAENT"
189+
# JSON64-NEXT: },
190+
# JSON64-NEXT: {
191+
# JSON64-NEXT: "Tag": 10,
192+
# JSON64-NEXT: "Value": "16 (bytes)",
193+
# JSON64-NEXT: "Type": "STRSZ"
194+
# JSON64-NEXT: },
195+
# JSON64-NEXT: {
196+
# JSON64-NEXT: "Tag": 11,
197+
# JSON64-NEXT: "Value": "2439 (bytes)",
198+
# JSON64-NEXT: "Type": "SYMENT"
199+
# JSON64-NEXT: },
200+
# JSON64-NEXT: {
201+
# JSON64-NEXT: "Tag": 12,
202+
# JSON64-NEXT: "Value": "0x1000",
203+
# JSON64-NEXT: "Type": "INIT"
204+
# JSON64-NEXT: },
205+
# JSON64-NEXT: {
206+
# JSON64-NEXT: "Tag": 13,
207+
# JSON64-NEXT: "Value": "0x1000",
208+
# JSON64-NEXT: "Type": "FINI"
209+
# JSON64-NEXT: },
210+
# JSON64-NEXT: {
211+
# JSON64-NEXT: "Tag": 14,
212+
# JSON64-NEXT: "Value": "Library soname: [U]",
213+
# JSON64-NEXT: "Type": "SONAME"
214+
# JSON64-NEXT: },
215+
# JSON64-NEXT: {
216+
# JSON64-NEXT: "Tag": 15,
217+
# JSON64-NEXT: "Value": "Library rpath: [f]",
218+
# JSON64-NEXT: "Type": "RPATH"
219+
# JSON64-NEXT: },
220+
# JSON64-NEXT: {
221+
# JSON64-NEXT: "Tag": 16,
222+
# JSON64-NEXT: "Value": "0x1234567890ABCDEF",
223+
# JSON64-NEXT: "Type": "SYMBOLIC"
224+
# JSON64-NEXT: },
225+
# JSON64-NEXT: {
226+
# JSON64-NEXT: "Tag": 17,
227+
# JSON64-NEXT: "Value": "0x1000",
228+
# JSON64-NEXT: "Type": "REL"
229+
# JSON64-NEXT: },
230+
# JSON64-NEXT: {
231+
# JSON64-NEXT: "Tag": 18,
232+
# JSON64-NEXT: "Value": "16 (bytes)",
233+
# JSON64-NEXT: "Type": "RELSZ"
234+
# JSON64-NEXT: },
235+
# JSON64-NEXT: {
236+
# JSON64-NEXT: "Tag": 19,
237+
# JSON64-NEXT: "Value": "291 (bytes)",
238+
# JSON64-NEXT: "Type": "RELENT"
239+
# JSON64-NEXT: },
240+
# JSON64-NEXT: {
241+
# JSON64-NEXT: "Tag": 20,
242+
# JSON64-NEXT: "Value": "RELA",
243+
# JSON64-NEXT: "Type": "PLTREL"
244+
# JSON64-NEXT: },
245+
# JSON64-NEXT: {
246+
# JSON64-NEXT: "Tag": 21,
247+
# JSON64-NEXT: "Value": "0xFEDCBA0987654321",
248+
# JSON64-NEXT: "Type": "DEBUG"
249+
# JSON64-NEXT: },
250+
# JSON64-NEXT: {
251+
# JSON64-NEXT: "Tag": 22,
252+
# JSON64-NEXT: "Value": "0x1122334455667788",
253+
# JSON64-NEXT: "Type": "TEXTREL"
254+
# JSON64-NEXT: },
255+
# JSON64-NEXT: {
256+
# JSON64-NEXT: "Tag": 23,
257+
# JSON64-NEXT: "Value": "0x1000",
258+
# JSON64-NEXT: "Type": "JMPREL"
259+
# JSON64-NEXT: },
260+
# JSON64-NEXT: {
261+
# JSON64-NEXT: "Tag": 24,
262+
# JSON64-NEXT: "Value": "0x8877665544332211",
263+
# JSON64-NEXT: "Type": "BIND_NOW"
264+
# JSON64-NEXT: },
265+
# JSON64-NEXT: {
266+
# JSON64-NEXT: "Tag": 25,
267+
# JSON64-NEXT: "Value": "0x1000",
268+
# JSON64-NEXT: "Type": "INIT_ARRAY"
269+
# JSON64-NEXT: },
270+
# JSON64-NEXT: {
271+
# JSON64-NEXT: "Tag": 26,
272+
# JSON64-NEXT: "Value": "0x1000",
273+
# JSON64-NEXT: "Type": "FINI_ARRAY"
274+
# JSON64-NEXT: },
275+
# JSON64-NEXT: {
276+
# JSON64-NEXT: "Tag": 27,
277+
# JSON64-NEXT: "Value": "16 (bytes)",
278+
# JSON64-NEXT: "Type": "INIT_ARRAYSZ"
279+
# JSON64-NEXT: },
280+
# JSON64-NEXT: {
281+
# JSON64-NEXT: "Tag": 28,
282+
# JSON64-NEXT: "Value": "16 (bytes)",
283+
# JSON64-NEXT: "Type": "FINI_ARRAYSZ"
284+
# JSON64-NEXT: },
285+
# JSON64-NEXT: {
286+
# JSON64-NEXT: "Tag": 29,
287+
# JSON64-NEXT: "Value": "Library runpath: [w]",
288+
# JSON64-NEXT: "Type": "RUNPATH"
289+
# JSON64-NEXT: },
290+
# JSON64-NEXT: {
291+
# JSON64-NEXT: "Tag": 30,
292+
# JSON64-NEXT: "Value": "ORIGIN SYMBOLIC TEXTREL BIND_NOW STATIC_TLS ",
293+
# JSON64-NEXT: "Type": "FLAGS"
294+
# JSON64-NEXT: },
295+
# JSON64-NEXT: {
296+
# JSON64-NEXT: "Tag": 32,
297+
# JSON64-NEXT: "Value": "0x1000",
298+
# JSON64-NEXT: "Type": "PREINIT_ARRAY"
299+
# JSON64-NEXT: },
300+
# JSON64-NEXT: {
301+
# JSON64-NEXT: "Tag": 33,
302+
# JSON64-NEXT: "Value": "16 (bytes)",
303+
# JSON64-NEXT: "Type": "PREINIT_ARRAYSZ"
304+
# JSON64-NEXT: },
305+
# JSON64-NEXT: {
306+
# JSON64-NEXT: "Tag": 34,
307+
# JSON64-NEXT: "Value": "0x1000",
308+
# JSON64-NEXT: "Type": "SYMTAB_SHNDX"
309+
# JSON64-NEXT: },
310+
# JSON64-NEXT: {
311+
# JSON64-NEXT: "Tag": 35,
312+
# JSON64-NEXT: "Value": "16 (bytes)",
313+
# JSON64-NEXT: "Type": "RELRSZ"
314+
# JSON64-NEXT: },
315+
# JSON64-NEXT: {
316+
# JSON64-NEXT: "Tag": 36,
317+
# JSON64-NEXT: "Value": "0x1000",
318+
# JSON64-NEXT: "Type": "RELR"
319+
# JSON64-NEXT: },
320+
# JSON64-NEXT: {
321+
# JSON64-NEXT: "Tag": 37,
322+
# JSON64-NEXT: "Value": "17185 (bytes)",
323+
# JSON64-NEXT: "Type": "RELRENT"
324+
# JSON64-NEXT: },
325+
# JSON64-NEXT: {
326+
# JSON64-NEXT: "Tag": 1610612751,
327+
# JSON64-NEXT: "Value": "0x1000",
328+
# JSON64-NEXT: "Type": "ANDROID_REL"
329+
# JSON64-NEXT: },
330+
# JSON64-NEXT: {
331+
# JSON64-NEXT: "Tag": 1610612752,
332+
# JSON64-NEXT: "Value": "16 (bytes)",
333+
# JSON64-NEXT: "Type": "ANDROID_RELSZ"
334+
# JSON64-NEXT: },
335+
# JSON64-NEXT: {
336+
# JSON64-NEXT: "Tag": 1610612753,
337+
# JSON64-NEXT: "Value": "0x1000",
338+
# JSON64-NEXT: "Type": "ANDROID_RELA"
339+
# JSON64-NEXT: },
340+
# JSON64-NEXT: {
341+
# JSON64-NEXT: "Tag": 1610612754,
342+
# JSON64-NEXT: "Value": "16 (bytes)",
343+
# JSON64-NEXT: "Type": "ANDROID_RELASZ"
344+
# JSON64-NEXT: },
345+
# JSON64-NEXT: {
346+
# JSON64-NEXT: "Tag": 1879040000,
347+
# JSON64-NEXT: "Value": "0x1000",
348+
# JSON64-NEXT: "Type": "ANDROID_RELR"
349+
# JSON64-NEXT: },
350+
# JSON64-NEXT: {
351+
# JSON64-NEXT: "Tag": 1879040001,
352+
# JSON64-NEXT: "Value": "0x10",
353+
# JSON64-NEXT: "Type": "ANDROID_RELRSZ"
354+
# JSON64-NEXT: },
355+
# JSON64-NEXT: {
356+
# JSON64-NEXT: "Tag": 1879040003,
357+
# JSON64-NEXT: "Value": "0x1234",
358+
# JSON64-NEXT: "Type": "ANDROID_RELRENT"
359+
# JSON64-NEXT: },
360+
# JSON64-NEXT: {
361+
# JSON64-NEXT: "Tag": 1879047925,
362+
# JSON64-NEXT: "Value": "0x1000",
363+
# JSON64-NEXT: "Type": "GNU_HASH"
364+
# JSON64-NEXT: },
365+
# JSON64-NEXT: {
366+
# JSON64-NEXT: "Tag": 1879047926,
367+
# JSON64-NEXT: "Value": "0x1000",
368+
# JSON64-NEXT: "Type": "TLSDESC_PLT"
369+
# JSON64-NEXT: },
370+
# JSON64-NEXT: {
371+
# JSON64-NEXT: "Tag": 1879047927,
372+
# JSON64-NEXT: "Value": "0x1000",
373+
# JSON64-NEXT: "Type": "TLSDESC_GOT"
374+
# JSON64-NEXT: },
375+
# JSON64-NEXT: {
376+
# JSON64-NEXT: "Tag": 1879048185,
377+
# JSON64-NEXT: "Value": "0",
378+
# JSON64-NEXT: "Type": "RELACOUNT"
379+
# JSON64-NEXT: },
380+
# JSON64-NEXT: {
381+
# JSON64-NEXT: "Tag": 1879048186,
382+
# JSON64-NEXT: "Value": "0",
383+
# JSON64-NEXT: "Type": "RELCOUNT"
384+
# JSON64-NEXT: },
385+
# JSON64-NEXT: {
386+
# JSON64-NEXT: "Tag": 1879048187,
387+
# JSON64-NEXT: "Value": "NOW GLOBAL GROUP NODELETE LOADFLTR INITFIRST NOOPEN ORIGIN DIRECT TRANS INTERPOSE NODEFLIB NODUMP CONFALT ENDFILTEE DISPRELDNE DISPRELPND NODIRECT IGNMULDEF NOKSYMS NOHDR EDITED NORELOC SYMINTPOSE GLOBAUDIT SINGLETON PIE ",
388+
# JSON64-NEXT: "Type": "FLAGS_1"
389+
# JSON64-NEXT: },
390+
# JSON64-NEXT: {
391+
# JSON64-NEXT: "Tag": 1879048176,
392+
# JSON64-NEXT: "Value": "0x1000",
393+
# JSON64-NEXT: "Type": "VERSYM"
394+
# JSON64-NEXT: },
395+
# JSON64-NEXT: {
396+
# JSON64-NEXT: "Tag": 1879048188,
397+
# JSON64-NEXT: "Value": "0x1000",
398+
# JSON64-NEXT: "Type": "VERDEF"
399+
# JSON64-NEXT: },
400+
# JSON64-NEXT: {
401+
# JSON64-NEXT: "Tag": 1879048189,
402+
# JSON64-NEXT: "Value": "0",
403+
# JSON64-NEXT: "Type": "VERDEFNUM"
404+
# JSON64-NEXT: },
405+
# JSON64-NEXT: {
406+
# JSON64-NEXT: "Tag": 1879048190,
407+
# JSON64-NEXT: "Value": "0x1000",
408+
# JSON64-NEXT: "Type": "VERNEED"
409+
# JSON64-NEXT: },
410+
# JSON64-NEXT: {
411+
# JSON64-NEXT: "Tag": 1879048191,
412+
# JSON64-NEXT: "Value": "0",
413+
# JSON64-NEXT: "Type": "VERNEEDNUM"
414+
# JSON64-NEXT: },
415+
# JSON64-NEXT: {
416+
# JSON64-NEXT: "Tag": 2147483645,
417+
# JSON64-NEXT: "Value": "Auxiliary library: [D]",
418+
# JSON64-NEXT: "Type": "AUXILIARY"
419+
# JSON64-NEXT: },
420+
# JSON64-NEXT: {
421+
# JSON64-NEXT: "Tag": 2147483646,
422+
# JSON64-NEXT: "Value": "Not needed object: [U]",
423+
# JSON64-NEXT: "Type": "USED"
424+
# JSON64-NEXT: },
425+
# JSON64-NEXT: {
426+
# JSON64-NEXT: "Tag": 2147483647,
427+
# JSON64-NEXT: "Value": "Filter library: [U]",
428+
# JSON64-NEXT: "Type": "FILTER"
429+
# JSON64-NEXT: },
430+
# JSON64-NEXT: {
431+
# JSON64-NEXT: "Tag": 305419896,
432+
# JSON64-NEXT: "Value": "0x8765432187654321",
433+
# JSON64-NEXT: "Type": "<unknown:>0x12345678"
434+
# JSON64-NEXT: },
435+
# JSON64-NEXT: {
436+
# JSON64-NEXT: "Tag": 1790762736,
437+
# JSON64-NEXT: "Value": "0x9988776655443322",
438+
# JSON64-NEXT: "Type": "<unknown:>0x6abcdef0"
439+
# JSON64-NEXT: },
440+
# JSON64-NEXT: {
441+
# JSON64-NEXT: "Tag": 1985229328,
442+
# JSON64-NEXT: "Value": "0x5555666677778888",
443+
# JSON64-NEXT: "Type": "<unknown:>0x76543210"
444+
# JSON64-NEXT: },
445+
# JSON64-NEXT: {
446+
# JSON64-NEXT: "Tag": 0,
447+
# JSON64-NEXT: "Value": "0x0",
448+
# JSON64-NEXT: "Type": "NULL"
449+
# JSON64-NEXT: }
450+
# JSON64-NEXT: ]
451+
# JSON64-NEXT: }
452+
# JSON64-NEXT:]
453+
141454
--- !ELF
142455
FileHeader:
143456
Class: ELFCLASS[[BITS=64]]

llvm/tools/llvm-readobj/ELFDumper.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -793,6 +793,8 @@ template <typename ELFT> class JSONELFDumper : public LLVMELFDumper<ELFT> {
793793

794794
void printEmptyGroupMessage() const override;
795795

796+
void printDynamicTable() override;
797+
796798
private:
797799
std::unique_ptr<DictScope> FileScope;
798800
};
@@ -7365,6 +7367,19 @@ template <class ELFT> void LLVMELFDumper<ELFT>::printDynamicTable() {
73657367
W.startLine() << "]\n";
73667368
}
73677369

7370+
template <class ELFT> void JSONELFDumper<ELFT>::printDynamicTable() {
7371+
Elf_Dyn_Range Table = this->dynamic_table();
7372+
ListScope L(this->W, "DynamicSection");
7373+
for (const auto &Entry : Table) {
7374+
DictScope D(this->W);
7375+
uintX_t Tag = Entry.getTag();
7376+
std::string Value = this->getDynamicEntry(Tag, Entry.getVal());
7377+
this->W.printHex("Tag", Tag);
7378+
this->W.printString("Value", Value);
7379+
this->W.printString("Type", this->Obj.getDynamicTagAsString(Tag));
7380+
}
7381+
}
7382+
73687383
template <class ELFT> void LLVMELFDumper<ELFT>::printDynamicRelocations() {
73697384
W.startLine() << "Dynamic Relocations {\n";
73707385
W.indent();

0 commit comments

Comments
 (0)