summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Brook <paul@codesourcery.com>2005-02-10 14:09:40 +0000
committerPaul Brook <paul@codesourcery.com>2005-02-10 14:09:40 +0000
commite3b7e3acb2c5262f49d19c3aa2941efe5614dd20 (patch)
treed54da61bdb205f65a7661633275deef08405dc41
parent148d1d991c8aa03b9f8ed0487a8b6ee0d18f1c2b (diff)
downloadgdb-e3b7e3acb2c5262f49d19c3aa2941efe5614dd20.tar.gz
2005-02-10 Paul Brook <paul@codesourcery.com>
* elflink.c (bfd_elf_record_link_assignment): Make hidden and internal symbols local. (elf_link_renumber_hash_table_dynsyms): Ignore local symbols. (elf_link_renumber_local_hash_table_dynsyms): New function. (_bfd_elf_link_renumber_dynsyms): Number local dynamic symbols. ld/testsuite/ * ld-elfvsb/hidden2.s: New file * ld-elfvsb/hidden2.d: New file * ld-elfvsb/hidden2.ld: New file
-rw-r--r--bfd/ChangeLog8
-rw-r--r--bfd/elflink.c44
2 files changed, 49 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 1cc875fa0e2..a5d36d73867 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,11 @@
+2005-02-10 Paul Brook <paul@codesourcery.com>
+
+ * elflink.c (bfd_elf_record_link_assignment): Make hidden and internal
+ symbols local.
+ (elf_link_renumber_hash_table_dynsyms): Ignore local symbols.
+ (elf_link_renumber_local_hash_table_dynsyms): New function.
+ (_bfd_elf_link_renumber_dynsyms): Number local dynamic symbols.
+
2005-02-10 Jakub Jelinek <jakub@redhat.com>
* bfd-in.h (BFD_LINKER_CREATED): Define.
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 6c65babafdd..4cbcc1bb7a3 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -484,6 +484,14 @@ bfd_elf_record_link_assignment (bfd *output_bfd ATTRIBUTE_UNUSED,
h->def_regular = 1;
+ /* STV_HIDDEN and STV_INTERNAL symbols must be STB_LOCAL in shared objects
+ and executables. */
+ if (!info->relocatable
+ && h->dynindx != -1
+ && (ELF_ST_VISIBILITY (h->other) == STV_HIDDEN
+ || ELF_ST_VISIBILITY (h->other) == STV_INTERNAL))
+ h->forced_local = 1;
+
if ((h->def_dynamic
|| h->ref_dynamic
|| info->shared)
@@ -624,6 +632,31 @@ elf_link_renumber_hash_table_dynsyms (struct elf_link_hash_entry *h,
if (h->root.type == bfd_link_hash_warning)
h = (struct elf_link_hash_entry *) h->root.u.i.link;
+ if (h->forced_local)
+ return TRUE;
+
+ if (h->dynindx != -1)
+ h->dynindx = ++(*count);
+
+ return TRUE;
+}
+
+
+/* Like elf_link_renumber_hash_table_dynsyms, but just number symbols with
+ STB_LOCAL binding. */
+
+static bfd_boolean
+elf_link_renumber_local_hash_table_dynsyms (struct elf_link_hash_entry *h,
+ void *data)
+{
+ size_t *count = data;
+
+ if (h->root.type == bfd_link_hash_warning)
+ h = (struct elf_link_hash_entry *) h->root.u.i.link;
+
+ if (!h->forced_local)
+ return TRUE;
+
if (h->dynindx != -1)
h->dynindx = ++(*count);
@@ -667,9 +700,10 @@ _bfd_elf_link_omit_section_dynsym (bfd *output_bfd ATTRIBUTE_UNUSED,
}
/* Assign dynsym indices. In a shared library we generate a section
- symbol for each output section, which come first. Next come all of
- the back-end allocated local dynamic syms, followed by the rest of
- the global symbols. */
+ symbol for each output section, which come first. Next come symbols
+ which have been forced to local binding. Then all of the back-end
+ allocated local dynamic syms, followed by the rest of the global
+ symbols. */
unsigned long
_bfd_elf_link_renumber_dynsyms (bfd *output_bfd, struct bfd_link_info *info)
@@ -687,6 +721,10 @@ _bfd_elf_link_renumber_dynsyms (bfd *output_bfd, struct bfd_link_info *info)
elf_section_data (p)->dynindx = ++dynsymcount;
}
+ elf_link_hash_traverse (elf_hash_table (info),
+ elf_link_renumber_local_hash_table_dynsyms,
+ &dynsymcount);
+
if (elf_hash_table (info)->dynlocal)
{
struct elf_link_local_dynamic_entry *p;