Skip to content

Commit 54854fc

Browse files
committed
[PAC][llvm-readobj][AArch64][ELF] Support GNU_PROPERTY_AARCH64_FEATURE_PAUTH
This adds support for `GNU_PROPERTY_AARCH64_FEATURE_PAUTH` feature 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`: - 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 4a6bc9f commit 54854fc

File tree

4 files changed

+289
-161
lines changed

4 files changed

+289
-161
lines changed

llvm/include/llvm/BinaryFormat/ELF.h

+21-5
Original file line numberDiff line numberDiff line change
@@ -1710,11 +1710,6 @@ enum {
17101710
NT_ANDROID_TYPE_MEMTAG = 4,
17111711
};
17121712

1713-
// ARM note types.
1714-
enum {
1715-
NT_ARM_TYPE_PAUTH_ABI_TAG = 1,
1716-
};
1717-
17181713
// Memory tagging values used in NT_ANDROID_TYPE_MEMTAG notes.
17191714
enum {
17201715
// Enumeration to determine the tagging mode. In Android-land, 'SYNC' means
@@ -1738,6 +1733,7 @@ enum : unsigned {
17381733
GNU_PROPERTY_STACK_SIZE = 1,
17391734
GNU_PROPERTY_NO_COPY_ON_PROTECTED = 2,
17401735
GNU_PROPERTY_AARCH64_FEATURE_1_AND = 0xc0000000,
1736+
GNU_PROPERTY_AARCH64_FEATURE_PAUTH = 0xc0000001,
17411737
GNU_PROPERTY_X86_FEATURE_1_AND = 0xc0000002,
17421738

17431739
GNU_PROPERTY_X86_UINT32_OR_LO = 0xc0008000,
@@ -1756,6 +1752,26 @@ enum : unsigned {
17561752
GNU_PROPERTY_AARCH64_FEATURE_1_GCS = 1 << 2,
17571753
};
17581754

1755+
// aarch64 PAuth platforms.
1756+
enum : unsigned {
1757+
AARCH64_PAUTH_PLATFORM_INVALID = 0x0,
1758+
AARCH64_PAUTH_PLATFORM_BAREMETAL = 0x1,
1759+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX = 0x10000002,
1760+
};
1761+
1762+
// Bit positions of version flags for AARCH64_PAUTH_PLATFORM_LLVM_LINUX
1763+
enum : unsigned {
1764+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INTRINSICS = 0,
1765+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_CALLS = 1,
1766+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_RETURNS = 2,
1767+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_AUTHTRAPS = 3,
1768+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRADDRDISCR = 4,
1769+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR = 5,
1770+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI = 6,
1771+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST =
1772+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI,
1773+
};
1774+
17591775
// x86 processor feature bits.
17601776
enum : unsigned {
17611777
GNU_PROPERTY_X86_FEATURE_1_IBT = 1 << 0,
Original file line numberDiff line numberDiff line change
@@ -1,98 +1,188 @@
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-GNU -DPLATFORM="0x2a (unknown)" -DVERSION=0x1 %s
23+
# RUN: llvm-readobj --notes gnu-42-1.o | \
24+
# RUN: FileCheck --check-prefix=OBJ-GNU -DPLATFORM="0x2a (unknown)" -DVERSION=0x1 %s
25+
26+
# ELF-GNU: Displaying notes found in: .note.gnu.property
27+
# ELF-GNU-NEXT: Owner Data size Description
28+
# ELF-GNU-NEXT: GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0 (property note)
29+
# ELF-GNU-NEXT: AArch64 PAuth ABI core info: platform [[PLATFORM]], version [[VERSION]]
30+
31+
# OBJ-GNU: Notes [
32+
# OBJ-GNU-NEXT: NoteSection {
33+
# OBJ-GNU-NEXT: Name: .note.gnu.property
34+
# OBJ-GNU-NEXT: Offset: 0x40
35+
# OBJ-GNU-NEXT: Size: 0x28
36+
# OBJ-GNU-NEXT: Note {
37+
# OBJ-GNU-NEXT: Owner: GNU
38+
# OBJ-GNU-NEXT: Data size: 0x18
39+
# OBJ-GNU-NEXT: Type: NT_GNU_PROPERTY_TYPE_0 (property note)
40+
# OBJ-GNU-NEXT: Property [
41+
# OBJ-GNU-NEXT: AArch64 PAuth ABI core info: platform [[PLATFORM]], version [[VERSION]]
42+
# OBJ-GNU-NEXT: ]
43+
# OBJ-GNU-NEXT: }
44+
# OBJ-GNU-NEXT: }
45+
# OBJ-GNU-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-GNU -DPLATFORM="0x0 (invalid)" -DVERSION=0x0 %s
67+
# RUN: llvm-readobj --notes gnu-0-0.o | \
68+
# RUN: FileCheck --check-prefix=OBJ-GNU -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-GNU -DPLATFORM="0x1 (baremetal)" -DVERSION=0x0 %s
90+
# RUN: llvm-readobj --notes gnu-1-0.o | \
91+
# RUN: FileCheck --check-prefix=OBJ-GNU -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-GNU -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-GNU -DPLATFORM="0x10000002 (llvm_linux)" \
116+
# RUN: -DVERSION="0x55 (PointerAuthIntrinsics, !PointerAuthCalls, PointerAuthReturns, !PointerAuthAuthTraps, PointerAuthVTPtrAddressDiscrimination, !PointerAuthVTPtrTypeDiscrimination, PointerAuthInitFini)" %s
117+
118+
#--- gnu-short.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 12 /* Data size */
130+
.quad 42 /* PAuth ABI platform */
131+
.word 1 /* 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-short.s -o gnu-short.o
136+
# RUN: llvm-readelf --notes gnu-short.o | \
137+
# RUN: FileCheck --check-prefix=ELF-GNU-ERR -DSIZE=28 -DDATASIZE=18 \
138+
# RUN: -DERR="<corrupted size: expected 16, got 12>" %s
139+
# RUN: llvm-readobj --notes gnu-short.o | \
140+
# RUN: FileCheck --check-prefix=OBJ-GNU-ERR -DSIZE=28 -DDATASIZE=18 \
141+
# RUN: -DERR="<corrupted size: expected 16, got 12>" %s
142+
143+
# ELF-GNU-ERR: Displaying notes found in: .note.gnu.property
144+
# ELF-GNU-ERR-NEXT: Owner Data size Description
145+
# ELF-GNU-ERR-NEXT: GNU 0x000000[[DATASIZE]] NT_GNU_PROPERTY_TYPE_0 (property note)
146+
# ELF-GNU-ERR-NEXT: AArch64 PAuth ABI core info: [[ERR]]
147+
148+
# OBJ-GNU-ERR: Notes [
149+
# OBJ-GNU-ERR-NEXT: NoteSection {
150+
# OBJ-GNU-ERR-NEXT: Name: .note.gnu.property
151+
# OBJ-GNU-ERR-NEXT: Offset: 0x40
152+
# OBJ-GNU-ERR-NEXT: Size: 0x[[SIZE]]
153+
# OBJ-GNU-ERR-NEXT: Note {
154+
# OBJ-GNU-ERR-NEXT: Owner: GNU
155+
# OBJ-GNU-ERR-NEXT: Data size: 0x[[DATASIZE]]
156+
# OBJ-GNU-ERR-NEXT: Type: NT_GNU_PROPERTY_TYPE_0 (property note)
157+
# OBJ-GNU-ERR-NEXT: Property [
158+
# OBJ-GNU-ERR-NEXT: AArch64 PAuth ABI core info: [[ERR]]
159+
# OBJ-GNU-ERR-NEXT: ]
160+
# OBJ-GNU-ERR-NEXT: }
161+
# OBJ-GNU-ERR-NEXT: }
162+
# OBJ-GNU-ERR-NEXT: ]
163+
164+
#--- gnu-long.s
165+
166+
.section ".note.gnu.property", "a"
167+
.long 4 /* Name length is always 4 ("GNU") */
168+
.long end - begin /* Data length */
169+
.long 5 /* Type: NT_GNU_PROPERTY_TYPE_0 */
170+
.asciz "GNU" /* Name */
171+
.p2align 3
172+
begin:
173+
/* PAuth ABI property note */
174+
.long 0xc0000001 /* Type: GNU_PROPERTY_AARCH64_FEATURE_PAUTH */
175+
.long 24 /* Data size */
176+
.quad 42 /* PAuth ABI platform */
177+
.quad 1 /* PAuth ABI version */
178+
.quad 0x0123456789ABCDEF
179+
.p2align 3 /* Align to 8 byte for 64 bit */
180+
end:
181+
182+
# RUN: llvm-mc -filetype=obj -triple aarch64-linux-gnu gnu-long.s -o gnu-long.o
183+
# RUN: llvm-readelf --notes gnu-long.o | \
184+
# RUN: FileCheck --check-prefix=ELF-GNU-ERR -DSIZE=30 -DDATASIZE=20 \
185+
# RUN: -DERR="<corrupted size: expected 16, got 24>" %s
186+
# RUN: llvm-readobj --notes gnu-long.o | \
187+
# RUN: FileCheck --check-prefix=OBJ-GNU-ERR -DSIZE=30 -DDATASIZE=20 \
188+
# RUN: -DERR="<corrupted size: expected 16, got 24>" %s

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

+2
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)