summaryrefslogtreecommitdiffstats
path: root/binutils-2.23.52.0.1-check-regular-ifunc-refs.patch
diff options
context:
space:
mode:
Diffstat (limited to 'binutils-2.23.52.0.1-check-regular-ifunc-refs.patch')
-rw-r--r--binutils-2.23.52.0.1-check-regular-ifunc-refs.patch48
1 files changed, 48 insertions, 0 deletions
diff --git a/binutils-2.23.52.0.1-check-regular-ifunc-refs.patch b/binutils-2.23.52.0.1-check-regular-ifunc-refs.patch
new file mode 100644
index 0000000..c9bfd64
--- /dev/null
+++ b/binutils-2.23.52.0.1-check-regular-ifunc-refs.patch
@@ -0,0 +1,48 @@
+*** ../binutils-2.23.52.0.1.orig/bfd/elf-ifunc.c 2013-04-17 15:53:49.662586029 +0100
+--- bfd/elf-ifunc.c 2013-04-17 15:55:55.269589511 +0100
+*************** _bfd_elf_allocate_ifunc_dyn_relocs (stru
+*** 187,209 ****
+
+ htab = elf_hash_table (info);
+
+ /* Support garbage collection against STT_GNU_IFUNC symbols. */
+ if (h->plt.refcount <= 0 && h->got.refcount <= 0)
+ {
+- /* When building shared library, we need to handle the case
+- where it is marked with regular reference, but not non-GOT
+- reference. It may happen if we didn't see STT_GNU_IFUNC
+- symbol at the time when checking relocations. */
+- if (info->shared
+- && !h->non_got_ref
+- && h->ref_regular)
+- for (p = *head; p != NULL; p = p->next)
+- if (p->count)
+- {
+- h->non_got_ref = 1;
+- goto keep;
+- }
+-
+ h->got = htab->init_got_offset;
+ h->plt = htab->init_plt_offset;
+ *head = NULL;
+--- 187,206 ----
+
+ htab = elf_hash_table (info);
+
++ /* When building a shared library, we need to handle the case where it is
++ marked with a regular reference, but not a non-GOT reference since the
++ non-GOT reference bit may not be set here. */
++ if (info->shared && !h->non_got_ref && h->ref_regular)
++ for (p = *head; p != NULL; p = p->next)
++ if (p->count)
++ {
++ h->non_got_ref = 1;
++ goto keep;
++ }
++
+ /* Support garbage collection against STT_GNU_IFUNC symbols. */
+ if (h->plt.refcount <= 0 && h->got.refcount <= 0)
+ {
+ h->got = htab->init_got_offset;
+ h->plt = htab->init_plt_offset;
+ *head = NULL;