Skip to content

Commit 13cd73d

Browse files
Il-CapitanoIanWood1
authored andcommitted
[LLD][ELF][AArch64] Mark .plt and .iplt with PURECODE flag (llvm#134798)
Mark the synthetic sections `.plt` and `.iplt` with the `SHF_AARCH64_PURECODE` section flag, allowing them to be placed in an executable-only segment.
1 parent c039a1b commit 13cd73d

File tree

4 files changed

+90
-94
lines changed

4 files changed

+90
-94
lines changed

lld/ELF/SyntheticSections.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2594,6 +2594,11 @@ PltSection::PltSection(Ctx &ctx)
25942594
: SyntheticSection(ctx, ".plt", SHT_PROGBITS, SHF_ALLOC | SHF_EXECINSTR,
25952595
16),
25962596
headerSize(ctx.target->pltHeaderSize) {
2597+
// On AArch64, PLT entries only do loads from the .got.plt section, so the
2598+
// .plt section can be marked with the SHF_AARCH64_PURECODE section flag.
2599+
if (ctx.arg.emachine == EM_AARCH64)
2600+
this->flags |= SHF_AARCH64_PURECODE;
2601+
25972602
// On PowerPC, this section contains lazy symbol resolvers.
25982603
if (ctx.arg.emachine == EM_PPC64) {
25992604
name = ".glink";
@@ -2654,6 +2659,11 @@ void PltSection::addSymbols() {
26542659
IpltSection::IpltSection(Ctx &ctx)
26552660
: SyntheticSection(ctx, ".iplt", SHT_PROGBITS, SHF_ALLOC | SHF_EXECINSTR,
26562661
16) {
2662+
// On AArch64, PLT entries only do loads from the .got.plt section, so the
2663+
// .iplt section can be marked with the SHF_AARCH64_PURECODE section flag.
2664+
if (ctx.arg.emachine == EM_AARCH64)
2665+
this->flags |= SHF_AARCH64_PURECODE;
2666+
26572667
if (ctx.arg.emachine == EM_PPC || ctx.arg.emachine == EM_PPC64) {
26582668
name = ".glink";
26592669
addralign = 4;
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
// REQUIRES: aarch64
2+
3+
// RUN: llvm-mc -filetype=obj -triple=aarch64-linux-gnu %s -o %t.o
4+
// RUN: llvm-mc -filetype=obj -triple=aarch64-linux-gnu %S/Inputs/plt-aarch64.s -o %t2.o
5+
// RUN: ld.lld -shared %t2.o -soname=t2.so -o %t2.so
6+
// RUN: ld.lld %t.o %t2.so -o %t
7+
// RUN: llvm-readelf -S -l %t | FileCheck %s
8+
9+
// CHECK-LABEL: Section Headers:
10+
// CHECK: .text PROGBITS 00000000002102a0 0002a0 000010 00 AXy 0 0 4
11+
// CHECK: .plt PROGBITS 00000000002102b0 0002b0 000030 00 AXy 0 0 16
12+
// CHECK: .iplt PROGBITS 00000000002102e0 0002e0 000010 00 AXy 0 0 16
13+
14+
// CHECK-LABEL: Program Headers:
15+
// CHECK: PHDR
16+
// CHECK-NEXT: LOAD
17+
// CHECK-NEXT: LOAD 0x0002a0 0x00000000002102a0 0x00000000002102a0 0x000050 0x000050 E 0x10000
18+
19+
// CHECK-LABEL: Section to Segment mapping:
20+
/// Index should match the index of the LOAD segment above.
21+
// CHECK: 02 .text .plt .iplt
22+
23+
.global bar
24+
25+
.section .text,"axy",@progbits,unique,0
26+
.global _start
27+
_start:
28+
bl foo
29+
bl bar
30+
ret
31+
32+
.globl foo
33+
.type foo STT_GNU_IFUNC
34+
foo:
35+
ret

lld/test/ELF/aarch64-gnu-ifunc-plt.s

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,34 @@
55
// RUN: ld.lld --hash-style=sysv %t.so %t.o -o %tout
66
// RUN: llvm-objdump --no-print-imm-hex -d --no-show-raw-insn %tout | FileCheck %s --check-prefix=DISASM
77
// RUN: llvm-objdump -s %tout | FileCheck %s --check-prefix=GOTPLT
8-
// RUN: llvm-readobj --dynamic-table -r %tout | FileCheck %s
8+
// RUN: llvm-readelf -S --dynamic-table -r %tout | FileCheck %s
99

1010
// RUN: llvm-mc -filetype=obj -triple=aarch64_be %S/Inputs/shared2.s -o %t1.be.o
1111
// RUN: ld.lld %t1.be.o --shared --soname=t.so -o %t.be.so
1212
// RUN: llvm-mc -filetype=obj -triple=aarch64_be %s -o %t.be.o
1313
// RUN: ld.lld --hash-style=sysv %t.be.so %t.be.o -o %t.be
1414
// RUN: llvm-objdump --no-print-imm-hex -d --no-show-raw-insn %t.be | FileCheck %s --check-prefix=DISASM
1515
// RUN: llvm-objdump -s %t.be | FileCheck %s --check-prefix=GOTPLT_BE
16-
// RUN: llvm-readobj --dynamic-table -r %t.be | FileCheck %s
16+
// RUN: llvm-readelf -S --dynamic-table -r %t.be | FileCheck %s
1717

18-
// Check that the PLTRELSZ tag does not include the IRELATIVE relocations
19-
// CHECK: DynamicSection [
20-
// CHECK: 0x0000000000000008 RELASZ 48 (bytes)
21-
// CHECK: 0x0000000000000002 PLTRELSZ 48 (bytes)
18+
// CHECK-LABEL: Section Headers:
19+
/// Name Type Address Off Size ES Flg Lk Inf Al
20+
// CHECK: .iplt PROGBITS 0000000000210330 000330 000020 00 AXy 0 0 16
2221

23-
// Check that the IRELATIVE relocations are after the JUMP_SLOT in the plt
24-
// CHECK: Relocations [
25-
// CHECK-NEXT: Section (4) .rela.dyn {
26-
// CHECK-NEXT: 0x230468 R_AARCH64_IRELATIVE - 0x2102D8
27-
// CHECK-NEXT: 0x230470 R_AARCH64_IRELATIVE - 0x2102DC
28-
// CHECK-NEXT: }
29-
// CHECK-NEXT: Section (5) .rela.plt {
30-
// CHECK-NEXT: 0x230458 R_AARCH64_JUMP_SLOT bar2 0x0
31-
// CHECK-NEXT: 0x230460 R_AARCH64_JUMP_SLOT zed2 0x0
32-
// CHECK-NEXT: }
33-
// CHECK-NEXT: ]
22+
/// Check that the PLTRELSZ tag does not include the IRELATIVE relocations
23+
// CHECK-LABEL: Dynamic section at offset 0x350 contains 15 entries:
24+
// CHECK: 0x0000000000000008 (RELASZ) 48 (bytes)
25+
// CHECK: 0x0000000000000002 (PLTRELSZ) 48 (bytes)
26+
27+
/// Check that the IRELATIVE relocations are after the JUMP_SLOT in the plt
28+
// CHECK-LABEL: Relocation section '.rela.dyn' at offset 0x278 contains 2 entries:
29+
// CHECK-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
30+
// CHECK-NEXT: 0000000000230468 0000000000000408 R_AARCH64_IRELATIVE 2102d8
31+
// CHECK-NEXT: 0000000000230470 0000000000000408 R_AARCH64_IRELATIVE 2102dc
32+
// CHECK-LABEL: Relocation section '.rela.plt' at offset 0x2a8 contains 2 entries:
33+
// CHECK-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
34+
// CHECK-NEXT: 0000000000230458 0000000100000402 R_AARCH64_JUMP_SLOT 0000000000000000 bar2 + 0
35+
// CHECK-NEXT: 0000000000230460 0000000200000402 R_AARCH64_JUMP_SLOT 0000000000000000 zed2 + 0
3436

3537
// Check that .got.plt entries point back to PLT header
3638
// GOTPLT: Contents of section .got.plt:

lld/test/ELF/aarch64-plt.s

Lines changed: 26 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -4,52 +4,26 @@
44
// RUN: ld.lld -shared %t2.o -soname=t2.so -o %t2.so
55
// RUN: ld.lld -shared %t.o %t2.so -o %t.so
66
// RUN: ld.lld %t.o %t2.so -o %t.exe
7-
// RUN: llvm-readobj -S -r %t.so | FileCheck --check-prefix=CHECKDSO %s
7+
// RUN: llvm-readelf -S -r %t.so | FileCheck --check-prefix=CHECKDSO %s
88
// RUN: llvm-objdump -s --section=.got.plt %t.so | FileCheck --check-prefix=DUMPDSO %s
99
// RUN: llvm-objdump -d --no-show-raw-insn --print-imm-hex %t.so | FileCheck --check-prefix=DISASMDSO %s
10-
// RUN: llvm-readobj -S -r %t.exe | FileCheck --check-prefix=CHECKEXE %s
10+
// RUN: llvm-readelf -S -r %t.exe | FileCheck --check-prefix=CHECKEXE %s
1111
// RUN: llvm-objdump -s --section=.got.plt %t.exe | FileCheck --check-prefix=DUMPEXE %s
1212
// RUN: llvm-objdump -d --no-show-raw-insn --print-imm-hex %t.exe | FileCheck --check-prefix=DISASMEXE %s
1313

14-
// CHECKDSO: Name: .plt
15-
// CHECKDSO-NEXT: Type: SHT_PROGBITS
16-
// CHECKDSO-NEXT: Flags [
17-
// CHECKDSO-NEXT: SHF_ALLOC
18-
// CHECKDSO-NEXT: SHF_EXECINSTR
19-
// CHECKDSO-NEXT: ]
20-
// CHECKDSO-NEXT: Address: 0x10340
21-
// CHECKDSO-NEXT: Offset:
22-
// CHECKDSO-NEXT: Size: 80
23-
// CHECKDSO-NEXT: Link:
24-
// CHECKDSO-NEXT: Info:
25-
// CHECKDSO-NEXT: AddressAlignment: 16
26-
27-
// CHECKDSO: Name: .got.plt
28-
// CHECKDSO-NEXT: Type: SHT_PROGBITS
29-
// CHECKDSO-NEXT: Flags [
30-
// CHECKDSO-NEXT: SHF_ALLOC
31-
// CHECKDSO-NEXT: SHF_WRITE
32-
// CHECKDSO-NEXT: ]
33-
// CHECKDSO-NEXT: Address: 0x30450
34-
// CHECKDSO-NEXT: Offset:
35-
// CHECKDSO-NEXT: Size: 48
36-
// CHECKDSO-NEXT: Link:
37-
// CHECKDSO-NEXT: Info:
38-
// CHECKDSO-NEXT: AddressAlignment: 8
39-
40-
// CHECKDSO: Relocations [
41-
// CHECKDSO-NEXT: Section ({{.*}}) .rela.plt {
42-
43-
// &(.got.plt[3]) = 0x30450 + 3 * 8 = 0x30468
44-
// CHECKDSO-NEXT: 0x30468 R_AARCH64_JUMP_SLOT foo
45-
46-
// &(.got.plt[4]) = 0x30450 + 4 * 8 = 0x30470
47-
// CHECKDSO-NEXT: 0x30470 R_AARCH64_JUMP_SLOT bar
48-
49-
// &(.got.plt[5]) = 0x30000 + 5 * 8 = 0x30470
50-
// CHECKDSO-NEXT: 0x30478 R_AARCH64_JUMP_SLOT weak
51-
// CHECKDSO-NEXT: }
52-
// CHECKDSO-NEXT: ]
14+
// CHECKDSO-LABEL: Section Headers:
15+
/// Name Type Address Off Size ES Flg Lk Inf Al
16+
// CHECKDSO: .plt PROGBITS 0000000000010340 000340 000050 00 AXy 0 0 16
17+
// CHECKDSO: .got.plt PROGBITS 0000000000030450 000450 000030 00 WA 0 0 8
18+
19+
// CHECKDSO-LABEL: Relocation section '.rela.plt' at offset 0x2e8 contains 3 entries:
20+
// CHECKDSO-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
21+
/// &(.got.plt[3]) = 0x30450 + 3 * 8 = 0x30468
22+
// CHECKDSO-NEXT: 0000000000030468 0000000400000402 R_AARCH64_JUMP_SLOT 000000000001033c foo + 0
23+
/// &(.got.plt[4]) = 0x30450 + 4 * 8 = 0x30470
24+
// CHECKDSO-NEXT: 0000000000030470 0000000100000402 R_AARCH64_JUMP_SLOT 0000000000000000 bar + 0
25+
/// &(.got.plt[5]) = 0x30000 + 5 * 8 = 0x30478
26+
// CHECKDSO-NEXT: 0000000000030478 0000000200000402 R_AARCH64_JUMP_SLOT 0000000000000000 weak + 0
5327

5428
// DUMPDSO: Contents of section .got.plt:
5529
// .got.plt[0..2] = 0 (reserved)
@@ -106,42 +80,17 @@
10680
// DISASMDSO-NEXT: 10388: add x16, x16, #0x478
10781
// DISASMDSO-NEXT: 1038c: br x17
10882

109-
// CHECKEXE: Name: .plt
110-
// CHECKEXE-NEXT: Type: SHT_PROGBITS
111-
// CHECKEXE-NEXT: Flags [
112-
// CHECKEXE-NEXT: SHF_ALLOC
113-
// CHECKEXE-NEXT: SHF_EXECINSTR
114-
// CHECKEXE-NEXT: ]
115-
// CHECKEXE-NEXT: Address: 0x2102E0
116-
// CHECKEXE-NEXT: Offset:
117-
// CHECKEXE-NEXT: Size: 64
118-
// CHECKEXE-NEXT: Link:
119-
// CHECKEXE-NEXT: Info:
120-
// CHECKEXE-NEXT: AddressAlignment: 16
121-
122-
// CHECKEXE: Name: .got.plt
123-
// CHECKEXE-NEXT: Type: SHT_PROGBITS
124-
// CHECKEXE-NEXT: Flags [
125-
// CHECKEXE-NEXT: SHF_ALLOC
126-
// CHECKEXE-NEXT: SHF_WRITE
127-
// CHECKEXE-NEXT: ]
128-
// CHECKEXE-NEXT: Address: 0x2303F0
129-
// CHECKEXE-NEXT: Offset:
130-
// CHECKEXE-NEXT: Size: 40
131-
// CHECKEXE-NEXT: Link:
132-
// CHECKEXE-NEXT: Info:
133-
// CHECKEXE-NEXT: AddressAlignment: 8
134-
135-
// CHECKEXE: Relocations [
136-
// CHECKEXE-NEXT: Section ({{.*}}) .rela.plt {
137-
138-
// &(.got.plt[3]) = 0x2303f0 + 3 * 8 = 0x230408
139-
// CHECKEXE-NEXT: 0x230408 R_AARCH64_JUMP_SLOT bar 0x0
140-
141-
// &(.got.plt[4]) = 0x2303f0 + 4 * 8 = 0x230410
142-
// CHECKEXE-NEXT: 0x230410 R_AARCH64_JUMP_SLOT weak 0x0
143-
// CHECKEXE-NEXT: }
144-
// CHECKEXE-NEXT: ]
83+
// CHECKEXE-LABEL: Section Headers:
84+
/// Name Type Address Off Size ES Flg Lk Inf Al
85+
// CHECKEXE: .plt PROGBITS 00000000002102e0 0002e0 000040 00 AXy 0 0 16
86+
// CHECKEXE: .got.plt PROGBITS 00000000002303f0 0003f0 000028 00 WA 0 0 8
87+
88+
// CHECKEXE-LABEL: Relocation section '.rela.plt' at offset 0x298 contains 2 entries:
89+
// CHECKEXE-NEXT: Offset Info Type Symbol's Value Symbol's Name + Addend
90+
/// &(.got.plt[3]) = 0x2303f0 + 3 * 8 = 0x230408
91+
// CHECKEXE-NEXT: 0000000000230408 0000000100000402 R_AARCH64_JUMP_SLOT 0000000000000000 bar + 0
92+
/// &(.got.plt[4]) = 0x2303f0 + 4 * 8 = 0x230410
93+
// CHECKEXE-NEXT: 0000000000230410 0000000200000402 R_AARCH64_JUMP_SLOT 0000000000000000 weak + 0
14594

14695
// DUMPEXE: Contents of section .got.plt:
14796
// .got.plt[0..2] = 0 (reserved)

0 commit comments

Comments
 (0)