Skip to content

Commit 69b8d6d

Browse files
authored
[LLD][COFF] Fix tailMergeARM64 delayload thunk 128 MB range limitation (#161844)
lld would fail with "error: relocation out of range" if the thunk was laid out more than 128 MB away from __delayLoadHelper2. This patch changes the call sequence to load the offset into a register and call through that, allowing for 32-bit offsets. Fixes #161812
1 parent b4f54bf commit 69b8d6d

File tree

3 files changed

+49
-39
lines changed

3 files changed

+49
-39
lines changed

lld/COFF/DLL.cpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -333,7 +333,9 @@ static const uint8_t tailMergeARM64[] = {
333333
0xe1, 0x03, 0x11, 0xaa, // mov x1, x17
334334
0x00, 0x00, 0x00, 0x90, // adrp x0, #0 DELAY_IMPORT_DESCRIPTOR
335335
0x00, 0x00, 0x00, 0x91, // add x0, x0, #0 :lo12:DELAY_IMPORT_DESCRIPTOR
336-
0x00, 0x00, 0x00, 0x94, // bl #0 __delayLoadHelper2
336+
0x02, 0x00, 0x00, 0x90, // adrp x2, #0 __delayLoadHelper2
337+
0x42, 0x00, 0x00, 0x91, // add x2, x2, #0 :lo12:__delayLoadHelper2
338+
0x40, 0x00, 0x3f, 0xd6, // blr x2
337339
0xf0, 0x03, 0x00, 0xaa, // mov x16, x0
338340
0xe6, 0x9f, 0x45, 0xad, // ldp q6, q7, [sp, #176]
339341
0xe4, 0x97, 0x44, 0xad, // ldp q4, q5, [sp, #144]
@@ -556,8 +558,10 @@ class TailMergeChunkARM64 : public NonSectionCodeChunk {
556558
memcpy(buf, tailMergeARM64, sizeof(tailMergeARM64));
557559
applyArm64Addr(buf + 44, desc->getRVA(), rva + 44, 12);
558560
applyArm64Imm(buf + 48, desc->getRVA() & 0xfff, 0);
559-
if (helper)
560-
applyArm64Branch26(buf + 52, helper->getRVA() - rva - 52);
561+
if (helper) {
562+
applyArm64Addr(buf + 52, helper->getRVA(), rva + 52, 12);
563+
applyArm64Imm(buf + 56, helper->getRVA() & 0xfff, 0);
564+
}
561565
}
562566

563567
Chunk *desc = nullptr;

lld/test/COFF/arm64-delayimport.yaml

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,20 @@
2121
# DISASM: 140001048: aa1103e1 mov x1, x17
2222
# DISASM: 14000104c: b0000000 adrp x0, 0x140002000
2323
# DISASM: 140001050: 91000000 add x0, x0, #0
24-
# DISASM: 140001054: 97ffffeb bl 0x140001000 <.text>
25-
# DISASM: 140001058: aa0003f0 mov x16, x0
26-
# DISASM: 14000105c: ad459fe6 ldp q6, q7, [sp, #176]
27-
# DISASM: 140001060: ad4497e4 ldp q4, q5, [sp, #144]
28-
# DISASM: 140001064: ad438fe2 ldp q2, q3, [sp, #112]
29-
# DISASM: 140001068: ad4287e0 ldp q0, q1, [sp, #80]
30-
# DISASM: 14000106c: a9441fe6 ldp x6, x7, [sp, #64]
31-
# DISASM: 140001070: a94317e4 ldp x4, x5, [sp, #48]
32-
# DISASM: 140001074: a9420fe2 ldp x2, x3, [sp, #32]
33-
# DISASM: 140001078: a94107e0 ldp x0, x1, [sp, #16]
34-
# DISASM: 14000107c: a8cd7bfd ldp x29, x30, [sp], #208
35-
# DISASM: 140001080: d61f0200 br x16
24+
# DISASM: 140001054: 90000002 adrp x2, 0x140001000 <.text>
25+
# DISASM: 140001058: 91000042 add x2, x2, #0
26+
# DISASM: 14000105c: d63f0040 blr x2
27+
# DISASM: 140001060: aa0003f0 mov x16, x0
28+
# DISASM: 140001064: ad459fe6 ldp q6, q7, [sp, #176]
29+
# DISASM: 140001068: ad4497e4 ldp q4, q5, [sp, #144]
30+
# DISASM: 14000106c: ad438fe2 ldp q2, q3, [sp, #112]
31+
# DISASM: 140001070: ad4287e0 ldp q0, q1, [sp, #80]
32+
# DISASM: 140001074: a9441fe6 ldp x6, x7, [sp, #64]
33+
# DISASM: 140001078: a94317e4 ldp x4, x5, [sp, #48]
34+
# DISASM: 14000107c: a9420fe2 ldp x2, x3, [sp, #32]
35+
# DISASM: 140001080: a94107e0 ldp x0, x1, [sp, #16]
36+
# DISASM: 140001084: a8cd7bfd ldp x29, x30, [sp], #208
37+
# DISASM: 140001088: d61f0200 br x16
3638

3739
# IMPORTS: Format: COFF-ARM64
3840
# IMPORTS: Arch: aarch64

lld/test/COFF/arm64x-delayimport.test

Lines changed: 28 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -74,18 +74,20 @@ DISASM-NEXT: 180001044: ad059fe6 stp q6, q7, [sp, #0xb0]
7474
DISASM-NEXT: 180001048: aa1103e1 mov x1, x17
7575
DISASM-NEXT: 18000104c: f0000000 adrp x0, 0x180004000
7676
DISASM-NEXT: 180001050: 910d2000 add x0, x0, #0x348
77-
DISASM-NEXT: 180001054: 97ffffeb bl 0x180001000 <.text>
78-
DISASM-NEXT: 180001058: aa0003f0 mov x16, x0
79-
DISASM-NEXT: 18000105c: ad459fe6 ldp q6, q7, [sp, #0xb0]
80-
DISASM-NEXT: 180001060: ad4497e4 ldp q4, q5, [sp, #0x90]
81-
DISASM-NEXT: 180001064: ad438fe2 ldp q2, q3, [sp, #0x70]
82-
DISASM-NEXT: 180001068: ad4287e0 ldp q0, q1, [sp, #0x50]
83-
DISASM-NEXT: 18000106c: a9441fe6 ldp x6, x7, [sp, #0x40]
84-
DISASM-NEXT: 180001070: a94317e4 ldp x4, x5, [sp, #0x30]
85-
DISASM-NEXT: 180001074: a9420fe2 ldp x2, x3, [sp, #0x20]
86-
DISASM-NEXT: 180001078: a94107e0 ldp x0, x1, [sp, #0x10]
87-
DISASM-NEXT: 18000107c: a8cd7bfd ldp x29, x30, [sp], #0xd0
88-
DISASM-NEXT: 180001080: d61f0200 br x16
77+
DISASM-NEXT: 180001054: 90000002 adrp x2, 0x180001000 <.text>
78+
DISASM-NEXT: 180001058: 91000042 add x2, x2, #0x0
79+
DISASM-NEXT: 18000105c: d63f0040 blr x2
80+
DISASM-NEXT: 180001060: aa0003f0 mov x16, x0
81+
DISASM-NEXT: 180001064: ad459fe6 ldp q6, q7, [sp, #0xb0]
82+
DISASM-NEXT: 180001068: ad4497e4 ldp q4, q5, [sp, #0x90]
83+
DISASM-NEXT: 18000106c: ad438fe2 ldp q2, q3, [sp, #0x70]
84+
DISASM-NEXT: 180001070: ad4287e0 ldp q0, q1, [sp, #0x50]
85+
DISASM-NEXT: 180001074: a9441fe6 ldp x6, x7, [sp, #0x40]
86+
DISASM-NEXT: 180001078: a94317e4 ldp x4, x5, [sp, #0x30]
87+
DISASM-NEXT: 18000107c: a9420fe2 ldp x2, x3, [sp, #0x20]
88+
DISASM-NEXT: 180001080: a94107e0 ldp x0, x1, [sp, #0x10]
89+
DISASM-NEXT: 180001084: a8cd7bfd ldp x29, x30, [sp], #0xd0
90+
DISASM-NEXT: 180001088: d61f0200 br x16
8991
DISASM-NEXT: ...
9092
DISASM-NEXT: 180002000: 52800040 mov w0, #0x2 // =2
9193
DISASM-NEXT: 180002004: d65f03c0 ret
@@ -197,18 +199,20 @@ NATIVE-DISASM-NEXT: 180001044: ad059fe6 stp q6, q7, [sp, #0xb0]
197199
NATIVE-DISASM-NEXT: 180001048: aa1103e1 mov x1, x17
198200
NATIVE-DISASM-NEXT: 18000104c: d0000000 adrp x0, 0x180003000
199201
NATIVE-DISASM-NEXT: 180001050: 910cc000 add x0, x0, #0x330
200-
NATIVE-DISASM-NEXT: 180001054: 97ffffeb bl 0x180001000 <.text>
201-
NATIVE-DISASM-NEXT: 180001058: aa0003f0 mov x16, x0
202-
NATIVE-DISASM-NEXT: 18000105c: ad459fe6 ldp q6, q7, [sp, #0xb0]
203-
NATIVE-DISASM-NEXT: 180001060: ad4497e4 ldp q4, q5, [sp, #0x90]
204-
NATIVE-DISASM-NEXT: 180001064: ad438fe2 ldp q2, q3, [sp, #0x70]
205-
NATIVE-DISASM-NEXT: 180001068: ad4287e0 ldp q0, q1, [sp, #0x50]
206-
NATIVE-DISASM-NEXT: 18000106c: a9441fe6 ldp x6, x7, [sp, #0x40]
207-
NATIVE-DISASM-NEXT: 180001070: a94317e4 ldp x4, x5, [sp, #0x30]
208-
NATIVE-DISASM-NEXT: 180001074: a9420fe2 ldp x2, x3, [sp, #0x20]
209-
NATIVE-DISASM-NEXT: 180001078: a94107e0 ldp x0, x1, [sp, #0x10]
210-
NATIVE-DISASM-NEXT: 18000107c: a8cd7bfd ldp x29, x30, [sp], #0xd0
211-
NATIVE-DISASM-NEXT: 180001080: d61f0200 br x16
202+
NATIVE-DISASM-NEXT: 180001054: 90000002 adrp x2, 0x180001000 <.text>
203+
NATIVE-DISASM-NEXT: 180001058: 91000042 add x2, x2, #0x0
204+
NATIVE-DISASM-NEXT: 18000105c: d63f0040 blr x2
205+
NATIVE-DISASM-NEXT: 180001060: aa0003f0 mov x16, x0
206+
NATIVE-DISASM-NEXT: 180001064: ad459fe6 ldp q6, q7, [sp, #0xb0]
207+
NATIVE-DISASM-NEXT: 180001068: ad4497e4 ldp q4, q5, [sp, #0x90]
208+
NATIVE-DISASM-NEXT: 18000106c: ad438fe2 ldp q2, q3, [sp, #0x70]
209+
NATIVE-DISASM-NEXT: 180001070: ad4287e0 ldp q0, q1, [sp, #0x50]
210+
NATIVE-DISASM-NEXT: 180001074: a9441fe6 ldp x6, x7, [sp, #0x40]
211+
NATIVE-DISASM-NEXT: 180001078: a94317e4 ldp x4, x5, [sp, #0x30]
212+
NATIVE-DISASM-NEXT: 18000107c: a9420fe2 ldp x2, x3, [sp, #0x20]
213+
NATIVE-DISASM-NEXT: 180001080: a94107e0 ldp x0, x1, [sp, #0x10]
214+
NATIVE-DISASM-NEXT: 180001084: a8cd7bfd ldp x29, x30, [sp], #0xd0
215+
NATIVE-DISASM-NEXT: 180001088: d61f0200 br x16
212216

213217
RUN: llvm-readobj --coff-load-config out-native.dll | FileCheck --check-prefix=NATIVE-LOADCFG %s
214218
NATIVE-LOADCFG: AuxiliaryDelayloadIAT: 0x4000

0 commit comments

Comments
 (0)