483 lines · plain
1// REQUIRES: aarch642// RUN: rm -rf %t && split-file %s %t && cd %t3// RUN: llvm-mc -filetype=obj -triple=aarch64 asm -o a.o4// RUN: ld.lld --shared --script=lds a.o -o out.so --defsym absolute=0xf00000005// RUN: llvm-objdump -d --no-show-raw-insn out.so | FileCheck %s6// RUN: llvm-objdump -d --no-show-raw-insn out.so | FileCheck %s --check-prefix=CHECK-PADS7// RUN: llvm-mc -filetype=obj -triple=aarch64 shared -o shared.o8// RUN: ld.lld --shared -o shared.so shared.o9// RUN: ld.lld shared.so --script=lds a.o -o exe --defsym absolute=0xf000000010// RUN: llvm-objdump -d --no-show-raw-insn exe | FileCheck %s --check-prefix=CHECK-EXE11// RUN: llvm-objdump -d --no-show-raw-insn exe | FileCheck %s --check-prefix=CHECK-PADS12 13/// Test thunk generation when destination does not have a BTI compatible14/// landing pad. Linker must generate landing pad sections for thunks that use15/// indirect branches.16 17//--- asm18.section ".note.gnu.property", "a"19.p2align 320.long 421.long 0x1022.long 0x523.asciz "GNU"24 25/// Enable BTI.26.long 0xc0000000 // GNU_PROPERTY_AARCH64_FEATURE_1_AND.27.long 428.long 1 // GNU_PROPERTY_AARCH64_FEATURE_1_BTI.29.long 030 31 32/// Short thunks are direct branches so we don't need landing pads. Expect33/// all thunks to branch directly to target.34.section .text.0, "ax", %progbits35.balign 0x100036.global _start37.type _start, %function38_start:39 bl bti_c_target40 bl bti_j_target41 bl bti_jc_target42 bl paciasp_target43 bl pacibsp_target44 bl .text.2 + 0x4 // fn245 b .text.2 + 0x4 // fn246 bl fn147 b fn148 bl fn349 b fn350 bl fn451 b fn452 bl via_plt53/// We cannot add landing pads for absolute symbols.54 bl absolute55/// padding so that we require thunks that can be placed after this section.56/// The thunks are close enough to the target to be short.57 .balign 858 .space 0x100059 60// CHECK-PADS-LABEL: <_start>:61// CHECK-PADS-NEXT: 10001000: bl 0x1000204062// CHECK-PADS-NEXT: bl 0x1000204463// CHECK-PADS-NEXT: bl 0x1000204864// CHECK-PADS-NEXT: bl 0x1000204c65// CHECK-PADS-NEXT: bl 0x1000205066// CHECK-PADS-NEXT: bl 0x1000205467// CHECK-PADS-NEXT: b 0x1000205468// CHECK-PADS-NEXT: bl 0x1000205869// CHECK-PADS-NEXT: b 0x1000205870// CHECK-PADS-NEXT: bl 0x1000205c71// CHECK-PADS-NEXT: b 0x1000205c72// CHECK-PADS-NEXT: bl 0x1000206073// CHECK-PADS-NEXT: b 0x1000206074// CHECK-PADS-NEXT: bl 0x1000206475// CHECK-PADS-NEXT: bl 0x1000206876 77// CHECK-LABEL: <__AArch64ADRPThunk_>:78// CHECK-NEXT: 10002040: b 0x18001000 <bti_c_target>79 80// CHECK-LABEL: <__AArch64ADRPThunk_>:81// CHECK-NEXT: 10002044: b 0x18001008 <bti_j_target>82 83// CHECK-LABEL: <__AArch64ADRPThunk_>:84// CHECK-NEXT: 10002048: b 0x18001010 <bti_jc_target>85 86// CHECK-LABEL: <__AArch64ADRPThunk_>:87// CHECK-NEXT: 1000204c: b 0x18001018 <paciasp_target>88 89// CHECK-LABEL: <__AArch64ADRPThunk_>:90// CHECK-NEXT: 10002050: b 0x18001020 <pacibsp_target>91 92// CHECK-LABEL: <__AArch64ADRPThunk_>:93// CHECK-NEXT: 10002054: b 0x18001038 <fn2>94 95// CHECK-LABEL: <__AArch64ADRPThunk_>:96// CHECK-NEXT: 10002058: b 0x18001034 <fn1>97 98// CHECK-LABEL: <__AArch64ADRPThunk_>:99// CHECK-NEXT: 1000205c: b 0x18001040 <fn3>100 101// CHECK-LABEL: <__AArch64ADRPThunk_>:102// CHECK-NEXT: 10002060: b 0x18001050 <fn4>103 104// CHECK-LABEL: <__AArch64ADRPThunk_via_plt>:105// CHECK-NEXT: 10002064: b 0x18001080 <via_plt@plt>106 107// CHECK-LABEL: <__AArch64ADRPThunk_absolute>:108// CHECK-NEXT: 10002068: b 0x18001098 <absolute@plt>109 110// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_>:111// CHECK-EXE-NEXT: 10002040: b 0x18001000 <bti_c_target>112 113// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_>:114// CHECK-EXE-NEXT: 10002044: b 0x18001008 <bti_j_target>115 116// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_>:117// CHECK-EXE-NEXT: 10002048: b 0x18001010 <bti_jc_target>118 119// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_>:120// CHECK-EXE-NEXT: 1000204c: b 0x18001018 <paciasp_target>121 122// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_>:123// CHECK-EXE-NEXT: 10002050: b 0x18001020 <pacibsp_target>124 125// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_>:126// CHECK-EXE-NEXT: 10002054: b 0x18001038 <fn2>127 128// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_>:129// CHECK-EXE-NEXT: 10002058: b 0x18001034 <fn1>130 131// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_>:132// CHECK-EXE-NEXT: 1000205c: b 0x18001040 <fn3>133 134// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_>:135// CHECK-EXE-NEXT: 10002060: b 0x18001050 <fn4>136 137// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_via_plt>:138// CHECK-EXE-NEXT: 10002064: b 0x18001080 <via_plt@plt>139 140// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_absolute>:141// CHECK-EXE-NEXT: 10002068: ldr x16, 0x10002070 <__AArch64AbsLongThunk_absolute+0x8>142// CHECK-EXE-NEXT: br x16143// CHECK-EXE-NEXT: 00 00 00 f0 .word 0xf0000000144// CHECK-EXE-NEXT: 00 00 00 00 .word 0x00000000145 146.section .text.1, "ax", %progbits147/// These indirect branch targets already have a BTI compatible landing pad,148/// no alternative entry point required.149.hidden bti_c_target150.type bti_c_target, %function151bti_c_target:152 bti c153 ret154 155.hidden bti_j_target156.type bti_j_target, %function157bti_j_target:158 bti j159 ret160 161.hidden bti_jc_target162.type bti_jc_target, %function163bti_jc_target:164 bti jc165 ret166 167.hidden paciasp_target168.type paciasp_target, %function169paciasp_target:170 paciasp171 ret172 173.hidden pacibsp_target174.type pacibsp_target, %function175pacibsp_target:176 pacibsp177 ret178 179// CHECK-PADS-LABEL: <bti_c_target>:180// CHECK-PADS: 18001000: bti c181// CHECK-PADS-NEXT: ret182 183// CHECK-PADS-LABEL: <bti_j_target>:184// CHECK-PADS-NEXT: 18001008: bti j185// CHECK-PADS-NEXT: ret186 187// CHECK-PADS-LABEL: <bti_jc_target>:188// CHECK-PADS-NEXT: 18001010: bti jc189// CHECK-PADS-NEXT: ret190 191// CHECK-PADS-LABEL: <paciasp_target>:192// CHECK-PADS-NEXT: 18001018: paciasp193// CHECK-PADS-NEXT: ret194 195// CHECK-PADS-LABEL: <pacibsp_target>:196// CHECK-PADS-NEXT: 18001020: pacibsp197// CHECK-PADS-NEXT: ret198 199/// These functions do not have BTI compatible landing pads. Expect linker200/// generated landing pads for indirect branch thunks.201.section .text.2, "ax", %progbits202.hidden fn1203.type fn1, %function204fn1:205 ret206.hidden fn2207.type fn2, %function208fn2:209 ret210 211// CHECK-PADS-LABEL: <__AArch64BTIThunk_>:212// CHECK-PADS-NEXT: 18001028: bti c213// CHECK-PADS-NEXT: b 0x18001038 <fn2>214 215// CHECK-PADS-LABEL: <__AArch64BTIThunk_>:216// CHECK-PADS-NEXT: 18001030: bti c217 218// CHECK-PADS-LABEL: <fn1>:219// CHECK-PADS-NEXT: 18001034: ret220 221// CHECK-PADS-LABEL <fn2>:222// CHECK-PADS: 18001038: ret223 224/// Section with only one function at offset 0. Landing pad should be able to225/// fall through.226.section .text.3, "ax", %progbits227.hidden fn3228.type fn3, %function229fn3:230 ret231 232// CHECK-PADS-LABEL: <__AArch64BTIThunk_>:233// CHECK-PADS-NEXT: 1800103c: bti c234 235// CHECK-PADS-LABEL: <fn3>:236// CHECK-PADS-NEXT: 18001040: ret237 238/// Section with only one function at offset 0, also with a high alignment239/// requirement. Check that we don't fall through into alignment padding.240.section .text.4, "ax", %progbits241.hidden fn4242.type fn4, %function243.balign 16244fn4:245 ret246 247// CHECK-PADS-LABEL: <__AArch64BTIThunk_>:248// CHECK-PADS: 18001044: bti c249// CHECK-PADS-NEXT: b 0x18001050 <fn4>250// CHECK-PADS-NEXT: udf #0x0251 252// CHECK-PADS-LABEL: <fn4>:253// CHECK-PADS-NEXT: 18001050: ret254 255.section .long_calls, "ax", %progbits256.global long_calls257.type long_calls, %function258long_calls:259/// Expect thunk to target as targets have BTI or implicit BTI.260 bl bti_c_target261 bl bti_j_target262 bl bti_jc_target263 bl paciasp_target264 bl pacibsp_target265/// Expect thunk to target a linker generated entry point with BTI landing pad.266/// Two calls to make sure only one landing pad is created.267 bl .text.2 + 0x4 // fn2268 b .text.2 + 0x4 // fn2269/// fn2 before fn1 so that landing pad for fn1 can fall through.270 bl fn1271 b fn1272 bl fn3273 b fn3274 bl fn4275 b fn4276/// PLT entries reachable via Thunks have a BTI c at the start of each entry277/// so no additional landing pad required.278 bl via_plt279/// We cannot add landing pads for absolute symbols.280 bl absolute281 .balign 8282/// PLT entries have BTI at start.283// CHECK-LABEL: <via_plt@plt>:284// CHECK-NEXT: bti c285// CHECK-NEXT: adrp x16, 0x30000000286// CHECK-NEXT: ldr x17, [x16, #0x1a0]287// CHECK-NEXT: add x16, x16, #0x1a0288// CHECK-NEXT: br x17289// CHECK-NEXT: nop290 291// CHECK: <absolute@plt>:292// CHECK-NEXT: bti c293// CHECK-NEXT: adrp x16, 0x30000000294// CHECK-NEXT: ldr x17, [x16, #0x1a8]295// CHECK-NEXT: add x16, x16, #0x1a8296// CHECK-NEXT: br x17297// CHECK-NEXT: nop298 299// CHECK-EXE-LABEL: <via_plt@plt>:300// CHECK-EXE-NEXT: 18001080: bti c301// CHECK-EXE-NEXT: adrp x16, 0x30000000302// CHECK-EXE-NEXT: ldr x17, [x16, #0x1e8]303// CHECK-EXE-NEXT: add x16, x16, #0x1e8304// CHECK-EXE-NEXT: br x17305// CHECK-EXE-NEXT: nop306 307// CHECK-LABEL: <long_calls>:308// CHECK-NEXT: 30000000: bl 0x30000040 <__AArch64ADRPThunk_>309// CHECK-NEXT: bl 0x3000004c <__AArch64ADRPThunk_>310// CHECK-NEXT: bl 0x30000058 <__AArch64ADRPThunk_>311// CHECK-NEXT: bl 0x30000064 <__AArch64ADRPThunk_>312// CHECK-NEXT: bl 0x30000070 <__AArch64ADRPThunk_>313// CHECK-NEXT: bl 0x3000007c <__AArch64ADRPThunk_>314// CHECK-NEXT: b 0x3000007c <__AArch64ADRPThunk_>315// CHECK-NEXT: bl 0x30000088 <__AArch64ADRPThunk_>316// CHECK-NEXT: b 0x30000088 <__AArch64ADRPThunk_>317// CHECK-NEXT: bl 0x30000094 <__AArch64ADRPThunk_>318// CHECK-NEXT: b 0x30000094 <__AArch64ADRPThunk_>319// CHECK-NEXT: bl 0x300000a0 <__AArch64ADRPThunk_>320// CHECK-NEXT: b 0x300000a0 <__AArch64ADRPThunk_>321// CHECK-NEXT: bl 0x300000ac <__AArch64ADRPThunk_via_plt>322// CHECK-NEXT: bl 0x300000b8 <__AArch64ADRPThunk_absolute>323 324/// bti_c_target.325// CHECK-LABEL: <__AArch64ADRPThunk_>:326// CHECK-NEXT: 30000040: adrp x16, 0x18001000 <bti_c_target>327// CHECK-NEXT: add x16, x16, #0x0328// CHECK-NEXT: br x16329/// bti_j_target.330// CHECK-LABEL: <__AArch64ADRPThunk_>:331// CHECK-NEXT: adrp x16, 0x18001000 <bti_c_target>332// CHECK-NEXT: add x16, x16, #0x8333// CHECK-NEXT: br x16334/// bti_jc_target.335// CHECK-LABEL: <__AArch64ADRPThunk_>:336// CHECK-NEXT: adrp x16, 0x18001000 <bti_c_target>337// CHECK-NEXT: add x16, x16, #0x10338// CHECK-NEXT: br x16339/// paciasp_target.340// CHECK-LABEL: <__AArch64ADRPThunk_>:341// CHECK-NEXT: adrp x16, 0x18001000 <bti_c_target>342// CHECK-NEXT: add x16, x16, #0x18343// CHECK-NEXT: br x16344/// pacibsp_target.345// CHECK-LABEL: <__AArch64ADRPThunk_>:346// CHECK-NEXT: adrp x16, 0x18001000 <bti_c_target>347// CHECK-NEXT: add x16, x16, #0x20348// CHECK-NEXT: br x16349/// Landing pad for fn2.350// CHECK-LABEL: <__AArch64ADRPThunk_>:351// CHECK-NEXT: adrp x16, 0x18001000 <bti_c_target>352// CHECK-NEXT: add x16, x16, #0x28353// CHECK-NEXT: br x16354/// Landing pad for fn1.355// CHECK-LABEL: <__AArch64ADRPThunk_>:356// CHECK-NEXT: adrp x16, 0x18001000 <bti_c_target>357// CHECK-NEXT: add x16, x16, #0x30358// CHECK-NEXT: br x16359/// Landing pad for fn3.360// CHECK-LABEL: <__AArch64ADRPThunk_>:361// CHECK-NEXT: adrp x16, 0x18001000 <bti_c_target>362// CHECK-NEXT: add x16, x16, #0x3c363// CHECK-NEXT: br x16364/// Landing pad for fn4.365// CHECK-LABEL: <__AArch64ADRPThunk_>:366// CHECK-NEXT: adrp x16, 0x18001000 <bti_c_target>367// CHECK-NEXT: add x16, x16, #0x44368// CHECK-NEXT: br x16369 370// CHECK-LABEL: <__AArch64ADRPThunk_via_plt>:371// CHECK-NEXT: adrp x16, 0x18001000 <bti_c_target>372// CHECK-NEXT: add x16, x16, #0x80373// CHECK-NEXT: br x16374 375// CHECK-LABEL: <__AArch64ADRPThunk_absolute>:376// CHECK-NEXT: adrp x16, 0x18001000 <bti_c_target>377// CHECK-NEXT: add x16, x16, #0x98378// CHECK-NEXT: br x16379 380// CHECK-EXE-LABEL: <long_calls>:381// CHECK-EXE-NEXT: 30000000: bl 0x30000040 <__AArch64AbsLongThunk_>382// CHECK-EXE-NEXT: bl 0x30000050 <__AArch64AbsLongThunk_>383// CHECK-EXE-NEXT: bl 0x30000060 <__AArch64AbsLongThunk_>384// CHECK-EXE-NEXT: bl 0x30000070 <__AArch64AbsLongThunk_>385// CHECK-EXE-NEXT: bl 0x30000080 <__AArch64AbsLongThunk_>386// CHECK-EXE-NEXT: bl 0x30000090 <__AArch64AbsLongThunk_>387// CHECK-EXE-NEXT: b 0x30000090 <__AArch64AbsLongThunk_>388// CHECK-EXE-NEXT: bl 0x300000a0 <__AArch64AbsLongThunk_>389// CHECK-EXE-NEXT: b 0x300000a0 <__AArch64AbsLongThunk_>390// CHECK-EXE-NEXT: bl 0x300000b0 <__AArch64AbsLongThunk_>391// CHECK-EXE-NEXT: b 0x300000b0 <__AArch64AbsLongThunk_>392// CHECK-EXE-NEXT: bl 0x300000c0 <__AArch64AbsLongThunk_>393// CHECK-EXE-NEXT: b 0x300000c0 <__AArch64AbsLongThunk_>394// CHECK-EXE-NEXT: bl 0x300000d0 <__AArch64AbsLongThunk_via_plt>395// CHECK-EXE-NEXT: bl 0x300000e0 <__AArch64AbsLongThunk_absolute>396 397// CHECK-EXE-LABEL: 0000000030000040 <__AArch64AbsLongThunk_>:398// CHECK-EXE-NEXT: 30000040: ldr x16, 0x30000048 <__AArch64AbsLongThunk_+0x8>399// CHECK-EXE-NEXT: br x16400// CHECK-EXE-NEXT: 00 10 00 18 .word 0x18001000401// CHECK-EXE-NEXT: 00 00 00 00 .word 0x00000000402 403// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_>:404// CHECK-EXE-NEXT: 30000050: ldr x16, 0x30000058 <__AArch64AbsLongThunk_+0x8>405// CHECK-EXE-NEXT: br x16406// CHECK-EXE-NEXT: 08 10 00 18 .word 0x18001008407// CHECK-EXE-NEXT: 00 00 00 00 .word 0x00000000408 409// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_>:410// CHECK-EXE-NEXT: 30000060: ldr x16, 0x30000068 <__AArch64AbsLongThunk_+0x8>411// CHECK-EXE-NEXT: br x16412// CHECK-EXE-NEXT: 10 10 00 18 .word 0x18001010413// CHECK-EXE-NEXT: 00 00 00 00 .word 0x00000000414 415// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_>:416// CHECK-EXE-NEXT: 30000070: ldr x16, 0x30000078 <__AArch64AbsLongThunk_+0x8>417// CHECK-EXE-NEXT: br x16418// CHECK-EXE-NEXT: 18 10 00 18 .word 0x18001018419// CHECK-EXE-NEXT: 00 00 00 00 .word 0x00000000420 421// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_>:422// CHECK-EXE-NEXT: 30000080: ldr x16, 0x30000088 <__AArch64AbsLongThunk_+0x8>423// CHECK-EXE-NEXT: br x16424// CHECK-EXE-NEXT: 20 10 00 18 .word 0x18001020425// CHECK-EXE-NEXT: 00 00 00 00 .word 0x00000000426 427// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_>:428// CHECK-EXE-NEXT: 30000090: ldr x16, 0x30000098 <__AArch64AbsLongThunk_+0x8>429// CHECK-EXE-NEXT: br x16430// CHECK-EXE-NEXT: 28 10 00 18 .word 0x18001028431// CHECK-EXE-NEXT: 00 00 00 00 .word 0x00000000432 433// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_>:434// CHECK-EXE-NEXT: 300000a0: ldr x16, 0x300000a8 <__AArch64AbsLongThunk_+0x8>435// CHECK-EXE-NEXT: br x16436// CHECK-EXE-NEXT: 30 10 00 18 .word 0x18001030437// CHECK-EXE-NEXT: 00 00 00 00 .word 0x00000000438 439// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_>:440// CHECK-EXE-NEXT: 300000b0: ldr x16, 0x300000b8 <__AArch64AbsLongThunk_+0x8>441// CHECK-EXE-NEXT: br x16442// CHECK-EXE-NEXT: 3c 10 00 18 .word 0x1800103c443// CHECK-EXE-NEXT: 00 00 00 00 .word 0x00000000444 445// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_>:446// CHECK-EXE-NEXT: 300000c0: ldr x16, 0x300000c8 <__AArch64AbsLongThunk_+0x8>447// CHECK-EXE-NEXT: br x16448// CHECK-EXE-NEXT: 44 10 00 18 .word 0x18001044449// CHECK-EXE-NEXT: 00 00 00 00 .word 0x00000000450 451// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_via_plt>:452// CHECK-EXE-NEXT: 300000d0: ldr x16, 0x300000d8 <__AArch64AbsLongThunk_via_plt+0x8>453// CHECK-EXE-NEXT: br x16454// CHECK-EXE-NEXT: 80 10 00 18 .word 0x18001080455// CHECK-EXE-NEXT: 00 00 00 00 .word 0x00000000456 457// CHECK-EXE-LABEL: <__AArch64AbsLongThunk_absolute>:458// CHECK-EXE-NEXT: 300000e0: ldr x16, 0x300000e8 <__AArch64AbsLongThunk_absolute+0x8>459// CHECK-EXE-NEXT: br x16460// CHECK-EXE-NEXT: 00 00 00 f0 .word 0xf0000000461// CHECK-EXE-NEXT: 00 00 00 00 .word 0x00000000462 463//--- lds464PHDRS {465 low PT_LOAD FLAGS(0x1 | 0x4);466 mid PT_LOAD FLAGS(0x1 | 0x4);467 high PT_LOAD FLAGS(0x1 | 0x4);468}469SECTIONS {470 .rodata 0x10000000 : { *(.note.gnu.property) } :low471 .text_low : { *(.text.0) } :low472 .text 0x18001000 : { *(.text.*) } :mid473 .plt : { *(.plt) } :mid474 .text_high 0x30000000 : { *(.long_calls) } :high475}476 477//--- shared478.text479.global via_plt480.type via_plt, %function481via_plt:482 ret483