This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[PATCH] Always clear h->verinfo.verdef when overriding a dynamic definition
- From: "H.J. Lu" <hongjiu dot lu at intel dot com>
- To: binutils at sourceware dot org
- Date: Thu, 9 Aug 2018 16:09:14 -0700
- Subject: [PATCH] Always clear h->verinfo.verdef when overriding a dynamic definition
- Reply-to: "H.J. Lu" <hjl dot tools at gmail dot com>
When linker defines a symbol to override a definition, which came from
a dynamic object before, we should always clear h->verinfo.verdef so
that the symbol won't be associated with the version information from
the dynamic object. This happened to the symbol "_edata" when creating
an unversioned dynamic object linking against libQt5Core.so.5.11.1,
which was created by gold, with 2 entries of "_edata@Qt_5" in its dynamic
symbol table:
4822: 00000000004e36ed 0 NOTYPE GLOBAL DEFAULT 21 _edata@Qt_5
4823: 00000000004e36ed 0 NOTYPE GLOBAL DEFAULT 21 _edata@Qt_5
Ld created the dynamic object with "_edata" in its dynamic symbol table
which was linker defined and associated with the version information
from libQt5Core.so.5.11.1. When such a dynamic object was used later,
we got
/usr/bin/ld: bin/libKF5Service.so.5.49.0: _edata: invalid version 21 (max 0)
/usr/bin/ld: bin/libKF5Service.so.5.49.0: error adding symbols: bad value
OK for master?
H.J.
---
PR ld/23499
* elflink.c (bfd_elf_record_link_assignment): Always clear
h->verinfo.verdef when overriding a dynamic definition.
---
bfd/elflink.c | 12 +++++-------
1 file changed, 5 insertions(+), 7 deletions(-)
diff --git a/bfd/elflink.c b/bfd/elflink.c
index b24fb95848..02618bed8f 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -686,13 +686,11 @@ bfd_elf_record_link_assignment (bfd *output_bfd,
&& !h->def_regular)
h->root.type = bfd_link_hash_undefined;
- /* If this symbol is not being provided by the linker script, and it is
- currently defined by a dynamic object, but not by a regular object,
- then clear out any version information because the symbol will not be
- associated with the dynamic object any more. */
- if (!provide
- && h->def_dynamic
- && !h->def_regular)
+ /* If this symbol is currently defined by a dynamic object, but not
+ by a regular object, then clear out any version information because
+ the symbol will not be associated with the dynamic object any
+ more. */
+ if (h->def_dynamic && !h->def_regular)
h->verinfo.verdef = NULL;
/* Make sure this symbol is not garbage collected. */
--
2.17.1