Skip to content

Commit 4f19f15

Browse files
authored
[PAC][llvm-readobj][AArch64][ELF] Support GNU_PROPERTY_AARCH64_FEATURE_PAUTH (#87545)
Reland #85231 after fixing build failure https://lab.llvm.org/buildbot/#/builders/186/builds/15631. Use `PRIx64` for format output of `uint64_t` as hex. Original PR description below. This adds support for `GNU_PROPERTY_AARCH64_FEATURE_PAUTH` feature (as defined in ARM-software/abi-aa#240) handling in llvm-readobj and llvm-readelf. The following constants for supported platforms are also introduced: - `AARCH64_PAUTH_PLATFORM_INVALID = 0x0` - `AARCH64_PAUTH_PLATFORM_BAREMETAL = 0x1` - `AARCH64_PAUTH_PLATFORM_LLVM_LINUX = 0x10000002` For the llvm_linux platform, output of the tools contains descriptions of PAuth features which are enabled/disabled depending on the version value. Version value bits correspond to the following `LangOptions` defined in #85232: - bit 0: `PointerAuthIntrinsics`; - bit 1: `PointerAuthCalls`; - bit 2: `PointerAuthReturns`; - bit 3: `PointerAuthAuthTraps`; - bit 4: `PointerAuthVTPtrAddressDiscrimination`; - bit 5: `PointerAuthVTPtrTypeDiscrimination`; - bit 6: `PointerAuthInitFini`. Support for `.note.AARCH64-PAUTH-ABI-tag` is dropped since it's deleted from the spec in ARM-software/abi-aa#250.
1 parent d89914f commit 4f19f15

File tree

4 files changed

+296
-157
lines changed

4 files changed

+296
-157
lines changed

llvm/include/llvm/BinaryFormat/ELF.h

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1712,11 +1712,6 @@ enum {
17121712
NT_ANDROID_TYPE_MEMTAG = 4,
17131713
};
17141714

1715-
// ARM note types.
1716-
enum {
1717-
NT_ARM_TYPE_PAUTH_ABI_TAG = 1,
1718-
};
1719-
17201715
// Memory tagging values used in NT_ANDROID_TYPE_MEMTAG notes.
17211716
enum {
17221717
// Enumeration to determine the tagging mode. In Android-land, 'SYNC' means
@@ -1740,6 +1735,7 @@ enum : unsigned {
17401735
GNU_PROPERTY_STACK_SIZE = 1,
17411736
GNU_PROPERTY_NO_COPY_ON_PROTECTED = 2,
17421737
GNU_PROPERTY_AARCH64_FEATURE_1_AND = 0xc0000000,
1738+
GNU_PROPERTY_AARCH64_FEATURE_PAUTH = 0xc0000001,
17431739
GNU_PROPERTY_X86_FEATURE_1_AND = 0xc0000002,
17441740

17451741
GNU_PROPERTY_X86_UINT32_OR_LO = 0xc0008000,
@@ -1758,6 +1754,26 @@ enum : unsigned {
17581754
GNU_PROPERTY_AARCH64_FEATURE_1_GCS = 1 << 2,
17591755
};
17601756

1757+
// aarch64 PAuth platforms.
1758+
enum : unsigned {
1759+
AARCH64_PAUTH_PLATFORM_INVALID = 0x0,
1760+
AARCH64_PAUTH_PLATFORM_BAREMETAL = 0x1,
1761+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX = 0x10000002,
1762+
};
1763+
1764+
// Bit positions of version flags for AARCH64_PAUTH_PLATFORM_LLVM_LINUX.
1765+
enum : unsigned {
1766+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS = 0,
1767+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS = 1,
1768+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS = 2,
1769+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS = 3,
1770+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR = 4,
1771+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR = 5,
1772+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI = 6,
1773+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST =
1774+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI,
1775+
};
1776+
17611777
// x86 processor feature bits.
17621778
enum : unsigned {
17631779
GNU_PROPERTY_X86_FEATURE_1_IBT = 1 << 0,
Lines changed: 202 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -1,98 +1,204 @@
11
# RUN: rm -rf %t && split-file %s %t && cd %t
22

3-
# RUN: llvm-mc -filetype=obj -triple=aarch64-linux-gnu abi-tag.s -o tag.o
4-
# RUN: llvm-mc -filetype=obj -triple=aarch64-linux-gnu abi-tag-short.s -o tag-short.o
5-
# RUN: llvm-mc -filetype=obj -triple=aarch64-linux-gnu abi-tag-long.s -o tag-long.o
6-
7-
# RUN: llvm-readelf --notes tag.o | FileCheck --check-prefix NORMAL %s
8-
# RUN: llvm-readelf --notes tag-short.o | FileCheck --check-prefix SHORT %s
9-
# RUN: llvm-readelf --notes tag-long.o | FileCheck --check-prefix LONG %s
10-
11-
# NORMAL: AArch64 PAuth ABI tag: platform 0x2a, version 0x1
12-
# SHORT: AArch64 PAuth ABI tag: <corrupted size: expected at least 16, got 12>
13-
# LONG: AArch64 PAuth ABI tag: platform 0x2a, version 0x1, additional info 0xEFCDAB8967452301
14-
15-
# RUN: llvm-readobj --notes tag.o | FileCheck --check-prefix LLVM-NORMAL %s
16-
# RUN: llvm-readobj --notes tag-short.o | FileCheck --check-prefix LLVM-SHORT %s
17-
# RUN: llvm-readobj --notes tag-long.o | FileCheck --check-prefix LLVM-LONG %s
18-
19-
# LLVM-SHORT: Notes [
20-
# LLVM-SHORT-NEXT: NoteSection {
21-
# LLVM-SHORT-NEXT: Name: .note.AARCH64-PAUTH-ABI-tag
22-
# LLVM-SHORT-NEXT: Offset: 0x40
23-
# LLVM-SHORT-NEXT: Size: 0x1C
24-
# LLVM-SHORT-NEXT: Note {
25-
# LLVM-SHORT-NEXT: Owner: ARM
26-
# LLVM-SHORT-NEXT: Data size: 0xC
27-
# LLVM-SHORT-NEXT: Type: NT_ARM_TYPE_PAUTH_ABI_TAG
28-
# LLVM-SHORT-NEXT: Description data (
29-
# LLVM-SHORT-NEXT: 0000: 2A000000 00000000 01000000
30-
# LLVM-SHORT-NEXT: )
31-
# LLVM-SHORT-NEXT: }
32-
# LLVM-SHORT-NEXT: }
33-
# LLVM-SHORT-NEXT: ]
34-
35-
# LLVM-NORMAL: Notes [
36-
# LLVM-NORMAL-NEXT: NoteSection {
37-
# LLVM-NORMAL-NEXT: Name: .note.AARCH64-PAUTH-ABI-tag
38-
# LLVM-NORMAL-NEXT: Offset: 0x40
39-
# LLVM-NORMAL-NEXT: Size: 0x20
40-
# LLVM-NORMAL-NEXT: Note {
41-
# LLVM-NORMAL-NEXT: Owner: ARM
42-
# LLVM-NORMAL-NEXT: Data size: 0x10
43-
# LLVM-NORMAL-NEXT: Type: NT_ARM_TYPE_PAUTH_ABI_TAG
44-
# LLVM-NORMAL-NEXT: Platform: 42
45-
# LLVM-NORMAL-NEXT: Version: 1
46-
# LLVM-NORMAL-NEXT: }
47-
# LLVM-NORMAL-NEXT: }
48-
# LLVM-NORMAL-NEXT: ]
49-
50-
# LLVM-LONG: Notes [
51-
# LLVM-LONG-NEXT: NoteSection {
52-
# LLVM-LONG-NEXT: Name: .note.AARCH64-PAUTH-ABI-tag
53-
# LLVM-LONG-NEXT: Offset: 0x40
54-
# LLVM-LONG-NEXT: Size: 0x28
55-
# LLVM-LONG-NEXT: Note {
56-
# LLVM-LONG-NEXT: Owner: ARM
57-
# LLVM-LONG-NEXT: Data size: 0x18
58-
# LLVM-LONG-NEXT: Type: NT_ARM_TYPE_PAUTH_ABI_TAG
59-
# LLVM-LONG-NEXT: Platform: 42
60-
# LLVM-LONG-NEXT: Version: 1
61-
# LLVM-LONG-NEXT: Additional info: EFCDAB8967452301
62-
# LLVM-LONG-NEXT: }
63-
# LLVM-LONG-NEXT: }
64-
# LLVM-LONG-NEXT: ]
65-
66-
#--- abi-tag.s
67-
68-
.section ".note.AARCH64-PAUTH-ABI-tag", "a"
69-
.long 4
70-
.long 16
71-
.long 1
72-
.asciz "ARM"
73-
74-
.quad 42 // platform
75-
.quad 1 // version
76-
77-
#--- abi-tag-short.s
78-
79-
.section ".note.AARCH64-PAUTH-ABI-tag", "a"
80-
.long 4
81-
.long 12
82-
.long 1
83-
.asciz "ARM"
84-
85-
.quad 42
86-
.word 1
87-
88-
#--- abi-tag-long.s
89-
90-
.section ".note.AARCH64-PAUTH-ABI-tag", "a"
91-
.long 4
92-
.long 24
93-
.long 1
94-
.asciz "ARM"
95-
96-
.quad 42 // platform
97-
.quad 1 // version
98-
.quad 0x0123456789ABCDEF // extra data
3+
#--- gnu-42-1.s
4+
.section ".note.gnu.property", "a"
5+
.long 4 // Name length is always 4 ("GNU")
6+
.long end - begin // Data length
7+
.long 5 // Type: NT_GNU_PROPERTY_TYPE_0
8+
.asciz "GNU" // Name
9+
.p2align 3
10+
begin:
11+
# PAuth ABI property note
12+
.long 0xc0000001 // Type: GNU_PROPERTY_AARCH64_FEATURE_PAUTH
13+
.long 16 // Data size
14+
.quad 42 // PAuth ABI platform
15+
.quad 1 // PAuth ABI version
16+
.p2align 3 // Align to 8 byte for 64 bit
17+
end:
18+
19+
# RUN: llvm-mc -filetype=obj -triple aarch64-linux-gnu gnu-42-1.s -o gnu-42-1.o
20+
# RUN: llvm-readelf --notes gnu-42-1.o | \
21+
# RUN: FileCheck --check-prefix=ELF -DPLATFORM="0x2a (unknown)" -DVERSION=0x1 %s
22+
# RUN: llvm-readobj --notes gnu-42-1.o | \
23+
# RUN: FileCheck --check-prefix=OBJ -DPLATFORM="0x2a (unknown)" -DVERSION=0x1 %s
24+
25+
# ELF: Displaying notes found in: .note.gnu.property
26+
# ELF-NEXT: Owner Data size Description
27+
# ELF-NEXT: GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0 (property note)
28+
# ELF-NEXT: AArch64 PAuth ABI core info: platform [[PLATFORM]], version [[VERSION]]
29+
30+
# OBJ: Notes [
31+
# OBJ-NEXT: NoteSection {
32+
# OBJ-NEXT: Name: .note.gnu.property
33+
# OBJ-NEXT: Offset: 0x40
34+
# OBJ-NEXT: Size: 0x28
35+
# OBJ-NEXT: Note {
36+
# OBJ-NEXT: Owner: GNU
37+
# OBJ-NEXT: Data size: 0x18
38+
# OBJ-NEXT: Type: NT_GNU_PROPERTY_TYPE_0 (property note)
39+
# OBJ-NEXT: Property [
40+
# OBJ-NEXT: AArch64 PAuth ABI core info: platform [[PLATFORM]], version [[VERSION]]
41+
# OBJ-NEXT: ]
42+
# OBJ-NEXT: }
43+
# OBJ-NEXT: }
44+
# OBJ-NEXT: ]
45+
46+
#--- gnu-0-0.s
47+
.section ".note.gnu.property", "a"
48+
.long 4 // Name length is always 4 ("GNU")
49+
.long end - begin // Data length
50+
.long 5 // Type: NT_GNU_PROPERTY_TYPE_0
51+
.asciz "GNU" // Name
52+
.p2align 3
53+
begin:
54+
# PAuth ABI property note
55+
.long 0xc0000001 // Type: GNU_PROPERTY_AARCH64_FEATURE_PAUTH
56+
.long 16 // Data size
57+
.quad 0 // PAuth ABI platform
58+
.quad 0 // PAuth ABI version
59+
.p2align 3 // Align to 8 byte for 64 bit
60+
end:
61+
62+
# RUN: llvm-mc -filetype=obj -triple aarch64-linux-gnu gnu-0-0.s -o gnu-0-0.o
63+
# RUN: llvm-readelf --notes gnu-0-0.o | \
64+
# RUN: FileCheck --check-prefix=ELF -DPLATFORM="0x0 (invalid)" -DVERSION=0x0 %s
65+
# RUN: llvm-readobj --notes gnu-0-0.o | \
66+
# RUN: FileCheck --check-prefix=OBJ -DPLATFORM="0x0 (invalid)" -DVERSION=0x0 %s
67+
68+
#--- gnu-1-0.s
69+
.section ".note.gnu.property", "a"
70+
.long 4 // Name length is always 4 ("GNU")
71+
.long end - begin // Data length
72+
.long 5 // Type: NT_GNU_PROPERTY_TYPE_0
73+
.asciz "GNU" // Name
74+
.p2align 3
75+
begin:
76+
# PAuth ABI property note
77+
.long 0xc0000001 // Type: GNU_PROPERTY_AARCH64_FEATURE_PAUTH
78+
.long 16 // Data size
79+
.quad 1 // PAuth ABI platform
80+
.quad 0 // PAuth ABI version
81+
.p2align 3 // Align to 8 byte for 64 bit
82+
end:
83+
84+
# RUN: llvm-mc -filetype=obj -triple aarch64-linux-gnu gnu-1-0.s -o gnu-1-0.o
85+
# RUN: llvm-readelf --notes gnu-1-0.o | \
86+
# RUN: FileCheck --check-prefix=ELF -DPLATFORM="0x1 (baremetal)" -DVERSION=0x0 %s
87+
# RUN: llvm-readobj --notes gnu-1-0.o | \
88+
# RUN: FileCheck --check-prefix=OBJ -DPLATFORM="0x1 (baremetal)" -DVERSION=0x0 %s
89+
90+
#--- gnu-0x10000002-85.s
91+
.section ".note.gnu.property", "a"
92+
.long 4 // Name length is always 4 ("GNU")
93+
.long end - begin // Data length
94+
.long 5 // Type: NT_GNU_PROPERTY_TYPE_0
95+
.asciz "GNU" // Name
96+
.p2align 3
97+
begin:
98+
# PAuth ABI property note
99+
.long 0xc0000001 // Type: GNU_PROPERTY_AARCH64_FEATURE_PAUTH
100+
.long 16 // Data size
101+
.quad 0x10000002 // PAuth ABI platform
102+
.quad 85 // PAuth ABI version
103+
.p2align 3 // Align to 8 byte for 64 bit
104+
end:
105+
106+
# RUN: llvm-mc -filetype=obj -triple aarch64-linux-gnu gnu-0x10000002-85.s -o gnu-0x10000002-85.o
107+
# RUN: llvm-readelf --notes gnu-0x10000002-85.o | \
108+
# RUN: FileCheck --check-prefix=ELF -DPLATFORM="0x10000002 (llvm_linux)" \
109+
# RUN: -DVERSION="0x55 (PointerAuthIntrinsics, !PointerAuthCalls, PointerAuthReturns, !PointerAuthAuthTraps, PointerAuthVTPtrAddressDiscrimination, !PointerAuthVTPtrTypeDiscrimination, PointerAuthInitFini)" %s
110+
# RUN: llvm-readobj --notes gnu-0x10000002-85.o | \
111+
# RUN: FileCheck --check-prefix=OBJ -DPLATFORM="0x10000002 (llvm_linux)" \
112+
# RUN: -DVERSION="0x55 (PointerAuthIntrinsics, !PointerAuthCalls, PointerAuthReturns, !PointerAuthAuthTraps, PointerAuthVTPtrAddressDiscrimination, !PointerAuthVTPtrTypeDiscrimination, PointerAuthInitFini)" %s
113+
114+
#--- gnu-0x10000002-128.s
115+
.section ".note.gnu.property", "a"
116+
.long 4 // Name length is always 4 ("GNU")
117+
.long end - begin // Data length
118+
.long 5 // Type: NT_GNU_PROPERTY_TYPE_0
119+
.asciz "GNU" // Name
120+
.p2align 3
121+
begin:
122+
# PAuth ABI property note
123+
.long 0xc0000001 // Type: GNU_PROPERTY_AARCH64_FEATURE_PAUTH
124+
.long 16 // Data size
125+
.quad 0x10000002 // PAuth ABI platform
126+
.quad 128 // PAuth ABI version
127+
.p2align 3 // Align to 8 byte for 64 bit
128+
end:
129+
130+
# RUN: llvm-mc -filetype=obj -triple aarch64-linux-gnu gnu-0x10000002-128.s -o gnu-0x10000002-128.o
131+
# RUN: llvm-readelf --notes gnu-0x10000002-128.o | \
132+
# RUN: FileCheck --check-prefix=ELF -DPLATFORM="0x10000002 (llvm_linux)" -DVERSION="0x80 (unknown)" %s
133+
# RUN: llvm-readobj --notes gnu-0x10000002-128.o | \
134+
# RUN: FileCheck --check-prefix=OBJ -DPLATFORM="0x10000002 (llvm_linux)" -DVERSION="0x80 (unknown)" %s
135+
136+
#--- gnu-short.s
137+
.section ".note.gnu.property", "a"
138+
.long 4 // Name length is always 4 ("GNU")
139+
.long end - begin // Data length
140+
.long 5 // Type: NT_GNU_PROPERTY_TYPE_0
141+
.asciz "GNU" // Name
142+
.p2align 3
143+
begin:
144+
# PAuth ABI property note
145+
.long 0xc0000001 // Type: GNU_PROPERTY_AARCH64_FEATURE_PAUTH
146+
.long 12 // Data size
147+
.quad 42 // PAuth ABI platform
148+
.word 1 // PAuth ABI version
149+
.p2align 3 // Align to 8 byte for 64 bit
150+
end:
151+
152+
# RUN: llvm-mc -filetype=obj -triple aarch64-linux-gnu gnu-short.s -o gnu-short.o
153+
# RUN: llvm-readelf --notes gnu-short.o | \
154+
# RUN: FileCheck --check-prefix=ELF-ERR -DSIZE=28 -DDATASIZE=18 \
155+
# RUN: -DERR="<corrupted size: expected 16, got 12>" %s
156+
# RUN: llvm-readobj --notes gnu-short.o | \
157+
# RUN: FileCheck --check-prefix=OBJ-ERR -DSIZE=28 -DDATASIZE=18 \
158+
# RUN: -DERR="<corrupted size: expected 16, got 12>" %s
159+
160+
# ELF-ERR: Displaying notes found in: .note.gnu.property
161+
# ELF-ERR-NEXT: Owner Data size Description
162+
# ELF-ERR-NEXT: GNU 0x000000[[DATASIZE]] NT_GNU_PROPERTY_TYPE_0 (property note)
163+
# ELF-ERR-NEXT: AArch64 PAuth ABI core info: [[ERR]]
164+
165+
# OBJ-ERR: Notes [
166+
# OBJ-ERR-NEXT: NoteSection {
167+
# OBJ-ERR-NEXT: Name: .note.gnu.property
168+
# OBJ-ERR-NEXT: Offset: 0x40
169+
# OBJ-ERR-NEXT: Size: 0x[[SIZE]]
170+
# OBJ-ERR-NEXT: Note {
171+
# OBJ-ERR-NEXT: Owner: GNU
172+
# OBJ-ERR-NEXT: Data size: 0x[[DATASIZE]]
173+
# OBJ-ERR-NEXT: Type: NT_GNU_PROPERTY_TYPE_0 (property note)
174+
# OBJ-ERR-NEXT: Property [
175+
# OBJ-ERR-NEXT: AArch64 PAuth ABI core info: [[ERR]]
176+
# OBJ-ERR-NEXT: ]
177+
# OBJ-ERR-NEXT: }
178+
# OBJ-ERR-NEXT: }
179+
# OBJ-ERR-NEXT: ]
180+
181+
#--- gnu-long.s
182+
.section ".note.gnu.property", "a"
183+
.long 4 // Name length is always 4 ("GNU")
184+
.long end - begin // Data length
185+
.long 5 // Type: NT_GNU_PROPERTY_TYPE_0
186+
.asciz "GNU" // Name
187+
.p2align 3
188+
begin:
189+
# PAuth ABI property note
190+
.long 0xc0000001 // Type: GNU_PROPERTY_AARCH64_FEATURE_PAUTH
191+
.long 24 // Data size
192+
.quad 42 // PAuth ABI platform
193+
.quad 1 // PAuth ABI version
194+
.quad 0x0123456789ABCDEF
195+
.p2align 3 // Align to 8 byte for 64 bit
196+
end:
197+
198+
# RUN: llvm-mc -filetype=obj -triple aarch64-linux-gnu gnu-long.s -o gnu-long.o
199+
# RUN: llvm-readelf --notes gnu-long.o | \
200+
# RUN: FileCheck --check-prefix=ELF-ERR -DSIZE=30 -DDATASIZE=20 \
201+
# RUN: -DERR="<corrupted size: expected 16, got 24>" %s
202+
# RUN: llvm-readobj --notes gnu-long.o | \
203+
# RUN: FileCheck --check-prefix=OBJ-ERR -DSIZE=30 -DDATASIZE=20 \
204+
# RUN: -DERR="<corrupted size: expected 16, got 24>" %s

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
// See tests for GNU_PROPERTY_AARCH64_FEATURE_PAUTH in aarch64-feature-pauth.s
2+
13
// RUN: llvm-mc -filetype=obj -triple aarch64-linux-gnu %s -o %t
24
// RUN: llvm-readelf --notes %t | FileCheck %s --check-prefix=GNU
35
// RUN: llvm-readobj --notes %t | FileCheck %s --check-prefix=LLVM

0 commit comments

Comments
 (0)