d5ebb3e8df
Partially resolves: #927818
49 lines
1.6 KiB
Diff
49 lines
1.6 KiB
Diff
*** ../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;
|