H.J. Lu
2018-08-09 23:09:14 UTC
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 "***@Qt_5" in its dynamic
symbol table:
4822: 00000000004e36ed 0 NOTYPE GLOBAL DEFAULT 21 ***@Qt_5
4823: 00000000004e36ed 0 NOTYPE GLOBAL DEFAULT 21 ***@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. */
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 "***@Qt_5" in its dynamic
symbol table:
4822: 00000000004e36ed 0 NOTYPE GLOBAL DEFAULT 21 ***@Qt_5
4823: 00000000004e36ed 0 NOTYPE GLOBAL DEFAULT 21 ***@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
2.17.1