diff -Naur a/binutils-2.31.1/bfd/ChangeLog b/binutils-2.31.1/bfd/ChangeLog --- a/binutils-2.31.1/bfd/ChangeLog 2018-07-18 00:50:08.000000000 -0700 +++ b/binutils-2.31.1/bfd/ChangeLog 2018-08-31 02:34:06.852965351 -0700 @@ -1,3 +1,15 @@ +2018-08-25 H.J. Lu + + PR ld/23499 + * elf.c (_bfd_elf_get_symbol_version_string): Return + _("") for corrupt symbol version info. + +2018-08-10 H.J. Lu + + PR ld/23499 + * elflink.c (bfd_elf_record_link_assignment): Always clear + h->verinfo.verdef when overriding a dynamic definition. + 2018-07-18 Nick Clifton 2.31.1 Release point. diff -Naur a/binutils-2.31.1/bfd/elf.c b/binutils-2.31.1/bfd/elf.c --- a/binutils-2.31.1/bfd/elf.c 2018-08-31 01:07:56.804985073 -0700 +++ b/binutils-2.31.1/bfd/elf.c 2018-08-31 02:36:40.067964767 -0700 @@ -1884,7 +1884,7 @@ { Elf_Internal_Verneed *t; - version_string = ""; + version_string = _(""); for (t = elf_tdata (abfd)->verref; t != NULL; t = t->vn_nextref) diff -Naur a/binutils-2.31.1/bfd/elflink.c b/binutils-2.31.1/bfd/elflink.c --- a/binutils-2.31.1/bfd/elflink.c 2018-07-13 00:33:03.000000000 -0700 +++ b/binutils-2.31.1/bfd/elflink.c 2018-08-31 01:30:01.056980022 -0700 @@ -686,13 +686,11 @@ && !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. */ diff -Naur a/binutils-2.31.1/binutils/ChangeLog b/binutils-2.31.1/binutils/ChangeLog --- a/binutils-2.31.1/binutils/ChangeLog 2018-07-18 00:50:26.000000000 -0700 +++ b/binutils-2.31.1/binutils/ChangeLog 2018-08-31 02:37:48.060964507 -0700 @@ -1,3 +1,9 @@ +2018-08-25 H.J. Lu + + PR ld/23499 + * readelf.c (get_symbol_version_string): Return _("") + for corrupt symbol version info. + 2018-07-18 Nick Clifton 2.31.1 Release point. diff -Naur a/binutils-2.31.1/binutils/readelf.c b/binutils-2.31.1/binutils/readelf.c --- a/binutils-2.31.1/binutils/readelf.c 2018-06-24 11:38:57.000000000 -0700 +++ b/binutils-2.31.1/binutils/readelf.c 2018-08-31 02:47:39.215962252 -0700 @@ -11252,6 +11252,7 @@ unsigned char data[2]; unsigned short vers_data; unsigned long offset; + unsigned short max_vd_ndx; if (!is_dynsym || version_info[DT_VERSIONTAGIDX (DT_VERSYM)] == 0) @@ -11269,6 +11270,8 @@ if ((vers_data & VERSYM_HIDDEN) == 0 && vers_data == 0) return NULL; + max_vd_ndx = 0; + /* Usually we'd only see verdef for defined symbols, and verneed for undefined symbols. However, symbols defined by the linker in .dynbss for variables copied from a shared library in order to @@ -11311,6 +11314,9 @@ ivd.vd_flags = BYTE_GET (evd.vd_flags); } + if ((ivd.vd_ndx & VERSYM_VERSION) > max_vd_ndx) + max_vd_ndx = ivd.vd_ndx & VERSYM_VERSION; + off += ivd.vd_next; } while (ivd.vd_ndx != (vers_data & VERSYM_VERSION) && ivd.vd_next != 0); @@ -11402,6 +11408,9 @@ return (ivna.vna_name < strtab_size ? strtab + ivna.vna_name : _("")); } + else if ((max_vd_ndx || (vers_data & VERSYM_VERSION) != 1) + && (vers_data & VERSYM_VERSION) > max_vd_ndx) + return _(""); } return NULL; }