Skip to content

Commit 5029949

Browse files
authored
[PAC][llvm-readobj][AArch64][ELF] Support GNU_PROPERTY_AARCH64_FEATURE_PAUTH (#85231)
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 7327014 commit 5029949

File tree

4 files changed

+303
-157
lines changed

4 files changed

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