Skip to content

Commit 647aa46

Browse files
committed
[llvm-readobj][AArch64][ELF][PAC] Support ELF AUTH constants
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 e9c6f3f commit 647aa46

File tree

11 files changed

+302
-26
lines changed

11 files changed

+302
-26
lines changed

llvm/include/llvm/BinaryFormat/DynamicTags.def

Lines changed: 6 additions & 0 deletions
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)

llvm/include/llvm/BinaryFormat/ELF.h

Lines changed: 8 additions & 0 deletions
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

llvm/include/llvm/BinaryFormat/ELFRelocs/AArch64.def

Lines changed: 1 addition & 0 deletions
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)

llvm/lib/Object/ELF.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,7 @@ StringRef llvm::object::getELFSectionTypeName(uint32_t Machine, unsigned Type) {
299299
STRINGIFY_ENUM_CASE(ELF, SHT_GROUP);
300300
STRINGIFY_ENUM_CASE(ELF, SHT_SYMTAB_SHNDX);
301301
STRINGIFY_ENUM_CASE(ELF, SHT_RELR);
302+
STRINGIFY_ENUM_CASE(ELF, SHT_AARCH64_AUTH_RELR);
302303
STRINGIFY_ENUM_CASE(ELF, SHT_ANDROID_REL);
303304
STRINGIFY_ENUM_CASE(ELF, SHT_ANDROID_RELA);
304305
STRINGIFY_ENUM_CASE(ELF, SHT_ANDROID_RELR);

llvm/lib/ObjectYAML/ELFYAML.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -672,6 +672,7 @@ void ScalarEnumerationTraits<ELFYAML::ELF_SHT>::enumeration(
672672
ECase(SHT_GROUP);
673673
ECase(SHT_SYMTAB_SHNDX);
674674
ECase(SHT_RELR);
675+
ECase(SHT_AARCH64_AUTH_RELR);
675676
ECase(SHT_ANDROID_REL);
676677
ECase(SHT_ANDROID_RELA);
677678
ECase(SHT_ANDROID_RELR);
Lines changed: 98 additions & 0 deletions
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

llvm/test/tools/llvm-readobj/ELF/broken-dynamic-reloc.test

Lines changed: 40 additions & 0 deletions
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

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

Lines changed: 22 additions & 10 deletions
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:

llvm/test/tools/llvm-readobj/ELF/relr-relocs.test

Lines changed: 20 additions & 2 deletions
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,25 @@ 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 relocations can't be read from an SHT_AARCH64_AUTH_RELR section.
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=BROKEN-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=BROKEN-GNU-AARCH64-AUTH %s -DSECNAME=SHT_AARCH64_AUTH_RELR
196+
197+
# BROKEN-LLVM-AARCH64-AUTH: Relocations [
198+
# BROKEN-LLVM-AARCH64-AUTH-NEXT: Section (1) .relr.dyn {
199+
# BROKEN-LLVM-AARCH64-AUTH-NEXT: warning: '[[FILE]]': SHT_AARCH64_AUTH_RELR section in non-AArch64 ELF found, skipping
200+
# BROKEN-LLVM-AARCH64-AUTH-NEXT: }
201+
# BROKEN-LLVM-AARCH64-AUTH-NEXT: ]
202+
203+
# BROKEN-GNU-AARCH64-AUTH: Relocation section '.relr.dyn' at offset 0x34 contains <?> entries:
204+
# BROKEN-GNU-AARCH64-AUTH-NEXT: Offset Info Type Sym. Value Symbol's Name
205+
# BROKEN-GNU-AARCH64-AUTH-NEXT: warning: '[[FILE]]': SHT_AARCH64_AUTH_RELR section in non-AArch64 ELF found, skipping
206+
207+
## Check the behavior when the sh_link field of the SHT_RELR/SHT_ANDROID_RELR/SHT_AARCH64_AUTH_RELR section
190208
## is set to an arbitrary value. Normally, it is set to 0, because such sections contains
191209
## only relative relocations and do not have an associated symbol table, like other
192210
## relocation sections.

llvm/test/tools/llvm-readobj/ELF/section-types.test

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@
4343
# LLVM: Type: SHT_ANDROID_RELA
4444
# LLVM: Name: android_relr
4545
# LLVM: Type: SHT_ANDROID_RELR
46+
# LLVM: Name: aarch64_auth_relr
47+
# LLVM: Type: SHT_AARCH64_AUTH_RELR
4648
# LLVM: Name: llvm_odrtab
4749
# LLVM: Type: SHT_LLVM_ODRTAB
4850
# LLVM: Name: linker_options
@@ -113,6 +115,7 @@
113115
# GNU-NEXT: android_rel ANDROID_REL
114116
# GNU-NEXT: android_rela ANDROID_RELA
115117
# GNU-NEXT: android_relr ANDROID_RELR
118+
# GNU-NEXT: aarch64_auth_relr AARCH64_AUTH_RELR
116119
# GNU-NEXT: llvm_odrtab LLVM_ODRTAB
117120
# GNU-NEXT: linker_options LLVM_LINKER_OPTIONS
118121
# GNU-NEXT: llvm_call_graph_profile LLVM_CALL_GRAPH_PROFILE
@@ -191,6 +194,8 @@ Sections:
191194
Type: SHT_ANDROID_RELA
192195
- Name: android_relr
193196
Type: SHT_ANDROID_RELR
197+
- Name: aarch64_auth_relr
198+
Type: SHT_AARCH64_AUTH_RELR
194199
- Name: llvm_odrtab
195200
Type: SHT_LLVM_ODRTAB
196201
- Name: linker_options

0 commit comments

Comments
 (0)