Skip to content

Commit ab930ee

Browse files
authored
[llvm-readobj][ELF] Alter JSON/LLVM output on note sections to allow for multiple notes per section in JSON (#96813)
It turns out that the notes section for corefiles (or really any elf file with multiple notes) is set up in such a way for LLVM formatted output that the JSON equivalent only has the last note since the notes are held in a dictionary with every key being Note. This pr alters the layout for the notes to a list of dictionaries to sidestep this issue for JSON output. Prior to this pr a note section in the output looked like (for LLVM output): ``` Notes [ NoteSection { Name: <?> Offset: 0x2148 Size: 0x1F864 Note { Owner: CORE Data size: 0x150 Type: NT_PRSTATUS (prstatus structure) Description data ( 0000: 06000000 00000000 00000000 06000000 |................| ... ) } Note { Owner: CORE Data size: 0x88 Type: NT_PRPSINFO (prpsinfo structure) Description data ( 0000: 02440000 00000000 04054040 00000000 |.D........@@....| .... ``` But is now: ``` NoteSections [ NoteSection { Name: <?> Offset: 0x2148 Size: 0x1F864 Notes [ { Owner: CORE Data size: 0x150 Type: NT_PRSTATUS (prstatus structure) Description data ( 0000: 06000000 00000000 00000000 06000000 |................| ... ) } { Owner: CORE Data size: 0x88 Type: NT_PRPSINFO (prpsinfo structure) Description data ( 0000: 02440000 00000000 04054040 00000000 |.D........@@....| ... ```
1 parent 584e431 commit ab930ee

31 files changed

+574
-399
lines changed

lld/test/ELF/gnu-property-align-32.s

+3-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
# CHECK-NEXT: Info: 0
1818
# CHECK-NEXT: AddressAlignment: 4
1919

20-
# CHECK: Note {
20+
# CHECK: Size: 0x1C
21+
# CHECK-NEXT: Notes [
22+
# CHECK-NEXT: {
2123
# CHECK-NEXT: Owner: GNU
2224
# CHECK-NEXT: Data size: 0xC
2325
# CHECK-NEXT: Type: NT_GNU_PROPERTY_TYPE_0 (property note)

lld/test/ELF/gnu-property-align.s

+3-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,9 @@
1717
# CHECK-NEXT: Info: 0
1818
# CHECK-NEXT: AddressAlignment: 8
1919

20-
# CHECK: Note {
20+
# CHECK: Size: 0x20
21+
# CHECK-NEXT: Notes [
22+
# CHECK-NEXT: {
2123
# CHECK-NEXT: Owner: GNU
2224
# CHECK-NEXT: Data size: 0x10
2325
# CHECK-NEXT: Type: NT_GNU_PROPERTY_TYPE_0 (property note)

lld/test/ELF/partition-notes.s

+7-3
Original file line numberDiff line numberDiff line change
@@ -15,30 +15,34 @@
1515
// CHECK: Type: PT_NOTE
1616
// CHECK-NEXT: Offset: 0x{{0*}}[[NOTE_OFFSET:[^ ]*]]
1717

18-
// CHECK: Notes [
18+
// CHECK: NoteSections [
1919
// CHECK-NEXT: NoteSection {
2020
// CHECK-NEXT: Name: .note.obj
2121
// CHECK-NEXT: Offset: 0x{{0*}}[[NOTE_OFFSET]]
2222
// CHECK-NEXT: Size:
23-
// CHECK-NEXT: Note {
23+
// CHECK-NEXT: Notes [
24+
// CHECK-NEXT: {
2425
// CHECK-NEXT: Owner: foo
2526
// CHECK-NEXT: Data size: 0x4
2627
// CHECK-NEXT: Type: NT_VERSION (version)
2728
// CHECK-NEXT: Description data (
2829
// CHECK-NEXT: 0000: 62617200 |bar.|
2930
// CHECK-NEXT: )
3031
// CHECK-NEXT: }
32+
// CHECK-NEXT: ]
3133
// CHECK-NEXT: }
3234
// CHECK-NEXT: NoteSection {
3335
// CHECK-NEXT: Name: .note.gnu.build-id
3436
// CHECK-NEXT: Offset:
3537
// CHECK-NEXT: Size:
36-
// CHECK-NEXT: Note {
38+
// CHECK-NEXT: Notes [
39+
// CHECK-NEXT: {
3740
// CHECK-NEXT: Owner: GNU
3841
// CHECK-NEXT: Data size:
3942
// CHECK-NEXT: Type: NT_GNU_BUILD_ID (unique build ID bitstring)
4043
// CHECK-NEXT: Build ID: d5101cb9d03b7e836ba9b64f5768a0b31980920f{{$}}
4144
// CHECK-NEXT: }
45+
// CHECK-NEXT: ]
4246
// CHECK-NEXT: }
4347
// CHECK-NEXT: ]
4448

llvm/test/tools/llvm-objcopy/ELF/add-note.test

+4-2
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,18 @@ FileHeader:
2222
Type: ET_REL
2323
Machine: EM_X86_64
2424

25-
# CHECK: Notes [
25+
# CHECK: NoteSections [
2626
# CHECK-NEXT: NoteSection {
2727
# CHECK-NEXT: Name: .note.gnu.build-id
2828
# CHECK-NEXT: Offset:
2929
# CHECK-NEXT: Size:
30-
# CHECK-NEXT: Note {
30+
# CHECK-NEXT: Notes [
31+
# CHECK-NEXT: {
3132
# CHECK-NEXT: Owner: GNU
3233
# CHECK-NEXT: Data size: 0x10
3334
# CHECK-NEXT: Type: NT_GNU_BUILD_ID
3435
# CHECK-NEXT: Build ID: 000102030405060708090a0b0c0d0e0f
3536
# CHECK-NEXT: }
37+
# CHECK-NEXT: ]
3638
# CHECK-NEXT: }
3739
# CHECK-NEXT: ]

llvm/test/tools/llvm-readobj/ELF/AArch64/aarch64-feature-pauth.s

+8-4
Original file line numberDiff line numberDiff line change
@@ -27,19 +27,21 @@ end:
2727
# ELF-NEXT: GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0 (property note)
2828
# ELF-NEXT: AArch64 PAuth ABI core info: platform [[PLATFORM]], version [[VERSION]]
2929

30-
# OBJ: Notes [
30+
# OBJ: NoteSections [
3131
# OBJ-NEXT: NoteSection {
3232
# OBJ-NEXT: Name: .note.gnu.property
3333
# OBJ-NEXT: Offset: 0x40
3434
# OBJ-NEXT: Size: 0x28
35-
# OBJ-NEXT: Note {
35+
# OBJ-NEXT: Notes [
36+
# OBJ-NEXT: {
3637
# OBJ-NEXT: Owner: GNU
3738
# OBJ-NEXT: Data size: 0x18
3839
# OBJ-NEXT: Type: NT_GNU_PROPERTY_TYPE_0 (property note)
3940
# OBJ-NEXT: Property [
4041
# OBJ-NEXT: AArch64 PAuth ABI core info: platform [[PLATFORM]], version [[VERSION]]
4142
# OBJ-NEXT: ]
4243
# OBJ-NEXT: }
44+
# OBJ-NEXT: ]
4345
# OBJ-NEXT: }
4446
# OBJ-NEXT: ]
4547

@@ -162,19 +164,21 @@ end:
162164
# ELF-ERR-NEXT: GNU 0x000000[[DATASIZE]] NT_GNU_PROPERTY_TYPE_0 (property note)
163165
# ELF-ERR-NEXT: AArch64 PAuth ABI core info: [[ERR]]
164166

165-
# OBJ-ERR: Notes [
167+
# OBJ-ERR: NoteSections [
166168
# OBJ-ERR-NEXT: NoteSection {
167169
# OBJ-ERR-NEXT: Name: .note.gnu.property
168170
# OBJ-ERR-NEXT: Offset: 0x40
169171
# OBJ-ERR-NEXT: Size: 0x[[SIZE]]
170-
# OBJ-ERR-NEXT: Note {
172+
# OBJ-ERR-NEXT: Notes [
173+
# OBJ-ERR-NEXT: {
171174
# OBJ-ERR-NEXT: Owner: GNU
172175
# OBJ-ERR-NEXT: Data size: 0x[[DATASIZE]]
173176
# OBJ-ERR-NEXT: Type: NT_GNU_PROPERTY_TYPE_0 (property note)
174177
# OBJ-ERR-NEXT: Property [
175178
# OBJ-ERR-NEXT: AArch64 PAuth ABI core info: [[ERR]]
176179
# OBJ-ERR-NEXT: ]
177180
# OBJ-ERR-NEXT: }
181+
# OBJ-ERR-NEXT: ]
178182
# OBJ-ERR-NEXT: }
179183
# OBJ-ERR-NEXT: ]
180184

llvm/test/tools/llvm-readobj/ELF/AArch64/aarch64-note-gnu-property.s

+4-2
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,21 @@
99
// GNU-NEXT: GNU 0x00000010 NT_GNU_PROPERTY_TYPE_0 (property note)
1010
// GNU-NEXT: Properties: aarch64 feature: BTI, PAC, GCS
1111

12-
// LLVM: Notes [
12+
// LLVM: NoteSections [
1313
// LLVM-NEXT: NoteSection {
1414
// LLVM-NEXT: Name: .note.gnu.property
1515
// LLVM-NEXT: Offset: 0x40
1616
// LLVM-NEXT: Size: 0x20
17-
// LLVM-NEXT: Note {
17+
// LLVM-NEXT: Notes [
18+
// LLVM-NEXT: {
1819
// LLVM-NEXT: Owner: GNU
1920
// LLVM-NEXT: Data size: 0x10
2021
// LLVM-NEXT: Type: NT_GNU_PROPERTY_TYPE_0 (property note)
2122
// LLVM-NEXT: Property [
2223
// LLVM-NEXT: aarch64 feature: BTI, PAC, GCS
2324
// LLVM-NEXT: ]
2425
// LLVM-NEXT: }
26+
// LLVM-NEXT: ]
2527
// LLVM-NEXT: }
2628
// LLVM-NEXT: ]
2729

llvm/test/tools/llvm-readobj/ELF/AArch64/memtag.test

+4-2
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,14 @@
9090
# GNU-OK-NEXT: Android 0x00000004 NT_ANDROID_TYPE_MEMTAG (Android memory tagging information)
9191
# GNU-BAD-NEXT: Android 0x00000000 NT_ANDROID_TYPE_MEMTAG (Android memory tagging information)
9292

93-
# LLVM: Notes [
93+
# LLVM: NoteSections [
9494
# LLVM-NEXT: NoteSection {
9595
# LLVM-NEXT: Name: .note.android.memtag
9696
# LLVM-NEXT: Offset: 0x40
9797
# LLVM-OK-NEXT: Size: 0x18
9898
# LLVM-BAD-NEXT: Size: 0x14
99-
# LLVM-NEXT: Note {
99+
# LLVM-NEXT: Notes [
100+
# LLVM-NEXT: {
100101
# LLVM-NEXT: Owner: Android
101102
# LLVM-OK-NEXT: Data size: 0x4
102103
# LLVM-BAD-NEXT: Data size: 0x0
@@ -114,6 +115,7 @@
114115
# NOSTACK-NEXT: Stack: Disabled
115116

116117
# LLVM-NEXT: }
118+
# LLVM-NEXT: ]
117119
# LLVM-NEXT: }
118120
# LLVM-NEXT: ]
119121

llvm/test/tools/llvm-readobj/ELF/AArch64/note-android-unknown.test

+4-2
Original file line numberDiff line numberDiff line change
@@ -7,19 +7,21 @@
77
# GNU-NEXT: Android 0x00000005 Unknown note type: (0x00001337)
88
# GNU-NEXT: description data: 01 23 45 67 89
99

10-
# LLVM: Notes [
10+
# LLVM: NoteSections [
1111
# LLVM-NEXT: NoteSection {
1212
# LLVM-NEXT: Name: .note.android.unknown
1313
# LLVM-NEXT: Offset: 0x40
1414
# LLVM-NEXT: Size: 0x1C
15-
# LLVM-NEXT: Note {
15+
# LLVM-NEXT: Notes [
16+
# LLVM-NEXT: {
1617
# LLVM-NEXT: Owner: Android
1718
# LLVM-NEXT: Data size: 0x5
1819
# LLVM-NEXT: Type: Unknown (0x00001337)
1920
# LLVM-NEXT: Description data (
2021
# LLVM-NEXT: 0000: 01234567 89
2122
# LLVM-NEXT: )
2223
# LLVM-NEXT: }
24+
# LLVM-NEXT: ]
2325
# LLVM-NEXT: }
2426
# LLVM-NEXT: ]
2527

llvm/test/tools/llvm-readobj/ELF/gnu-note-size.test

+4-2
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,13 @@
1111
# GNU-NEXT: <corrupt GNU_ABI_TAG>
1212
# GNU-EMPTY:
1313

14-
# LLVM: Notes [
14+
# LLVM: NoteSections [
1515
# LLVM-NEXT: NoteSection {
1616
# LLVM-NEXT: Name: .note.ABI-tag
1717
# LLVM-NEXT: Offset:
1818
# LLVM-NEXT: Size: 0x14
19-
# LLVM-NEXT: Note {
19+
# LLVM-NEXT: Notes [
20+
# LLVM-NEXT: {
2021
# LLVM-NEXT: Owner: GNU
2122
# LLVM-NEXT: Data size: 0x4
2223
# LLVM-NEXT: Type: NT_GNU_ABI_TAG (ABI version tag)
@@ -25,6 +26,7 @@
2526
# LLVM-NEXT: 0000: 00000000 |....|
2627
# LLVM-NEXT: )
2728
# LLVM-NEXT: }
29+
# LLVM-NEXT: ]
2830
# LLVM-NEXT: }
2931
# LLVM-NEXT: ]
3032

llvm/test/tools/llvm-readobj/ELF/gnu-notes.test

+30-12
Original file line numberDiff line numberDiff line change
@@ -28,68 +28,78 @@
2828
# GNU-NEXT: description data: 61 62 63 64
2929
# GNU-EMPTY:
3030

31-
# LLVM: Notes [
31+
# LLVM: NoteSections [
3232
# LLVM-NEXT: NoteSection {
3333
# LLVM-NEXT: Name: .note.ABI-tag
3434
# LLVM-NEXT: Offset: 0x78
3535
# LLVM-NEXT: Size: 0x20
36-
# LLVM-NEXT: Note {
36+
# LLVM-NEXT: Notes [
37+
# LLVM-NEXT: {
3738
# LLVM-NEXT: Owner: GNU
3839
# LLVM-NEXT: Data size: 0x10
3940
# LLVM-NEXT: Type: NT_GNU_ABI_TAG (ABI version tag)
4041
# LLVM-NEXT: OS: Linux
4142
# LLVM-NEXT: ABI: 2.6.32
4243
# LLVM-NEXT: }
44+
# LLVM-NEXT: ]
4345
# LLVM-NEXT: }
4446
# LLVM-NEXT: NoteSection {
4547
# LLVM-NEXT: Name: .note.gnu.build-id
4648
# LLVM-NEXT: Offset: 0x98
4749
# LLVM-NEXT: Size: 0x20
48-
# LLVM-NEXT: Note {
50+
# LLVM-NEXT: Notes [
51+
# LLVM-NEXT: {
4952
# LLVM-NEXT: Owner: GNU
5053
# LLVM-NEXT: Data size: 0x10
5154
# LLVM-NEXT: Type: NT_GNU_BUILD_ID (unique build ID bitstring)
5255
# LLVM-NEXT: Build ID: 4fcb712aa6387724a9f465a32cd8c14b
5356
# LLVM-NEXT: }
57+
# LLVM-NEXT: ]
5458
# LLVM-NEXT: }
5559
# LLVM-NEXT: NoteSection {
5660
# LLVM-NEXT: Name: .note.gnu.gold-version
5761
# LLVM-NEXT: Offset: 0xB8
5862
# LLVM-NEXT: Size: 0x1C
59-
# LLVM-NEXT: Note {
63+
# LLVM-NEXT: Notes [
64+
# LLVM-NEXT: {
6065
# LLVM-NEXT: Owner: GNU
6166
# LLVM-NEXT: Data size: 0x9
6267
# LLVM-NEXT: Type: NT_GNU_GOLD_VERSION (gold version)
6368
# LLVM-NEXT: Version: gold 1.11
6469
# LLVM-NEXT: }
70+
# LLVM-NEXT: ]
6571
# LLVM-NEXT: }
6672
# LLVM-NEXT: NoteSection {
6773
# LLVM-NEXT: Name: .note.gnu.unknown
6874
# LLVM-NEXT: Offset: 0xD4
6975
# LLVM-NEXT: Size: 0x14
70-
# LLVM-NEXT: Note {
76+
# LLVM-NEXT: Notes [
77+
# LLVM-NEXT: {
7178
# LLVM-NEXT: Owner: GNU
7279
# LLVM-NEXT: Data size: 0x4
7380
# LLVM-NEXT: Type: Unknown (0x0000abcd)
7481
# LLVM-NEXT: Description data (
7582
# LLVM-NEXT: 0000: 61626364 |abcd|
7683
# LLVM-NEXT: )
7784
# LLVM-NEXT: }
85+
# LLVM-NEXT: ]
7886
# LLVM-NEXT: }
7987
# LLVM-NEXT: ]
8088

8189
## Note: the section name is <?> here because the section header table is not present.
82-
# LLVM-STRIPPED: Notes [
90+
# LLVM-STRIPPED: NoteSections [
8391
# LLVM-STRIPPED-NEXT: NoteSection {
8492
# LLVM-STRIPPED-NEXT: Name: <?>
8593
# LLVM-STRIPPED-NEXT: Offset: 0x78
8694
# LLVM-STRIPPED-NEXT: Size: 0x20
87-
# LLVM-STRIPPED-NEXT: Note {
95+
# LLVM-STRIPPED-NEXT: Notes [
96+
# LLVM-STRIPPED-NEXT: {
8897
# LLVM-STRIPPED-NEXT: Owner: GNU
8998
# LLVM-STRIPPED-NEXT: Data size: 0x10
9099
# LLVM-STRIPPED-NEXT: Type: NT_GNU_BUILD_ID (unique build ID bitstring)
91100
# LLVM-STRIPPED-NEXT: Build ID: 4fcb712aa6387724a9f465a32cd8c14b
92101
# LLVM-STRIPPED-NEXT: }
102+
# LLVM-STRIPPED-NEXT: ]
93103
# LLVM-STRIPPED-NEXT: }
94104
# LLVM-STRIPPED-NEXT: ]
95105

@@ -144,12 +154,14 @@ ProgramHeaders:
144154
# ERR1-GNU-NEXT: warning: '[[FILE]]': unable to read notes from the SHT_NOTE section with index 1: invalid offset (0xffff0000) or size (0x0)
145155
# ERR1-GNU-EMPTY:
146156

147-
# ERR1-LLVM: Notes [
157+
# ERR1-LLVM: NoteSections [
148158
# ERR1-LLVM-NEXT: NoteSection {
149159
# ERR1-LLVM-NEXT: Name: .note
150160
# ERR1-LLVM-NEXT: Offset: 0xFFFF0000
151161
# ERR1-LLVM-NEXT: Size: 0x0
162+
# ERR1-LLVM-NEXT: Notes [
152163
# ERR1-LLVM-NEXT: warning: '[[FILE]]': unable to read notes from the SHT_NOTE section with index 1: invalid offset (0xffff0000) or size (0x0)
164+
# ERR1-LLVM-NEXT: ]
153165
# ERR1-LLVM-NEXT: }
154166
# ERR1-LLVM-NEXT: ]
155167

@@ -177,12 +189,14 @@ Sections:
177189
# ERR2-GNU-NEXT: warning: '[[FILE]]': unable to read notes from the SHT_NOTE section with index 1: invalid offset (0x40) or size (0xffff0000)
178190
# ERR2-GNU-EMPTY:
179191

180-
# ERR2-LLVM: Notes [
192+
# ERR2-LLVM: NoteSections [
181193
# ERR2-LLVM-NEXT: NoteSection {
182194
# ERR2-LLVM-NEXT: Name: .note
183195
# ERR2-LLVM-NEXT: Offset: 0x40
184196
# ERR2-LLVM-NEXT: Size: 0xFFFF0000
197+
# ERR2-LLVM-NEXT: Notes [
185198
# ERR2-LLVM-NEXT: warning: '[[FILE]]': unable to read notes from the SHT_NOTE section with index 1: invalid offset (0x40) or size (0xffff0000)
199+
# ERR2-LLVM-NEXT: ]
186200
# ERR2-LLVM-NEXT: }
187201
# ERR2-LLVM-NEXT: ]
188202

@@ -198,12 +212,14 @@ Sections:
198212
# ERR3-GNU-NEXT: warning: '[[FILE]]': unable to read notes from the PT_NOTE segment with index 0: invalid offset (0xffff0000) or size (0x0)
199213
# ERR3-GNU-NOT: {{.}}
200214

201-
# ERR3-LLVM: Notes [
215+
# ERR3-LLVM: NoteSections [
202216
# ERR3-LLVM-NEXT: NoteSection {
203217
# ERR3-LLVM-NEXT: Name: <?>
204218
# ERR3-LLVM-NEXT: Offset: 0xFFFF0000
205219
# ERR3-LLVM-NEXT: Size: 0x0
220+
# ERR3-LLVM-NEXT: Notes [
206221
# ERR3-LLVM-NEXT: warning: '[[FILE]]': unable to read notes from the PT_NOTE segment with index 0: invalid offset (0xffff0000) or size (0x0)
222+
# ERR3-LLVM-NEXT: ]
207223
# ERR3-LLVM-NEXT: }
208224
# ERR3-LLVM-NEXT: ]
209225

@@ -229,12 +245,14 @@ ProgramHeaders:
229245
# ERR4-GNU-NEXT: warning: '[[FILE]]': unable to read notes from the PT_NOTE segment with index 0: invalid offset (0x0) or size (0xffff0000)
230246
# ERR4-GNU-EMPTY:
231247

232-
# ERR4-LLVM: Notes [
248+
# ERR4-LLVM: NoteSections [
233249
# ERR4-LLVM-NEXT: NoteSection {
234250
# ERR4-LLVM-NEXT: Name: <?>
235251
# ERR4-LLVM-NEXT: Offset: 0x0
236252
# ERR4-LLVM-NEXT: Size: 0xFFFF0000
253+
# ERR4-LLVM-NEXT: Notes [
237254
# ERR4-LLVM-NEXT: warning: '[[FILE]]': unable to read notes from the PT_NOTE segment with index 0: invalid offset (0x0) or size (0xffff0000)
255+
# ERR4-LLVM-NEXT: ]
238256
# ERR4-LLVM-NEXT: }
239257
# ERR4-LLVM-NEXT: ]
240258

@@ -247,6 +265,6 @@ ProgramHeaders:
247265
# PHENTSIZE-WARN-GNU: warning: '[[FILE]]': unable to read program headers to locate the PT_DYNAMIC segment: invalid e_phentsize: 1
248266
# PHENTSIZE-WARN-GNU: warning: '[[FILE]]': unable to read program headers to locate the PT_NOTE segment: invalid e_phentsize: 1
249267

250-
# PHENTSIZE-WARN-LLVM: Notes [
268+
# PHENTSIZE-WARN-LLVM: NoteSections [
251269
# PHENTSIZE-WARN-LLVM-NEXT: warning: '[[FILE]]': unable to read program headers to locate the PT_NOTE segment: invalid e_phentsize: 1
252270
# PHENTSIZE-WARN-LLVM-NEXT: ]

0 commit comments

Comments
 (0)