summaryrefslogtreecommitdiff
path: root/test/old-elf/ifunc.test
diff options
context:
space:
mode:
Diffstat (limited to 'test/old-elf/ifunc.test')
-rw-r--r--test/old-elf/ifunc.test69
1 files changed, 69 insertions, 0 deletions
diff --git a/test/old-elf/ifunc.test b/test/old-elf/ifunc.test
new file mode 100644
index 0000000000000..0aa317a24e6f8
--- /dev/null
+++ b/test/old-elf/ifunc.test
@@ -0,0 +1,69 @@
+# REQUIRES: x86
+
+# This test checks that IRELATIVE relocations are created for symbols that
+# need relocation even for static links.
+RUN: lld -flavor old-gnu -target x86_64-linux --output-filetype=yaml -r \
+RUN: %p/Inputs/ifunc.x86-64 | FileCheck %s
+
+RUN: lld -flavor old-gnu -target x86_64-linux --output-filetype=yaml --noinhibit-exec \
+RUN: %p/Inputs/ifunc.x86-64 %p/Inputs/ifunc.cpp.x86-64 \
+RUN: | FileCheck %s --check-prefix=PLT
+
+RUN: lld -flavor old-gnu -target x86_64-linux -o %t %p/Inputs/ifunc.x86-64 \
+RUN: -e main -static %p/Inputs/ifunc.cpp.x86-64
+RUN: llvm-objdump -d -s %t| FileCheck %s --check-prefix=BIN
+RUN: llvm-readobj -r %t | FileCheck %s --check-prefix=RELATIVEADDEND
+
+# Test that STT_GNU_IFUNC symbols have type Code in SharedLibraryAtom.
+RUN: lld -flavor old-gnu -target x86_64-linux --output-filetype=yaml \
+RUN: --noinhibit-exec %p/Inputs/ifunc.cpp.x86-64 -L%p/Inputs -lifunc.x86-64 \
+RUN: | FileCheck %s --check-prefix=SHARED
+
+PLT: defined-atoms:
+
+PLT: name: plt
+PLT: scope: global
+PLT: references:
+PLT: kind: R_X86_64_PC32
+PLT: target: [[PLTNAME:[-a-zA-Z0-9_]+]]
+
+PLT: name: main
+PLT: scope: global
+PLT: references:
+PLT: kind: R_X86_64_PC32
+PLT: target: [[PLTNAME]]
+
+// Make sure the target of main's relocation is a stub with a PC32 relocation.
+// This relocation is to the got atom, but you can't really write that check in
+// FileCheck.
+PLT: name:
+PLT: type: stub
+PLT: references
+PLT: kind: R_X86_64_PC32
+
+// Make sure there's a got entry with a IRELATIVE relocation.
+PLT: type: got
+PLT: references:
+PLT: kind: R_X86_64_IRELATIVE
+PLT: target: hey
+
+CHECK: name: hey
+CHECK: scope: global
+CHECK: type: resolver
+
+
+// This is a horribly brittle test. We need a way to do arithmetic on captured
+// variables.
+BIN: {{[0-9a-f]+}}: ff 25 {{[0-9a-f]+}} {{[0-9a-f]+}} 00 00 jmpq *{{[0-9]+}}(%rip)
+BIN: .got.plt:
+BIN-NEXT: {{[0-9a-f]+}} 00000000 00000000
+
+RELATIVEADDEND: Relocations [
+RELATIVEADDEND-NEXT: Section (1) .rela.plt {
+RELATIVEADDEND-NEXT: 0x401000 R_X86_64_IRELATIVE - 0x400110
+RELATIVEADDEND-NEXT: }
+RELATIVEADDEND-NEXT: ]
+
+SHARED: shared-library-atoms
+SHARED: name: hey
+SHARED-NOT: data