summaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorH.J. Lu <hjl@lucon.org>2002-07-15 02:23:26 +0000
committerH.J. Lu <hjl@lucon.org>2002-07-15 02:23:26 +0000
commitdf3542561f542be54a3cf18b93f79c686e917680 (patch)
tree556102ea5a038785509c9d02e7881abce32ffde6 /bfd
parent7418d5ab1f4f7e09a3054861b0476a690062fd14 (diff)
downloadgdb-df3542561f542be54a3cf18b93f79c686e917680.tar.gz
bfd/
2002-07-14 H.J. Lu <hjl@gnu.org> * elflink.h (elf_link_assign_sym_version): Hide the default definition if there is a hidden versioned definition. ld/ 2002-07-14 H.J. Lu <hjl@gnu.org> * ld.texinfo: Document a .symver takes precedence over a version script.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elflink.h38
2 files changed, 43 insertions, 0 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 53d519909be..27ff268aaab 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,8 @@
+2002-07-14 H.J. Lu <hjl@gnu.org>
+
+ * elflink.h (elf_link_assign_sym_version): Hide the default
+ definition if there is a hidden versioned definition.
+
2002-07-12 Hans-Peter Nilsson <hp@axis.com>
* elf32-cris.c (cris_elf_relocate_section): Drop nonsensical
diff --git a/bfd/elflink.h b/bfd/elflink.h
index 57819e99589..7fa2ccb0474 100644
--- a/bfd/elflink.h
+++ b/bfd/elflink.h
@@ -4345,6 +4345,7 @@ elf_link_assign_sym_version (h, data)
(_("%s: undefined versioned symbol name %s"),
bfd_get_filename (sinfo->output_bfd), h->root.root.string);
bfd_set_error (bfd_error_bad_value);
+error_return:
sinfo->failed = true;
return false;
}
@@ -4416,6 +4417,43 @@ elf_link_assign_sym_version (h, data)
(*bed->elf_backend_hide_symbol) (info, h, true);
}
}
+
+ /* We need to check if a hidden versioned definition should
+ 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;
+ 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);
+
+ if (newh
+ && (newh->root.type == bfd_link_hash_defined
+ || newh->root.type == bfd_link_hash_defweak))
+ /* We find a hidden versioned definition. Hide the default
+ one. */
+ (*bed->elf_backend_hide_symbol) (info, h, true);
+
+ free (newname);
+ }
}
return true;