aboutsummaryrefslogtreecommitdiff
path: root/bfd/elflink.c
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2019-12-06 11:21:45 +1030
committerAlan Modra <amodra@gmail.com>2019-12-07 16:21:01 +1030
commit5fa370e437f39bf73a133cc84c4e6329943522bf (patch)
tree92c6bf215135bdef8faf0d1430fa810719a2ab32 /bfd/elflink.c
parent9231c9c2d4dcc58d74bc56c20fb586db70a158b5 (diff)
downloadgdb-5fa370e437f39bf73a133cc84c4e6329943522bf.zip
gdb-5fa370e437f39bf73a133cc84c4e6329943522bf.tar.gz
gdb-5fa370e437f39bf73a133cc84c4e6329943522bf.tar.bz2
PR25236, common sym versioning
In cases where a relocatable object file has a common symbol, no other file has a definition, and there is a matching common symbol found in a shared library then ld will output a definition using the largest of size and alignment for the commons. This patch fixes a bug in ld that ignored common symbols when assigning versions, resulting in such symbols being given VER_NDX_LOCAL versions. PR 25236 * elflink.c (_bfd_elf_link_assign_sym_version): Assign versions for ELF_COMMON_DEF_P symbols. (elf_link_output_extsym, _bfd_elf_add_default_symbol): Adjust to suit.
Diffstat (limited to 'bfd/elflink.c')
-rw-r--r--bfd/elflink.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 5549361..7078a2f 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -1904,7 +1904,7 @@ _bfd_elf_add_default_symbol (bfd *abfd,
if (skip)
goto nondefault;
- if (hi->def_regular)
+ if (hi->def_regular || ELF_COMMON_DEF_P (hi))
{
/* If the undecorated symbol will have a version added by a
script different to H, then don't indirect to/from the
@@ -2367,7 +2367,7 @@ _bfd_elf_link_assign_sym_version (struct elf_link_hash_entry *h, void *data)
/* We only need version numbers for symbols defined in regular
objects. */
- if (!h->def_regular)
+ if (!h->def_regular && !ELF_COMMON_DEF_P (h))
{
/* Hide symbols defined in discarded input sections. */
if ((h->root.type == bfd_link_hash_defined
@@ -10246,7 +10246,7 @@ elf_link_output_extsym (struct bfd_hash_entry *bh, void *data)
Elf_Internal_Versym iversym;
Elf_External_Versym *eversym;
- if (!h->def_regular)
+ if (!h->def_regular && !ELF_COMMON_DEF_P (h))
{
if (h->verinfo.verdef == NULL
|| (elf_dyn_lib_class (h->verinfo.verdef->vd_bfd)