Skip to content

Commit 15d4a84

Browse files
authored
[PAC][ELF][AArch64] Encode signed GOT flag in PAuth core info (#96159)
Treat 8th bit of version value for llvm_linux platform as signed GOT flag. - clang: define `PointerAuthELFGOT` LangOption and set 8th bit of `aarch64-elf-pauthabi-version` LLVM module flag correspondingly; - llvm-readobj: print `PointerAuthELFGOT` or `!PointerAuthELFGOT` in version description of llvm_linux platform depending on whether the flag is set.
1 parent 9684c87 commit 15d4a84

File tree

6 files changed

+100
-24
lines changed

6 files changed

+100
-24
lines changed

clang/include/clang/Basic/LangOptions.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,7 @@ BENIGN_LANGOPT(PointerAuthFunctionTypeDiscrimination, 1, 0,
175175
LANGOPT(PointerAuthInitFini, 1, 0, "sign function pointers in init/fini arrays")
176176
LANGOPT(PointerAuthInitFiniAddressDiscrimination, 1, 0,
177177
"incorporate address discrimination in authenticated function pointers in init/fini arrays")
178+
LANGOPT(PointerAuthELFGOT, 1, 0, "authenticate pointers from GOT")
178179

179180
LANGOPT(DoubleSquareBracketAttributes, 1, 0, "'[[]]' attributes extension for all language standard modes")
180181
LANGOPT(ExperimentalLateParseAttributes, 1, 0, "experimental late parsing of attributes")

clang/lib/CodeGen/CodeGenModule.cpp

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1218,11 +1218,12 @@ void CodeGenModule::Release() {
12181218
(LangOpts.PointerAuthInitFini
12191219
<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI) |
12201220
(LangOpts.PointerAuthInitFiniAddressDiscrimination
1221-
<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC);
1222-
static_assert(
1223-
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC ==
1224-
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
1225-
"Update when new enum items are defined");
1221+
<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC) |
1222+
(LangOpts.PointerAuthELFGOT
1223+
<< AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT);
1224+
static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT ==
1225+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
1226+
"Update when new enum items are defined");
12261227
if (PAuthABIVersion != 0) {
12271228
getModule().addModuleFlag(llvm::Module::Error,
12281229
"aarch64-elf-pauthabi-platform",

llvm/include/llvm/BinaryFormat/ELF.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1800,8 +1800,9 @@ enum : unsigned {
18001800
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_VPTRTYPEDISCR = 5,
18011801
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI = 6,
18021802
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC = 7,
1803+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT = 8,
18031804
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST =
1804-
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC,
1805+
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT,
18051806
};
18061807

18071808
// x86 processor feature bits.

llvm/test/CodeGen/AArch64/note-gnu-property-elf-pauthabi.ll

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
!llvm.module.flags = !{!0, !1}
1111

1212
!0 = !{i32 1, !"aarch64-elf-pauthabi-platform", i32 268435458}
13-
!1 = !{i32 1, !"aarch64-elf-pauthabi-version", i32 85}
13+
!1 = !{i32 1, !"aarch64-elf-pauthabi-version", i32 341}
1414

1515
; ASM: .section .note.gnu.property,"a",@note
1616
; ASM-NEXT: .p2align 3, 0x0
@@ -22,12 +22,12 @@
2222
; ASM-NEXT: .word 3221225473
2323
; ASM-NEXT: .word 16
2424
; ASM-NEXT: .xword 268435458
25-
; ASM-NEXT: .xword 85
25+
; ASM-NEXT: .xword 341
2626

2727
; OBJ: Displaying notes found in: .note.gnu.property
2828
; OBJ-NEXT: Owner Data size Description
2929
; OBJ-NEXT: GNU 0x00000018 NT_GNU_PROPERTY_TYPE_0 (property note)
30-
; OBJ-NEXT: AArch64 PAuth ABI core info: platform 0x10000002 (llvm_linux), version 0x55 (PointerAuthIntrinsics, !PointerAuthCalls, PointerAuthReturns, !PointerAuthAuthTraps, PointerAuthVTPtrAddressDiscrimination, !PointerAuthVTPtrTypeDiscrimination, PointerAuthInitFini, !PointerAuthInitFiniAddressDiscrimination)
30+
; OBJ-NEXT: AArch64 PAuth ABI core info: platform 0x10000002 (llvm_linux), version 0x155 (PointerAuthIntrinsics, !PointerAuthCalls, PointerAuthReturns, !PointerAuthAuthTraps, PointerAuthVTPtrAddressDiscrimination, !PointerAuthVTPtrTypeDiscrimination, PointerAuthInitFini, !PointerAuthInitFiniAddressDiscrimination, PointerAuthELFGOT)
3131

3232
; ERR: either both or no 'aarch64-elf-pauthabi-platform' and 'aarch64-elf-pauthabi-version' module flags must be present
3333

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

Lines changed: 86 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ end:
8989
# RUN: llvm-readobj --notes gnu-1-0.o | \
9090
# RUN: FileCheck --check-prefix=OBJ -DPLATFORM="0x1 (baremetal)" -DVERSION=0x0 %s
9191

92-
#--- gnu-0x10000002-85.s
92+
#--- gnu-0x10000002-0.s
9393
.section ".note.gnu.property", "a"
9494
.long 4 // Name length is always 4 ("GNU")
9595
.long end - begin // Data length
@@ -101,19 +101,91 @@ begin:
101101
.long 0xc0000001 // Type: GNU_PROPERTY_AARCH64_FEATURE_PAUTH
102102
.long 16 // Data size
103103
.quad 0x10000002 // PAuth ABI platform
104-
.quad 85 // PAuth ABI version
104+
.quad 0 // PAuth ABI version
105+
.p2align 3 // Align to 8 byte for 64 bit
106+
end:
107+
108+
# RUN: llvm-mc -filetype=obj -triple aarch64-linux-gnu gnu-0x10000002-0.s -o gnu-0x10000002-0.o
109+
# RUN: llvm-readelf --notes gnu-0x10000002-0.o | \
110+
# RUN: FileCheck --check-prefix=ELF -DPLATFORM="0x10000002 (llvm_linux)" \
111+
# RUN: -DVERSION="0x0 (!PointerAuthIntrinsics, !PointerAuthCalls, !PointerAuthReturns, !PointerAuthAuthTraps, !PointerAuthVTPtrAddressDiscrimination, !PointerAuthVTPtrTypeDiscrimination, !PointerAuthInitFini, !PointerAuthInitFiniAddressDiscrimination, !PointerAuthELFGOT)" %s
112+
# RUN: llvm-readobj --notes gnu-0x10000002-0.o | \
113+
# RUN: FileCheck --check-prefix=OBJ -DPLATFORM="0x10000002 (llvm_linux)" \
114+
# RUN: -DVERSION="0x0 (!PointerAuthIntrinsics, !PointerAuthCalls, !PointerAuthReturns, !PointerAuthAuthTraps, !PointerAuthVTPtrAddressDiscrimination, !PointerAuthVTPtrTypeDiscrimination, !PointerAuthInitFini, !PointerAuthInitFiniAddressDiscrimination, !PointerAuthELFGOT)" %s
115+
116+
#--- gnu-0x10000002-341.s
117+
.section ".note.gnu.property", "a"
118+
.long 4 // Name length is always 4 ("GNU")
119+
.long end - begin // Data length
120+
.long 5 // Type: NT_GNU_PROPERTY_TYPE_0
121+
.asciz "GNU" // Name
122+
.p2align 3
123+
begin:
124+
# PAuth ABI property note
125+
.long 0xc0000001 // Type: GNU_PROPERTY_AARCH64_FEATURE_PAUTH
126+
.long 16 // Data size
127+
.quad 0x10000002 // PAuth ABI platform
128+
.quad 341 // PAuth ABI version
129+
.p2align 3 // Align to 8 byte for 64 bit
130+
end:
131+
132+
# RUN: llvm-mc -filetype=obj -triple aarch64-linux-gnu gnu-0x10000002-341.s -o gnu-0x10000002-341.o
133+
# RUN: llvm-readelf --notes gnu-0x10000002-341.o | \
134+
# RUN: FileCheck --check-prefix=ELF -DPLATFORM="0x10000002 (llvm_linux)" \
135+
# RUN: -DVERSION="0x155 (PointerAuthIntrinsics, !PointerAuthCalls, PointerAuthReturns, !PointerAuthAuthTraps, PointerAuthVTPtrAddressDiscrimination, !PointerAuthVTPtrTypeDiscrimination, PointerAuthInitFini, !PointerAuthInitFiniAddressDiscrimination, PointerAuthELFGOT)" %s
136+
# RUN: llvm-readobj --notes gnu-0x10000002-341.o | \
137+
# RUN: FileCheck --check-prefix=OBJ -DPLATFORM="0x10000002 (llvm_linux)" \
138+
# RUN: -DVERSION="0x155 (PointerAuthIntrinsics, !PointerAuthCalls, PointerAuthReturns, !PointerAuthAuthTraps, PointerAuthVTPtrAddressDiscrimination, !PointerAuthVTPtrTypeDiscrimination, PointerAuthInitFini, !PointerAuthInitFiniAddressDiscrimination, PointerAuthELFGOT)" %s
139+
140+
#--- gnu-0x10000002-170.s
141+
.section ".note.gnu.property", "a"
142+
.long 4 // Name length is always 4 ("GNU")
143+
.long end - begin // Data length
144+
.long 5 // Type: NT_GNU_PROPERTY_TYPE_0
145+
.asciz "GNU" // Name
146+
.p2align 3
147+
begin:
148+
# PAuth ABI property note
149+
.long 0xc0000001 // Type: GNU_PROPERTY_AARCH64_FEATURE_PAUTH
150+
.long 16 // Data size
151+
.quad 0x10000002 // PAuth ABI platform
152+
.quad 170 // PAuth ABI version
153+
.p2align 3 // Align to 8 byte for 64 bit
154+
end:
155+
156+
# RUN: llvm-mc -filetype=obj -triple aarch64-linux-gnu gnu-0x10000002-170.s -o gnu-0x10000002-170.o
157+
# RUN: llvm-readelf --notes gnu-0x10000002-170.o | \
158+
# RUN: FileCheck --check-prefix=ELF -DPLATFORM="0x10000002 (llvm_linux)" \
159+
# RUN: -DVERSION="0xaa (!PointerAuthIntrinsics, PointerAuthCalls, !PointerAuthReturns, PointerAuthAuthTraps, !PointerAuthVTPtrAddressDiscrimination, PointerAuthVTPtrTypeDiscrimination, !PointerAuthInitFini, PointerAuthInitFiniAddressDiscrimination, !PointerAuthELFGOT)" %s
160+
# RUN: llvm-readobj --notes gnu-0x10000002-170.o | \
161+
# RUN: FileCheck --check-prefix=OBJ -DPLATFORM="0x10000002 (llvm_linux)" \
162+
# RUN: -DVERSION="0xaa (!PointerAuthIntrinsics, PointerAuthCalls, !PointerAuthReturns, PointerAuthAuthTraps, !PointerAuthVTPtrAddressDiscrimination, PointerAuthVTPtrTypeDiscrimination, !PointerAuthInitFini, PointerAuthInitFiniAddressDiscrimination, !PointerAuthELFGOT)" %s
163+
164+
#--- gnu-0x10000002-511.s
165+
.section ".note.gnu.property", "a"
166+
.long 4 // Name length is always 4 ("GNU")
167+
.long end - begin // Data length
168+
.long 5 // Type: NT_GNU_PROPERTY_TYPE_0
169+
.asciz "GNU" // Name
170+
.p2align 3
171+
begin:
172+
# PAuth ABI property note
173+
.long 0xc0000001 // Type: GNU_PROPERTY_AARCH64_FEATURE_PAUTH
174+
.long 16 // Data size
175+
.quad 0x10000002 // PAuth ABI platform
176+
.quad 511 // PAuth ABI version
105177
.p2align 3 // Align to 8 byte for 64 bit
106178
end:
107179

108-
# RUN: llvm-mc -filetype=obj -triple aarch64-linux-gnu gnu-0x10000002-85.s -o gnu-0x10000002-85.o
109-
# RUN: llvm-readelf --notes gnu-0x10000002-85.o | \
180+
# RUN: llvm-mc -filetype=obj -triple aarch64-linux-gnu gnu-0x10000002-511.s -o gnu-0x10000002-511.o
181+
# RUN: llvm-readelf --notes gnu-0x10000002-511.o | \
110182
# RUN: FileCheck --check-prefix=ELF -DPLATFORM="0x10000002 (llvm_linux)" \
111-
# RUN: -DVERSION="0x55 (PointerAuthIntrinsics, !PointerAuthCalls, PointerAuthReturns, !PointerAuthAuthTraps, PointerAuthVTPtrAddressDiscrimination, !PointerAuthVTPtrTypeDiscrimination, PointerAuthInitFini, !PointerAuthInitFiniAddressDiscrimination)" %s
112-
# RUN: llvm-readobj --notes gnu-0x10000002-85.o | \
183+
# RUN: -DVERSION="0x1ff (PointerAuthIntrinsics, PointerAuthCalls, PointerAuthReturns, PointerAuthAuthTraps, PointerAuthVTPtrAddressDiscrimination, PointerAuthVTPtrTypeDiscrimination, PointerAuthInitFini, PointerAuthInitFiniAddressDiscrimination, PointerAuthELFGOT)" %s
184+
# RUN: llvm-readobj --notes gnu-0x10000002-511.o | \
113185
# RUN: FileCheck --check-prefix=OBJ -DPLATFORM="0x10000002 (llvm_linux)" \
114-
# RUN: -DVERSION="0x55 (PointerAuthIntrinsics, !PointerAuthCalls, PointerAuthReturns, !PointerAuthAuthTraps, PointerAuthVTPtrAddressDiscrimination, !PointerAuthVTPtrTypeDiscrimination, PointerAuthInitFini, !PointerAuthInitFiniAddressDiscrimination)" %s
186+
# RUN: -DVERSION="0x1ff (PointerAuthIntrinsics, PointerAuthCalls, PointerAuthReturns, PointerAuthAuthTraps, PointerAuthVTPtrAddressDiscrimination, PointerAuthVTPtrTypeDiscrimination, PointerAuthInitFini, PointerAuthInitFiniAddressDiscrimination, PointerAuthELFGOT)" %s
115187

116-
#--- gnu-0x10000002-256.s
188+
#--- gnu-0x10000002-512.s
117189
.section ".note.gnu.property", "a"
118190
.long 4 // Name length is always 4 ("GNU")
119191
.long end - begin // Data length
@@ -125,15 +197,15 @@ begin:
125197
.long 0xc0000001 // Type: GNU_PROPERTY_AARCH64_FEATURE_PAUTH
126198
.long 16 // Data size
127199
.quad 0x10000002 // PAuth ABI platform
128-
.quad 256 // PAuth ABI version
200+
.quad 512 // PAuth ABI version
129201
.p2align 3 // Align to 8 byte for 64 bit
130202
end:
131203

132-
# RUN: llvm-mc -filetype=obj -triple aarch64-linux-gnu gnu-0x10000002-256.s -o gnu-0x10000002-256.o
133-
# RUN: llvm-readelf --notes gnu-0x10000002-256.o | \
134-
# RUN: FileCheck --check-prefix=ELF -DPLATFORM="0x10000002 (llvm_linux)" -DVERSION="0x100 (unknown)" %s
135-
# RUN: llvm-readobj --notes gnu-0x10000002-256.o | \
136-
# RUN: FileCheck --check-prefix=OBJ -DPLATFORM="0x10000002 (llvm_linux)" -DVERSION="0x100 (unknown)" %s
204+
# RUN: llvm-mc -filetype=obj -triple aarch64-linux-gnu gnu-0x10000002-512.s -o gnu-0x10000002-512.o
205+
# RUN: llvm-readelf --notes gnu-0x10000002-512.o | \
206+
# RUN: FileCheck --check-prefix=ELF -DPLATFORM="0x10000002 (llvm_linux)" -DVERSION="0x200 (unknown)" %s
207+
# RUN: llvm-readobj --notes gnu-0x10000002-512.o | \
208+
# RUN: FileCheck --check-prefix=OBJ -DPLATFORM="0x10000002 (llvm_linux)" -DVERSION="0x200 (unknown)" %s
137209

138210
#--- gnu-short.s
139211
.section ".note.gnu.property", "a"

llvm/tools/llvm-readobj/ELFDumper.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5286,8 +5286,9 @@ static bool printAArch64PAuthABICoreInfo(raw_ostream &OS, uint32_t DataSize,
52865286
Flags[AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINI] = "InitFini";
52875287
Flags[AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC] =
52885288
"InitFiniAddressDiscrimination";
5289+
Flags[AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT] = "ELFGOT";
52895290

5290-
static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_INITFINIADDRDISC ==
5291+
static_assert(AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_GOT ==
52915292
AARCH64_PAUTH_PLATFORM_LLVM_LINUX_VERSION_LAST,
52925293
"Update when new enum items are defined");
52935294

0 commit comments

Comments
 (0)