Skip to content

Commit 3c6efe5

Browse files
authored
[llvm-readobj][AArch64][ELF][PAC] Support ELF AUTH constants (#74874)
Reapply #72713 after fixing formatted printing of `uint64_t` values as hex (see failing build here https://lab.llvm.org/buildbot/#/builders/186/builds/13604). This patch adds llvm-readobj support for: - Dynamic `R_AARCH64_AUTH_*` relocations (including RELR compressed AUTH relocations) as described here: https://github.com/ARM-software/abi-aa/blob/main/pauthabielf64/pauthabielf64.rst#auth-variant-dynamic-relocations - `.note.AARCH64-PAUTH-ABI-tag` section as defined here https://github.com/ARM-software/abi-aa/blob/main/pauthabielf64/pauthabielf64.rst#elf-marking
1 parent 05420a1 commit 3c6efe5

File tree

11 files changed

+302
-26
lines changed

11 files changed

+302
-26
lines changed

Diff for: llvm/include/llvm/BinaryFormat/DynamicTags.def

+6
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,12 @@ AARCH64_DYNAMIC_TAG(AARCH64_MEMTAG_STACK, 0x7000000c)
132132
AARCH64_DYNAMIC_TAG(AARCH64_MEMTAG_GLOBALS, 0x7000000d)
133133
AARCH64_DYNAMIC_TAG(AARCH64_MEMTAG_GLOBALSSZ, 0x7000000f)
134134

135+
// AArch64 specific dynamic table entries for RELR auth relocations as described here:
136+
// https://github.com/ARM-software/abi-aa/blob/main/pauthabielf64/pauthabielf64.rst#dynamic-section
137+
AARCH64_DYNAMIC_TAG(AARCH64_AUTH_RELRSZ, 0x70000011)
138+
AARCH64_DYNAMIC_TAG(AARCH64_AUTH_RELR, 0x70000012)
139+
AARCH64_DYNAMIC_TAG(AARCH64_AUTH_RELRENT, 0x70000013)
140+
135141
// Hexagon specific dynamic table entries
136142
HEXAGON_DYNAMIC_TAG(HEXAGON_SYMSZ, 0x70000000)
137143
HEXAGON_DYNAMIC_TAG(HEXAGON_VER, 0x70000001)

Diff for: llvm/include/llvm/BinaryFormat/ELF.h

+8
Original file line numberDiff line numberDiff line change
@@ -1060,6 +1060,9 @@ enum : unsigned {
10601060
SHT_ARM_ATTRIBUTES = 0x70000003U,
10611061
SHT_ARM_DEBUGOVERLAY = 0x70000004U,
10621062
SHT_ARM_OVERLAYSECTION = 0x70000005U,
1063+
// Special aarch64-specific section for MTE support, as described in:
1064+
// https://github.com/ARM-software/abi-aa/blob/main/pauthabielf64/pauthabielf64.rst#section-types
1065+
SHT_AARCH64_AUTH_RELR = 0x70000004U,
10631066
// Special aarch64-specific sections for MTE support, as described in:
10641067
// https://github.com/ARM-software/abi-aa/blob/main/memtagabielf64/memtagabielf64.rst#7section-types
10651068
SHT_AARCH64_MEMTAG_GLOBALS_STATIC = 0x70000007U,
@@ -1647,6 +1650,11 @@ enum {
16471650
NT_ANDROID_TYPE_MEMTAG = 4,
16481651
};
16491652

1653+
// ARM note types.
1654+
enum {
1655+
NT_ARM_TYPE_PAUTH_ABI_TAG = 1,
1656+
};
1657+
16501658
// Memory tagging values used in NT_ANDROID_TYPE_MEMTAG notes.
16511659
enum {
16521660
// Enumeration to determine the tagging mode. In Android-land, 'SYNC' means

Diff for: llvm/include/llvm/BinaryFormat/ELFRelocs/AArch64.def

+1
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ ELF_RELOC(R_AARCH64_TLS_TPREL64, 0x406)
135135
ELF_RELOC(R_AARCH64_TLSDESC, 0x407)
136136
ELF_RELOC(R_AARCH64_IRELATIVE, 0x408)
137137
ELF_RELOC(R_AARCH64_AUTH_ABS64, 0xe100)
138+
ELF_RELOC(R_AARCH64_AUTH_RELATIVE, 0xe200)
138139

139140
// ELF_RELOC(R_AARCH64_P32_NONE, 0)
140141
ELF_RELOC(R_AARCH64_P32_ABS32, 0x001)

Diff for: llvm/lib/Object/ELF.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ StringRef llvm::object::getELFSectionTypeName(uint32_t Machine, unsigned Type) {
273273
break;
274274
case ELF::EM_AARCH64:
275275
switch (Type) {
276+
STRINGIFY_ENUM_CASE(ELF, SHT_AARCH64_AUTH_RELR);
276277
STRINGIFY_ENUM_CASE(ELF, SHT_AARCH64_MEMTAG_GLOBALS_DYNAMIC);
277278
STRINGIFY_ENUM_CASE(ELF, SHT_AARCH64_MEMTAG_GLOBALS_STATIC);
278279
}

Diff for: llvm/lib/ObjectYAML/ELFYAML.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,7 @@ void ScalarEnumerationTraits<ELFYAML::ELF_SHT>::enumeration(
719719
ECase(SHT_MSP430_ATTRIBUTES);
720720
break;
721721
case ELF::EM_AARCH64:
722+
ECase(SHT_AARCH64_AUTH_RELR);
722723
ECase(SHT_AARCH64_MEMTAG_GLOBALS_STATIC);
723724
ECase(SHT_AARCH64_MEMTAG_GLOBALS_DYNAMIC);
724725
break;
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
# RUN: rm -rf %t && split-file %s %t && cd %t
2+
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

Diff for: llvm/test/tools/llvm-readobj/ELF/broken-dynamic-reloc.test

+40
Original file line numberDiff line numberDiff line change
@@ -459,3 +459,43 @@ ProgramHeaders:
459459
- Type: PT_DYNAMIC
460460
FirstSec: .dynamic
461461
LastSec: .dynamic
462+
463+
## Show we print a warning for an invalid relocation table size stored in a DT_AARCH64_AUTH_RELRSZ entry.
464+
# RUN: yaml2obj --docnum=8 -DRELTYPE=RELR -DTAG1=DT_AARCH64_AUTH_RELRSZ -DTAG1VAL=0xFF -DTAG2=DT_AARCH64_AUTH_RELRENT %s -o %t14
465+
# RUN: llvm-readobj --dyn-relocations %t14 2>&1 | FileCheck %s -DFILE=%t14 --check-prefix=INVALID-DT-AARCH64-AUTH-RELRSZ
466+
# RUN: llvm-readelf --dyn-relocations %t14 2>&1 | FileCheck %s -DFILE=%t14 --check-prefix=INVALID-DT-AARCH64-AUTH-RELRSZ
467+
468+
# INVALID-DT-AARCH64-AUTH-RELRSZ: warning: '[[FILE]]': invalid DT_AARCH64_AUTH_RELRSZ value (0xff) or DT_AARCH64_AUTH_RELRENT value (0x18)
469+
470+
## Show we print a warning for an invalid relocation table entry size stored in a DT_AARCH64_AUTH_RELRENT entry.
471+
# RUN: yaml2obj --docnum=8 -DRELTYPE=RELR -DTAG1=DT_AARCH64_AUTH_RELRSZ -DTAG2=DT_AARCH64_AUTH_RELRENT -DTAG2VAL=0xFF %s -o %t15
472+
# RUN: llvm-readobj --dyn-relocations %t15 2>&1 | FileCheck %s -DFILE=%t15 --check-prefix=INVALID-DT-AARCH64-AUTH-RELRENT
473+
# RUN: llvm-readelf --dyn-relocations %t15 2>&1 | FileCheck %s -DFILE=%t15 --check-prefix=INVALID-DT-AARCH64-AUTH-RELRENT
474+
475+
# INVALID-DT-AARCH64-AUTH-RELRENT: invalid DT_AARCH64_AUTH_RELRSZ value (0x18) or DT_AARCH64_AUTH_RELRENT value (0xff)
476+
477+
--- !ELF
478+
FileHeader:
479+
Class: ELFCLASS64
480+
Data: ELFDATA2LSB
481+
Type: ET_DYN
482+
Machine: EM_AARCH64
483+
Sections:
484+
- Name: .relx.dyn
485+
Type: SHT_[[RELTYPE]]
486+
- Name: .dynamic
487+
Type: SHT_DYNAMIC
488+
Entries:
489+
- Tag: DT_[[RELTYPE]]
490+
Value: 0x0
491+
- Tag: [[TAG1]]
492+
Value: [[TAG1VAL=0x18]]
493+
- Tag: [[TAG2]]
494+
Value: [[TAG2VAL=0x18]]
495+
- Tag: DT_NULL
496+
Value: 0x0
497+
DynamicSymbols: []
498+
ProgramHeaders:
499+
- Type: PT_LOAD
500+
FirstSec: .relx.dyn
501+
LastSec: .dynamic

Diff for: llvm/test/tools/llvm-readobj/ELF/dynamic-tags-machine-specific.test

+22-10
Original file line numberDiff line numberDiff line change
@@ -355,20 +355,26 @@ ProgramHeaders:
355355
# RUN: llvm-readobj --dynamic-table %t.aarch64 | FileCheck %s --check-prefix=LLVM-AARCH64
356356
# RUN: llvm-readelf --dynamic-table %t.aarch64 | FileCheck %s --check-prefix=GNU-AARCH64
357357

358-
# LLVM-AARCH64: DynamicSection [ (4 entries)
358+
# LLVM-AARCH64: DynamicSection [ (7 entries)
359359
# LLVM-AARCH64-NEXT: Tag Type Name/Value
360-
# LLVM-AARCH64-NEXT: 0x0000000070000001 AARCH64_BTI_PLT 1
361-
# LLVM-AARCH64-NEXT: 0x0000000070000003 AARCH64_PAC_PLT 2
362-
# LLVM-AARCH64-NEXT: 0x0000000070000005 AARCH64_VARIANT_PCS 3
363-
# LLVM-AARCH64-NEXT: 0x0000000000000000 NULL 0x0
360+
# LLVM-AARCH64-NEXT: 0x0000000070000001 AARCH64_BTI_PLT 1
361+
# LLVM-AARCH64-NEXT: 0x0000000070000003 AARCH64_PAC_PLT 2
362+
# LLVM-AARCH64-NEXT: 0x0000000070000005 AARCH64_VARIANT_PCS 3
363+
# LLVM-AARCH64-NEXT: 0x0000000070000012 AARCH64_AUTH_RELR 0x4
364+
# LLVM-AARCH64-NEXT: 0x0000000070000011 AARCH64_AUTH_RELRSZ 5
365+
# LLVM-AARCH64-NEXT: 0x0000000070000013 AARCH64_AUTH_RELRENT 6
366+
# LLVM-AARCH64-NEXT: 0x0000000000000000 NULL 0x0
364367
# LLVM-AARCH64-NEXT:]
365368

366-
# GNU-AARCH64: Dynamic section at offset {{.*}} contains 4 entries:
369+
# GNU-AARCH64: Dynamic section at offset {{.*}} contains 7 entries:
367370
# GNU-AARCH64-NEXT: Tag Type Name/Value
368-
# GNU-AARCH64-NEXT: 0x0000000070000001 (AARCH64_BTI_PLT) 1
369-
# GNU-AARCH64-NEXT: 0x0000000070000003 (AARCH64_PAC_PLT) 2
370-
# GNU-AARCH64-NEXT: 0x0000000070000005 (AARCH64_VARIANT_PCS) 3
371-
# GNU-AARCH64-NEXT: 0x0000000000000000 (NULL) 0x0
371+
# GNU-AARCH64-NEXT: 0x0000000070000001 (AARCH64_BTI_PLT) 1
372+
# GNU-AARCH64-NEXT: 0x0000000070000003 (AARCH64_PAC_PLT) 2
373+
# GNU-AARCH64-NEXT: 0x0000000070000005 (AARCH64_VARIANT_PCS) 3
374+
# GNU-AARCH64-NEXT: 0x0000000070000012 (AARCH64_AUTH_RELR) 0x4
375+
# GNU-AARCH64-NEXT: 0x0000000070000011 (AARCH64_AUTH_RELRSZ) 5
376+
# GNU-AARCH64-NEXT: 0x0000000070000013 (AARCH64_AUTH_RELRENT) 6
377+
# GNU-AARCH64-NEXT: 0x0000000000000000 (NULL) 0x0
372378

373379
--- !ELF
374380
FileHeader:
@@ -386,6 +392,12 @@ Sections:
386392
Value: 2
387393
- Tag: DT_AARCH64_VARIANT_PCS
388394
Value: 3
395+
- Tag: DT_AARCH64_AUTH_RELR
396+
Value: 4
397+
- Tag: DT_AARCH64_AUTH_RELRSZ
398+
Value: 5
399+
- Tag: DT_AARCH64_AUTH_RELRENT
400+
Value: 6
389401
- Tag: DT_NULL
390402
Value: 0
391403
ProgramHeaders:

Diff for: llvm/test/tools/llvm-readobj/ELF/machine-specific-section-types.test

+5
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,14 @@
5353
# MIPS-GNU: abiflags MIPS_ABIFLAGS
5454
# MIPS-GNU: dwarf MIPS_DWARF
5555

56+
# AARCH64-LLVM: Name: aarch64_auth_relr
57+
# AARCH64-LLVM: Type: SHT_AARCH64_AUTH_RELR
5658
# AARCH64-LLVM: Name: .memtag.globals.dynamic
5759
# AARCH64-LLVM: Type: SHT_AARCH64_MEMTAG_GLOBALS_DYNAMIC
5860
# AARCH64-LLVM: Name: .memtag.globals.static
5961
# AARCH64-LLVM: Type: SHT_AARCH64_MEMTAG_GLOBALS_STATIC
6062

63+
# AARCH64-GNU: aarch64_auth_relr AARCH64_AUTH_RELR
6164
# AARCH64-GNU: .memtag.globals.dynamic AARCH64_MEMTAG_GLOBALS_DYNAMIC
6265
# AARCH64-GNU: .memtag.globals.static AARCH64_MEMTAG_GLOBALS_STATIC
6366

@@ -113,6 +116,8 @@ FileHeader:
113116
Type: ET_REL
114117
Machine: EM_AARCH64
115118
Sections:
119+
- Name: aarch64_auth_relr
120+
Type: SHT_AARCH64_AUTH_RELR
116121
- Name: .memtag.globals.dynamic
117122
Type: SHT_AARCH64_MEMTAG_GLOBALS_DYNAMIC
118123
- Name: .memtag.globals.static

Diff for: llvm/test/tools/llvm-readobj/ELF/relr-relocs.test

+15-2
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ Sections:
158158
Link: [[LINK=<none>]]
159159

160160
## Check we report a warning when we are unable to dump relocations
161-
## for a SHT_RELR/SHT_ANDROID_RELR section.
161+
## for a SHT_RELR/SHT_ANDROID_RELR/SHT_AARCH64_AUTH_RELR section.
162162

163163
## Case A: check the case when relocations can't be read from an SHT_RELR section.
164164
# RUN: yaml2obj --docnum=2 -DENTSIZE=1 %s -o %t2.broken
@@ -186,7 +186,20 @@ Sections:
186186
# RUN: llvm-readelf --relocations %t2.broken.android 2>&1 | \
187187
# RUN: FileCheck -DFILE=%t2.broken.android --check-prefix=BROKEN-GNU %s -DSECNAME=SHT_ANDROID_RELR
188188

189-
## Check the behavior when the sh_link field of the SHT_RELR/SHT_ANDROID_RELR section
189+
## Case C: check the case when we have an SHT_AARCH64_AUTH_RELR section in non-AArch64 ELF.
190+
## SHT_AARCH64_AUTH_RELR = 0x70000004.
191+
# RUN: yaml2obj --docnum=2 -DENTSIZE=1 -DSHTYPE=0x70000004 %s -o %t2.broken.aarch64auth
192+
# RUN: llvm-readobj --relocations %t2.broken.aarch64auth 2>&1 | \
193+
# RUN: FileCheck -DFILE=%t2.broken.aarch64auth --check-prefix=WRONGARCH-LLVM-AARCH64-AUTH %s -DSECNAME=SHT_AARCH64_AUTH_RELR
194+
# RUN: llvm-readelf --relocations %t2.broken.aarch64auth 2>&1 | \
195+
# RUN: FileCheck -DFILE=%t2.broken.aarch64auth --check-prefix=WRONGARCH-GNU-AARCH64-AUTH %s -DSECNAME=SHT_AARCH64_AUTH_RELR
196+
197+
# WRONGARCH-LLVM-AARCH64-AUTH: Relocations [
198+
# WRONGARCH-LLVM-AARCH64-AUTH-NEXT: ]
199+
200+
# WRONGARCH-GNU-AARCH64-AUTH-NOT: Relocation section
201+
202+
## Check the behavior when the sh_link field of the SHT_RELR/SHT_ANDROID_RELR/SHT_AARCH64_AUTH_RELR section
190203
## is set to an arbitrary value. Normally, it is set to 0, because such sections contains
191204
## only relative relocations and do not have an associated symbol table, like other
192205
## relocation sections.

0 commit comments

Comments
 (0)