llvm-project/lld/test/ELF/gnu-ifunc-canon.s

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

84 lines
3.3 KiB
ArmAsm
Raw Normal View History

// REQUIRES: x86
// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o
// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %S/Inputs/gnu-ifunc-canon-ro-pcrel.s -o %t-ro-pcrel.o
// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %S/Inputs/gnu-ifunc-canon-ro-abs.s -o %t-ro-abs.o
// RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %S/Inputs/gnu-ifunc-canon-rw-addend.s -o %t-rw-addend.o
// RUN: ld.lld %t.o -o %t1
// RUN: llvm-readobj -r %t1 | FileCheck --check-prefix=IREL1 %s
// RUN: ld.lld %t.o %t-ro-pcrel.o -o %t2
// RUN: llvm-readobj -r %t2 | FileCheck --check-prefix=IREL1 %s
// RUN: ld.lld %t.o %t-ro-abs.o -o %t3
// RUN: llvm-readobj -r %t3 | FileCheck --check-prefix=IREL1 %s
// RUN: ld.lld %t.o %t-rw-addend.o -o %t4
// RUN: llvm-readobj -r %t4 | FileCheck --check-prefix=IREL1 %s
// RUN: llvm-objdump -s %t4 | FileCheck --check-prefix=DUMP %s
// RUN: ld.lld %t.o %t-rw-addend.o -o %t4a -z retpolineplt
// RUN: llvm-readobj -r %t4a | FileCheck --check-prefix=IREL1 %s
// RUN: llvm-objdump -s %t4a | FileCheck --check-prefix=DUMP2 %s
// RUN: ld.lld %t-ro-pcrel.o %t.o -o %t5
// RUN: llvm-readobj -r %t5 | FileCheck --check-prefix=IREL1 %s
// RUN: ld.lld %t-ro-abs.o %t.o -o %t6
// RUN: llvm-readobj -r %t6 | FileCheck --check-prefix=IREL1 %s
// RUN: ld.lld %t-rw-addend.o %t.o -o %t7
// RUN: llvm-readobj -r %t7 | FileCheck --check-prefix=IREL1 %s
// RUN: ld.lld %t.o -o %t8 -pie
// RUN: llvm-readobj -r %t8 | FileCheck --check-prefix=IREL1-REL2 %s
// RUN: ld.lld %t.o %t-ro-pcrel.o -o %t9 -pie
// RUN: llvm-readobj -r %t9 | FileCheck --check-prefix=IREL1-REL2 %s
// RUN: ld.lld %t.o %t-rw-addend.o -o %t10 -pie
// RUN: llvm-readobj -r %t10 | FileCheck --check-prefix=IREL1-REL3 %s
// RUN: ld.lld %t-ro-pcrel.o %t.o -o %t11 -pie
// RUN: llvm-readobj -r %t11 | FileCheck --check-prefix=IREL1-REL2 %s
// RUN: ld.lld %t-rw-addend.o %t.o -o %t12 -pie
// RUN: llvm-readobj -r %t12 | FileCheck --check-prefix=IREL1-REL3 %s
// One reloc for the canonical PLT.
// IREL1-NOT: R_X86_64_
[ELF] Move R_*_IRELATIVE from .rel[a].plt to .rel[a].dyn unless --pack-dyn-relocs=android[+relr] An R_*_IRELATIVE represents the address of a STT_GNU_IFUNC symbol (redirected at runtime) which is non-preemptable and is not associated with a canonical PLT (associated with a symbol with a section index of SHN_UNDEF but a non-zero st_value). .rel[a].plt [DT_JMPREL, DT_JMPREL+DT_JMPRELSZ) contains relocations that can be lazily resolved. R_*_IRELATIVE are always eagerly resolved, so conceptually they do not belong to .rela.plt. "iplt" is mostly a misnomer. glibc powerpc and powerpc64 do not resolve R_*_IRELATIVE if they are in .rela.plt. // a.o - synthesized PLT call stub has an R_*_IRELATIVE void ifunc(); int main() { ifunc(); } // b.o static void real() {} asm (".type ifunc, %gnu_indirect_function"); void *ifunc() { return ℜ } The lld-linked executable crashes. ld.bfd places R_*_IRELATIVE in .rela.dyn and the executable works. glibc i386, x86_64, and aarch64 have logic (glibc/sysdeps/*/dl-machine.h:elf_machine_lazy_rel) to eagerly resolve R_*_IRELATIVE in .rel[a].plt so the lld-linked executable works. Move R_*_IRELATIVE from .rel[a].plt to .rel[a].dyn to fix the crashes on glibc powerpc/powerpc64. This also helps simplifying ifunc implementation in FreeBSD rtld-elf powerpc64. If --pack-dyn-relocs=android[+relr] is specified, the Android packed dynamic relocation format is used for .rela.dyn. We cannot name in.relaIplt ".rela.dyn" because the output section will have mixed formats. This can be improved in the future. Reviewed By: pcc Differential Revision: https://reviews.llvm.org/D65651 llvm-svn: 367745
2019-08-03 10:26:52 +08:00
// IREL1: .rela.dyn
// IREL1-NEXT: R_X86_64_IRELATIVE
// IREL1-NOT: R_X86_64_
// One reloc for the canonical PLT and two RELATIVE relocations pointing to it,
// one in the GOT and one in .data.
// IREL1-REL2-NOT: R_X86_64_
// IREL1-REL2: .rela.dyn
// IREL1-REL2-NEXT: R_X86_64_RELATIVE
// IREL1-REL2-NEXT: R_X86_64_RELATIVE
// IREL1-REL2-NEXT: R_X86_64_IRELATIVE
// IREL1-REL2-NOT: R_X86_64_
// One reloc for the canonical PLT and three RELATIVE relocations pointing to it,
// one in the GOT and two in .data.
// IREL1-REL3-NOT: R_X86_64_
// IREL1-REL3: .rela.dyn
// IREL1-REL3-NEXT: R_X86_64_RELATIVE
// IREL1-REL3-NEXT: R_X86_64_RELATIVE
// IREL1-REL3-NEXT: R_X86_64_RELATIVE
// IREL1-REL3-NEXT: R_X86_64_IRELATIVE
// IREL1-REL3-NOT: R_X86_64_
// Make sure the static relocations look right, both with and without headers.
// DUMP: Contents of section .iplt:
// DUMP-NEXT: 2011f0
// DUMP: Contents of section .got:
// DUMP-NEXT: 202200 f0112000 00000000
// DUMP: Contents of section .data:
// DUMP-NEXT: 203208 f0112000 00000000 f1112000 00000000
// DUMP2: Contents of section .plt:
// DUMP2-NEXT: 2011f0
// DUMP2: Contents of section .got:
// DUMP2-NEXT: 202240 20122000 00000000
// DUMP2: Contents of section .data:
// DUMP2-NEXT: 203248 20122000 00000000 21122000 00000000
lea ifunc@gotpcrel(%rip), %rbx
.type ifunc STT_GNU_IFUNC
.globl ifunc
ifunc:
ret
.data
.8byte ifunc