Skip to content

Commit 753b225

Browse files
feg208AlexisPerry
authored andcommitted
[llvm-readobj][ELF] Implement JSON output for --dynamic-table (llvm#95976)
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 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] ``` Now the output looks like: ``` "DynamicSection": [ { "Tag": 29, "Type": "RUNPATH", "Value": 6322, "Path": [ "$ORIGIN/../lib" ] }, { "Tag": 1, "Type": "NEEDED", "Value": 6109, "Library": "libm.so.6" }, ```
1 parent 680315c commit 753b225

File tree

2 files changed

+418
-0
lines changed

2 files changed

+418
-0
lines changed

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

Lines changed: 357 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
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 --strict-whitespace --check-prefix=JSON64
1113

1214
# LLVM64:DynamicSection [ (61 entries)
1315
# LLVM64-NEXT: Tag Type Name/Value
@@ -138,6 +140,361 @@
138140
# GNU64-NEXT: 0x0000000076543210 (<unknown:>0x76543210) 0x5555666677778888
139141
# GNU64-NEXT: 0x0000000000000000 (NULL) 0x0
140142

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

0 commit comments

Comments
 (0)