aboutsummaryrefslogtreecommitdiff
path: root/ld/testsuite/ld-ifunc
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2015-08-18 09:47:59 -0700
committerH.J. Lu <hjl.tools@gmail.com>2015-08-18 09:50:08 -0700
commitcae1fbbb7e3d770702a0d7a5027b46835e6adc13 (patch)
tree892f4044f4c7e0e5bcd830f51fa7b0728e63050f /ld/testsuite/ld-ifunc
parent2b4bf6afd4506165007c0e76bc7c4381031cfaf6 (diff)
downloadgdb-cae1fbbb7e3d770702a0d7a5027b46835e6adc13.zip
gdb-cae1fbbb7e3d770702a0d7a5027b46835e6adc13.tar.gz
gdb-cae1fbbb7e3d770702a0d7a5027b46835e6adc13.tar.bz2
Return reloc_class_ifunc for reloc against IFUNC
elf_XXX_reloc_type_class should return reloc_class_ifunc for relocation against STT_GNU_IFUNC symbol. bfd/ PR ld/18841 * elf-bfd.h (elf_link_hash_table): Add dynsym. * elf32-i386.c (elf_i386_reloc_type_class): Return reloc_class_ifunc for relocation against STT_GNU_IFUNC symbol. * elf64-x86-64.c (elf_x86_64_reloc_type_class): Likewise. * elflink.c (_bfd_elf_link_create_dynamic_sections): Set dynsym. (bfd_elf_size_dynsym_hash_dynstr): Use dynsym. (elf_final_link_info): Remove dynsym_sec. (elf_link_output_extsym): Replace dynsym_sec with dynsym. (bfd_elf_final_link): Remove reference to dynsym_sec. Replace dynsym_sec with dynsym. ld/testsuite/ PR ld/18841 * ld-ifunc/ifunc.exp: Add a test for PR ld/18841. * ld-ifunc/pr18841.out: New file. * ld-ifunc/pr18841a.c: Likewise. * ld-ifunc/pr18841b.c: Likewise.
Diffstat (limited to 'ld/testsuite/ld-ifunc')
-rw-r--r--ld/testsuite/ld-ifunc/ifunc.exp16
-rw-r--r--ld/testsuite/ld-ifunc/pr18841.out1
-rw-r--r--ld/testsuite/ld-ifunc/pr18841a.c12
-rw-r--r--ld/testsuite/ld-ifunc/pr18841b.c21
4 files changed, 50 insertions, 0 deletions
diff --git a/ld/testsuite/ld-ifunc/ifunc.exp b/ld/testsuite/ld-ifunc/ifunc.exp
index 498cb2d..b0f6de0 100644
--- a/ld/testsuite/ld-ifunc/ifunc.exp
+++ b/ld/testsuite/ld-ifunc/ifunc.exp
@@ -472,6 +472,14 @@ run_cc_link_tests [list \
{} \
"libpr18808.so" \
] \
+ [list \
+ "Build libpr18841.so" \
+ "-shared" \
+ "-fPIC -O0 -g" \
+ { pr18841b.c } \
+ {} \
+ "libpr18841.so" \
+ ] \
]
run_ld_link_exec_tests [] [list \
@@ -483,4 +491,12 @@ run_ld_link_exec_tests [] [list \
"pr18808" \
"pr18808.out" \
] \
+ [list \
+ "Run pr18841" \
+ "tmpdir/libpr18841.so" \
+ "" \
+ { pr18841a.c } \
+ "pr18841" \
+ "pr18841.out" \
+ ] \
]
diff --git a/ld/testsuite/ld-ifunc/pr18841.out b/ld/testsuite/ld-ifunc/pr18841.out
new file mode 100644
index 0000000..d86bac9
--- /dev/null
+++ b/ld/testsuite/ld-ifunc/pr18841.out
@@ -0,0 +1 @@
+OK
diff --git a/ld/testsuite/ld-ifunc/pr18841a.c b/ld/testsuite/ld-ifunc/pr18841a.c
new file mode 100644
index 0000000..72179d2
--- /dev/null
+++ b/ld/testsuite/ld-ifunc/pr18841a.c
@@ -0,0 +1,12 @@
+#include <stdio.h>
+
+extern void test(void);
+
+void zoo(){}
+
+int main()
+{
+ test();
+ printf("OK\n");
+ return 0;
+}
diff --git a/ld/testsuite/ld-ifunc/pr18841b.c b/ld/testsuite/ld-ifunc/pr18841b.c
new file mode 100644
index 0000000..1e87469
--- /dev/null
+++ b/ld/testsuite/ld-ifunc/pr18841b.c
@@ -0,0 +1,21 @@
+void foo() __attribute__((ifunc("resolve_foo")));
+
+static void foo_impl() {}
+
+extern void abort (void);
+void test()
+{
+ void (*pg)(void) = foo;
+ if (pg != foo_impl)
+ abort ();
+ pg();
+}
+
+static void* resolve_foo()
+{
+ extern void zoo(void);
+
+ void (*pz)(void) = zoo;
+ pz();
+ return foo_impl;
+}