bfd/ 2002-08-05 H.J. Lu * elflink.h (elf_link_assign_sym_version): Don't match a default version if there is a hidden versioned definition. --- bfd/elflink.h.defver Fri Jul 26 23:41:26 2002 +++ bfd/elflink.h Mon Aug 5 10:21:03 2002 @@ -4274,6 +4274,10 @@ elf_link_assign_sym_version (h, data) struct bfd_elf_version_tree *t; struct bfd_elf_version_tree *local_ver; struct bfd_elf_version_expr *d; + const char *verstr, *name; + size_t namelen, verlen, newlen; + char *newname; + struct elf_link_hash_entry *newh; /* See if can find what version this symbol is in. If the symbol is supposed to be local, then don't actually register @@ -4287,9 +4291,39 @@ elf_link_assign_sym_version (h, data) { if ((*d->match) (d, h->root.root.string)) { - h->verinfo.vertree = t; - local_ver = NULL; - break; + name = h->root.root.string; + namelen = strlen (name); + verstr = t->name; + verlen = strlen (verstr); + newlen = namelen + verlen + 2; + + newname = (char *) bfd_malloc + ((bfd_size_type) newlen); + if (newname == NULL) + goto error_return; + memcpy (newname, name, namelen); + + /* Check the hidden versioned definition. */ + p = newname + namelen; + *p++ = ELF_VER_CHR; + memcpy (p, verstr, verlen + 1); + newh = elf_link_hash_lookup + (elf_hash_table (info), newname, false, + false, false); + free (newname); + + if (!newh + || ((newh->root.type + != bfd_link_hash_defined) + && (newh->root.type + != bfd_link_hash_defweak))) + { + /* We didn't find the hidden versioned + definition. Use it. */ + h->verinfo.vertree = t; + local_ver = NULL; + break; + } } } @@ -4332,11 +4366,6 @@ elf_link_assign_sym_version (h, data) hide the default one. */ if (h->dynindx != -1 && h->verinfo.vertree != NULL) { - const char *verstr, *name; - size_t namelen, verlen, newlen; - char *newname; - struct elf_link_hash_entry *newh; - name = h->root.root.string; namelen = strlen (name); verstr = h->verinfo.vertree->name;