Skip to content

Commit 63ac3e5

Browse files
committed
[llvm-readelf] Implement note parsing for NT_FILE and unknown descriptors
Summary: This patch implements two note parsers; one for NT_FILE coredumps, e.g.: ``` CORE 0x00000080 NT_FILE (mapped files) Page size: 4096 Start End Page Offset 0x0000000000001000 0x0000000000002000 0x0000000000003000 /path/to/a.out 0x0000000000004000 0x0000000000005000 0x0000000000006000 /path/to/libc.so 0x0000000000007000 0x0000000000008000 0x0000000000009000 [stack] ``` (A more realistic example can be tested locally by creating a crashing program and running `llvm-readelf -n core`) And also implements a raw hex dump for unknown descriptor data for unhandled descriptor types. Reviewers: MaskRay, jhenderson, grimar, alexshap Reviewed By: MaskRay, grimar Subscribers: emaste, llvm-commits, labath Tags: #llvm Differential Revision: https://reviews.llvm.org/D65832 llvm-svn: 368698
1 parent 9416602 commit 63ac3e5

File tree

6 files changed

+441
-24
lines changed

6 files changed

+441
-24
lines changed

llvm/test/tools/llvm-readobj/note-amd.s

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,17 @@
99
// GNU-NEXT: AMD 0x00000000 NT_AMD_AMDGPU_HSA_METADATA (HSA Metadata)
1010
// GNU-NEXT: HSA Metadata:
1111
// GNU-NEXT: {{^ +$}}
12-
// GNU-EMPTY:
1312
// GNU-NEXT: AMD 0x00000000 NT_AMD_AMDGPU_ISA (ISA Version)
1413
// GNU-NEXT: ISA Version:
1514
// GNU-NEXT: {{^ +$}}
16-
// GNU-EMPTY:
1715
// GNU-NEXT: Displaying notes found
1816
// GNU-NEXT: Owner Data size Description
1917
// GNU-NEXT: AMD 0x0000000a NT_AMD_AMDGPU_HSA_METADATA (HSA Metadata)
2018
// GNU-NEXT: HSA Metadata:
2119
// GNU-NEXT: meta_blah
22-
// GNU-EMPTY:
2320
// GNU-NEXT: AMD 0x00000009 NT_AMD_AMDGPU_ISA (ISA Version)
2421
// GNU-NEXT: ISA Version:
2522
// GNU-NEXT: isa_blah
26-
// GNU-EMPTY:
2723
// GNU-NEXT: Displaying notes found
2824
// GNU-NEXT: Owner Data size Description
2925
// GNU-NEXT: AMD 0x00000000 NT_AMD_AMDGPU_PAL_METADATA (PAL Metadata)
Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
## Test that malformed NT_FILE sections in core files are gracefully ignored.
2+
3+
## llvm-mc doesn't support generating ET_CORE files; the 'Content' field in
4+
## each of the following test cases were generated with the following steps:
5+
# $ llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu tmp.s -o tmp.o
6+
# $ bin/llvm-objcopy --dump-section=.note.foo=tmp.txt tmp.o /dev/null
7+
# $ xxd -p tmp.txt | tr -d '\n'; echo
8+
# using the assembly shown with each test case.
9+
10+
# RUN: yaml2obj --docnum=1 %s -o %t1.o
11+
# RUN: llvm-readelf -n %t1.o 2>&1 | FileCheck %s --check-prefix=ERR-HEADER-SHORT
12+
# ERR-HEADER-SHORT: warning: malformed note: header too short
13+
14+
# .section ".note.foo", "a"
15+
# .align 4
16+
# .long 5 /* namesz */
17+
# .long end - begin /* descsz */
18+
# .long 0x46494c45 /* type = NT_FILE */
19+
# .asciz "CORE"
20+
# .align 4
21+
# begin:
22+
# .quad 0 /* no file mappings */
23+
# end:
24+
25+
--- !ELF
26+
FileHeader:
27+
Class: ELFCLASS64
28+
Data: ELFDATA2LSB
29+
Type: ET_CORE
30+
Machine: EM_X86_64
31+
Sections:
32+
- Name: .note.foo
33+
Type: SHT_NOTE
34+
Content: 0500000008000000454C4946434F5245000000000000000000000000
35+
ProgramHeaders:
36+
- Type: PT_NOTE
37+
Sections:
38+
- Section: .note.foo
39+
40+
# RUN: yaml2obj --docnum=2 %s -o %t2.o
41+
# RUN: llvm-readelf -n %t2.o 2>&1 | FileCheck %s --check-prefix=ERR-NULL-TERM
42+
# ERR-NULL-TERM: warning: malformed note: not NUL terminated
43+
44+
# .section ".note.foo", "a"
45+
# .align 4
46+
# .long 5 /* namesz */
47+
# .long end - begin /* descsz */
48+
# .long 0x46494c45 /* type = NT_FILE */
49+
# .asciz "CORE"
50+
# .align 4
51+
# begin:
52+
# .quad 1 /* 1 file mapping */
53+
# .quad 4096 /* page size */
54+
# .quad 0x1000 /* start #1 */
55+
# .quad 0x2000 /* end #1 */
56+
# .quad 0x3000 /* offset #1 */
57+
# .ascii "xxxx"
58+
# end:
59+
60+
--- !ELF
61+
FileHeader:
62+
Class: ELFCLASS64
63+
Data: ELFDATA2LSB
64+
Type: ET_CORE
65+
Machine: EM_X86_64
66+
Sections:
67+
- Name: .note.foo
68+
Type: SHT_NOTE
69+
Content: 050000002C000000454C4946434F5245000000000100000000000000001000000000000000100000000000000020000000000000003000000000000078787878
70+
ProgramHeaders:
71+
- Type: PT_NOTE
72+
Sections:
73+
- Section: .note.foo
74+
75+
# RUN: yaml2obj --docnum=3 %s -o %t3.o
76+
# RUN: llvm-readelf -n %t3.o 2>&1 | FileCheck %s --check-prefix=ERR-FILE-COUNT
77+
# ERR-FILE-COUNT: warning: malformed note: too short for number of files
78+
79+
# .section ".note.foo", "a"
80+
# .align 4
81+
# .long 5 /* namesz */
82+
# .long end - begin /* descsz */
83+
# .long 0x46494c45 /* type = NT_FILE */
84+
# .asciz "CORE"
85+
# .align 4
86+
# begin:
87+
# .quad 2 /* 2 file mappings */
88+
# .quad 4096 /* page size */
89+
# .quad 0x1000 /* start #1 */
90+
# .quad 0x2000 /* end #1 */
91+
# .quad 0x3000 /* offset #1 */
92+
# .asciz "xyz"
93+
# end:
94+
95+
--- !ELF
96+
FileHeader:
97+
Class: ELFCLASS64
98+
Data: ELFDATA2LSB
99+
Type: ET_CORE
100+
Machine: EM_X86_64
101+
Sections:
102+
- Name: .note.foo
103+
Type: SHT_NOTE
104+
Content: 050000002C000000454C4946434F5245000000000200000000000000001000000000000000100000000000000020000000000000003000000000000078797A00
105+
ProgramHeaders:
106+
- Type: PT_NOTE
107+
Sections:
108+
- Section: .note.foo
109+
110+
# RUN: yaml2obj --docnum=4 %s -o %t4.o
111+
# RUN: llvm-readelf -n %t4.o 2>&1 | FileCheck %s --check-prefix=ERR-FILE-END-EARLY
112+
# ERR-FILE-END-EARLY: warning: malformed note: too few filenames
113+
114+
# .section ".note.foo", "a"
115+
# .align 4
116+
# .long 5 /* namesz */
117+
# .long end - begin /* descsz */
118+
# .long 0x46494c45 /* type = NT_FILE */
119+
# .asciz "CORE"
120+
# .align 4
121+
# begin:
122+
# .quad 2 /* 2 file mappings */
123+
# .quad 4096 /* page size */
124+
# .quad 0x1000 /* start #1 */
125+
# .quad 0x2000 /* end #1 */
126+
# .quad 0x3000 /* offset #1 */
127+
# .quad 0x4000 /* start #2 */
128+
# .quad 0x5000 /* end #2 */
129+
# .quad 0x6000 /* offset #2 */
130+
# .asciz "xyz"
131+
# end:
132+
133+
--- !ELF
134+
FileHeader:
135+
Class: ELFCLASS64
136+
Data: ELFDATA2LSB
137+
Type: ET_CORE
138+
Machine: EM_X86_64
139+
Sections:
140+
- Name: .note.foo
141+
Type: SHT_NOTE
142+
Content: 0500000044000000454C4946434F5245000000000200000000000000001000000000000000100000000000000020000000000000003000000000000000400000000000000050000000000000006000000000000078797A00
143+
ProgramHeaders:
144+
- Type: PT_NOTE
145+
Sections:
146+
- Section: .note.foo
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
## Test that NT_FILE sections in core files are interpreted correctly.
2+
3+
# RUN: yaml2obj %s > %t.o
4+
# RUN: llvm-readelf --notes %t.o | FileCheck %s --check-prefix=GNU
5+
# RUN: llvm-readobj --notes %t.o | FileCheck %s --check-prefix=LLVM
6+
7+
## llvm-mc doesn't support generating ET_CORE files; the 'Content' field was
8+
## generated with the following steps:
9+
# $ llvm-mc -filetype=obj -triple x86_64-pc-linux-gnu tmp.s -o tmp.o
10+
# $ bin/llvm-objcopy --dump-section=.note.foo=tmp.txt tmp.o /dev/null
11+
# $ xxd -p tmp.txt | tr -d '\n'; echo
12+
## Using the following input:
13+
# .section ".note.foo", "a"
14+
# .align 4
15+
# .long 5 /* namesz */
16+
# .long end - begin /* descsz */
17+
# .long 0x46494c45 /* type = NT_FILE */
18+
# .asciz "CORE"
19+
# .align 4
20+
# begin:
21+
# .quad 3 /* 3 file mappings */
22+
# .quad 4096 /* page size */
23+
# .quad 0x1000 /* start #1 */
24+
# .quad 0x2000 /* end #1 */
25+
# .quad 0x3000 /* offset #1 */
26+
# .quad 0x4000 /* start #2 */
27+
# .quad 0x5000 /* end #2 */
28+
# .quad 0x6000 /* offset #2 */
29+
# .quad 0x7000 /* start #3 */
30+
# .quad 0x8000 /* end #3 */
31+
# .quad 0x9000 /* offset #3 */
32+
# .asciz "/path/to/a.out"
33+
# .asciz "/path/to/libc.so"
34+
# .asciz "[stack]"
35+
# .align 4
36+
# end:
37+
38+
--- !ELF
39+
FileHeader:
40+
Class: ELFCLASS64
41+
Data: ELFDATA2LSB
42+
Type: ET_CORE
43+
Machine: EM_X86_64
44+
Sections:
45+
- Name: .note.foo
46+
Type: SHT_NOTE
47+
Content: 0500000080000000454C4946434F524500000000030000000000000000100000000000000010000000000000002000000000000000300000000000000040000000000000005000000000000000600000000000000070000000000000008000000000000000900000000000002F706174682F746F2F612E6F7574002F706174682F746F2F6C6962632E736F005B737461636B5D00
48+
ProgramHeaders:
49+
- Type: PT_NOTE
50+
Sections:
51+
- Section: .note.foo
52+
53+
# GNU: Displaying notes found
54+
# GNU-NEXT: Owner Data size Description
55+
# GNU-NEXT: CORE 0x00000080 NT_FILE (mapped files)
56+
# GNU-NEXT: Page size: 4096
57+
# GNU-NEXT: Start End Page Offset
58+
# GNU-NEXT: 0x0000000000001000 0x0000000000002000 0x0000000000003000
59+
# GNU-NEXT: /path/to/a.out
60+
# GNU-NEXT: 0x0000000000004000 0x0000000000005000 0x0000000000006000
61+
# GNU-NEXT: /path/to/libc.so
62+
# GNU-NEXT: 0x0000000000007000 0x0000000000008000 0x0000000000009000
63+
# GNU-NEXT: [stack]
64+
# GNU-NOT: {{.}}
65+
66+
# LLVM: Notes [
67+
# LLVM-NEXT: NoteSection {
68+
# LLVM-NEXT: Offset:
69+
# LLVM-NEXT: Size:
70+
# LLVM-NEXT: Note {
71+
# LLVM-NEXT: Owner: CORE
72+
# LLVM-NEXT: Data size: 0x80
73+
# LLVM-NEXT: Type: NT_FILE (mapped files)
74+
# LLVM-NEXT: Page Size: 4096
75+
# LLVM-NEXT: Mapping [
76+
# LLVM-NEXT: Start: 0x1000
77+
# LLVM-NEXT: End: 0x2000
78+
# LLVM-NEXT: Offset: 0x3000
79+
# LLVM-NEXT: Filename: /path/to/a.out
80+
# LLVM-NEXT: ]
81+
# LLVM-NEXT: Mapping [
82+
# LLVM-NEXT: Start: 0x4000
83+
# LLVM-NEXT: End: 0x5000
84+
# LLVM-NEXT: Offset: 0x6000
85+
# LLVM-NEXT: Filename: /path/to/libc.so
86+
# LLVM-NEXT: ]
87+
# LLVM-NEXT: Mapping [
88+
# LLVM-NEXT: Start: 0x7000
89+
# LLVM-NEXT: End: 0x8000
90+
# LLVM-NEXT: Offset: 0x9000
91+
# LLVM-NEXT: Filename: [stack]
92+
# LLVM-NEXT: ]
93+
# LLVM-NEXT: }
94+
# LLVM-NEXT: }
95+
# LLVM-NEXT: ]

llvm/test/tools/llvm-readobj/note-freebsd.s

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@
77
// GNU: Displaying notes found
88
// GNU-NEXT: Owner Data size Description
99
// GNU-NEXT: FreeBSD 0x00000000 NT_THRMISC (thrmisc structure)
10-
// GNU-EMPTY:
1110
// GNU-NEXT: FreeBSD 0x00000000 NT_PROCSTAT_PROC (proc data)
12-
// GNU-EMPTY:
1311
// GNU-NEXT: Displaying notes found
1412
// GNU-NEXT: Owner Data size Description
1513
// GNU-NEXT: FreeBSD 0x00000000 NT_PROCSTAT_FILES (files data)
14+
// GNU-NEXT: Displaying notes found
15+
// GNU-NEXT: Owner Data size Description
16+
// GNU-NEXT: FreeBSD 0x0000001c Unknown note type (0x00000003)
17+
// GNU-NEXT: description data: 4c 6f 72 65 6d 20 69 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 6d 65 74 00 00
1618

1719
// LLVM: Notes [
1820
// LLVM-NEXT: NoteSection {
@@ -38,6 +40,19 @@
3840
// LLVM-NEXT: Type: NT_PROCSTAT_FILES (files data)
3941
// LLVM-NEXT: }
4042
// LLVM-NEXT: }
43+
// LLVM-NEXT: NoteSection {
44+
// LLVM-NEXT: Offset: 0x7C
45+
// LLVM-NEXT: Size: 0x30
46+
// LLVM-NEXT: Note {
47+
// LLVM-NEXT: Owner: FreeBSD
48+
// LLVM-NEXT: Data size: 0x1C
49+
// LLVM-NEXT: Type: Unknown note type (0x00000003)
50+
// LLVM-NEXT: Description data (
51+
// LLVM-NEXT: 0000: 4C6F7265 6D206970 73756D20 646F6C6F |Lorem ipsum dolo|
52+
// LLVM-NEXT: 0010: 72207369 7420616D 65740000 |r sit amet..|
53+
// LLVM-NEXT: )
54+
// LLVM-NEXT: }
55+
// LLVM-NEXT: }
4156
// LLVM-NEXT: ]
4257

4358
.section ".note.foo", "a"
@@ -56,3 +71,13 @@
5671
.long 0 /* descsz */
5772
.long 9 /* type = NT_FREEBSD_FILES */
5873
.asciz "FreeBSD"
74+
.section ".note.baz", "a"
75+
.align 4
76+
.long 8 /* namesz */
77+
.long end - begin /* descsz */
78+
.long 3 /* type */
79+
.asciz "FreeBSD"
80+
begin:
81+
.asciz "Lorem ipsum dolor sit amet"
82+
.align 4
83+
end:

llvm/test/tools/llvm-readobj/note-unknown.s

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@
77
// GNU: Displaying notes found at file offset 0x00000040 with length 0x00000010:
88
// GNU-NEXT: Owner Data size Description
99
// GNU-NEXT: XYZ 0x00000000 Unknown note type: (0x00000003)
10+
// GNU-NEXT: Displaying notes found at file offset 0x00000050 with length 0x0000002c:
11+
// GNU-NEXT: Owner Data size Description
12+
// GNU-NEXT: XYZ 0x0000001c Unknown note type: (0x00000003)
13+
// GNU-NEXT: description data: 4c 6f 72 65 6d 20 69 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 6d 65 74 00 00
1014

1115
// LLVM: Notes [
1216
// LLVM-NEXT: NoteSection {
@@ -18,6 +22,19 @@
1822
// LLVM-NEXT: Type: Unknown (0x00000003)
1923
// LLVM-NEXT: }
2024
// LLVM-NEXT: }
25+
// LLVM-NEXT: NoteSection {
26+
// LLVM-NEXT: Offset: 0x50
27+
// LLVM-NEXT: Size: 0x2C
28+
// LLVM-NEXT: Note {
29+
// LLVM-NEXT: Owner: XYZ
30+
// LLVM-NEXT: Data size: 0x1C
31+
// LLVM-NEXT: Type: Unknown (0x00000003)
32+
// LLVM-NEXT: Description data (
33+
// LLVM-NEXT: 0000: 4C6F7265 6D206970 73756D20 646F6C6F |Lorem ipsum dolo|
34+
// LLVM-NEXT: 0010: 72207369 7420616D 65740000 |r sit amet..|
35+
// LLVM-NEXT: )
36+
// LLVM-NEXT: }
37+
// LLVM-NEXT: }
2138
// LLVM-NEXT: ]
2239

2340
.section ".note.foo", "a"
@@ -26,3 +43,13 @@
2643
.long 0 /* descsz */
2744
.long 3 /* type */
2845
.asciz "XYZ"
46+
.section ".note.bar", "a"
47+
.align 4
48+
.long 4 /* namesz */
49+
.long end - begin /* descsz */
50+
.long 3 /* type */
51+
.asciz "XYZ"
52+
begin:
53+
.asciz "Lorem ipsum dolor sit amet"
54+
.align 4
55+
end:

0 commit comments

Comments
 (0)