aboutsummaryrefslogtreecommitdiff
path: root/bfd/elflink.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2017-05-16 07:56:41 +0930
committerAlan Modra <amodra@gmail.com>2017-05-16 10:35:02 +0930
commit4070765b1a1640ff8f43483cd9ee06727f658dfe (patch)
treeea06dfc18946668b4a75631e39b22a822f2fd26a /bfd/elflink.c
parent8cc2a9796024f2dd472985cc8ed1c65a85ec9a35 (diff)
downloadgdb-4070765b1a1640ff8f43483cd9ee06727f658dfe.zip
gdb-4070765b1a1640ff8f43483cd9ee06727f658dfe.tar.gz
gdb-4070765b1a1640ff8f43483cd9ee06727f658dfe.tar.bz2
non_ir_ref_dynamic
dynamic_ref_after_ir_def is a little odd compared to other symbol flags in that as the name suggests, it is set only for certain references after a definition. It turns out that setting a flag for any non-ir reference from a dynamic object can be used to solve the problem for which this flag was invented, which I think is a cleaner. This patch does that, and sets non_ir_ref only for regular object references. include/ * bfdlink.h (struct bfd_link_hash_entry): Update non_ir_ref comment. Rename dynamic_ref_after_ir_def to non_ir_ref_dynamic. ld/ * plugin.c (is_visible_from_outside): Use non_ir_ref_dynamic. (plugin_notice): Set non_ir_ref for references from regular objects, non_ir_ref_dynamic for references from dynamic objects. bfd/ * elf64-ppc.c (add_symbol_adjust): Transfer non_ir_ref_dynamic. * elflink.c (elf_link_add_object_symbols): Update to use non_ir_ref_dynamic. (elf_link_input_bfd): Test non_ir_ref_dynamic in addition to non_ir_ref. * linker.c (_bfd_generic_link_add_one_symbol): Likewise.
Diffstat (limited to 'bfd/elflink.c')
-rw-r--r--bfd/elflink.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/bfd/elflink.c b/bfd/elflink.c
index ba50b68..8eaf533 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -4939,7 +4939,7 @@ error_free_dyn:
struct elf_link_hash_entry *h;
bfd_size_type size;
unsigned int alignment_power;
- unsigned int dynamic_ref_after_ir_def;
+ unsigned int non_ir_ref_dynamic;
for (p = htab->root.table.table[i]; p != NULL; p = p->next)
{
@@ -4961,10 +4961,10 @@ error_free_dyn:
size = 0;
alignment_power = 0;
}
- /* Preserve dynamic_ref_after_ir_def so that this symbol
+ /* Preserve non_ir_ref_dynamic so that this symbol
will be exported when the dynamic lib becomes needed
in the second pass. */
- dynamic_ref_after_ir_def = h->root.dynamic_ref_after_ir_def;
+ non_ir_ref_dynamic = h->root.non_ir_ref_dynamic;
memcpy (p, old_ent, htab->root.table.entsize);
old_ent = (char *) old_ent + htab->root.table.entsize;
h = (struct elf_link_hash_entry *) p;
@@ -4981,7 +4981,7 @@ error_free_dyn:
if (alignment_power > h->root.u.c.p->alignment_power)
h->root.u.c.p->alignment_power = alignment_power;
}
- h->root.dynamic_ref_after_ir_def = dynamic_ref_after_ir_def;
+ h->root.non_ir_ref_dynamic = non_ir_ref_dynamic;
}
}
@@ -10472,7 +10472,8 @@ elf_link_input_bfd (struct elf_final_link_info *flinfo, bfd *input_bfd)
linker may attach linker created dynamic sections
to the plugin bfd. Symbols defined in linker
created sections are not plugin symbols. */
- if (h->root.non_ir_ref
+ if ((h->root.non_ir_ref
+ || h->root.non_ir_ref_dynamic)
&& (h->root.type == bfd_link_hash_defined
|| h->root.type == bfd_link_hash_defweak)
&& (h->root.u.def.section->flags