2005-02-10 Paul Brook <paul@codesourcery.com>
authorPaul Brook <paul@codesourcery.com>
Thu, 10 Feb 2005 14:09:43 +0000 (14:09 +0000)
committerPaul Brook <paul@codesourcery.com>
Thu, 10 Feb 2005 14:09:43 +0000 (14:09 +0000)
* 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

bfd/ChangeLog
bfd/elflink.c
ld/testsuite/ChangeLog
ld/testsuite/ld-elfvsb/hidden2.d [new file with mode: 0644]
ld/testsuite/ld-elfvsb/hidden2.ld [new file with mode: 0644]
ld/testsuite/ld-elfvsb/hidden2.s [new file with mode: 0644]

index 1cc875f..a5d36d7 100644 (file)
@@ -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.
index 6c65bab..4cbcc1b 100644 (file)
@@ -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;
index cfc2192..bb0ed55 100644 (file)
@@ -1,3 +1,9 @@
+2005-02-10  Paul Brook  <paul@codesourcery.com>
+
+       * ld-elfvsb/hidden2.s: New file
+       * ld-elfvsb/hidden2.d: New file
+       * ld-elfvsb/hidden2.ld: New file
+
 2005-02-07  Alexandre Oliva  <aoliva@redhat.com>
 
        * ld-frv/fdpic-shared-8-fail.d: Tweak error messages.
diff --git a/ld/testsuite/ld-elfvsb/hidden2.d b/ld/testsuite/ld-elfvsb/hidden2.d
new file mode 100644 (file)
index 0000000..25cfa4d
--- /dev/null
@@ -0,0 +1,9 @@
+#source: hidden2.s
+#ld: -shared -T hidden2.ld
+#readelf: -Ds
+# It is also ok to remove this symbol, but we currently make it local.
+
+Symbol table for image:
+#...
+[      ]*[0-9]+ +[0-9]+: [0-9a-fA-F]* +0  NOTYPE  LOCAL HIDDEN +ABS foo
+#pass
diff --git a/ld/testsuite/ld-elfvsb/hidden2.ld b/ld/testsuite/ld-elfvsb/hidden2.ld
new file mode 100644 (file)
index 0000000..1e4a2b0
--- /dev/null
@@ -0,0 +1,6 @@
+SECTIONS
+{
+  . = 0x1000;
+  PROVIDE (foo = .);
+  .data : { *(.data) }
+}
diff --git a/ld/testsuite/ld-elfvsb/hidden2.s b/ld/testsuite/ld-elfvsb/hidden2.s
new file mode 100644 (file)
index 0000000..66af070
--- /dev/null
@@ -0,0 +1,4 @@
+       .data
+       .hidden foo
+       .global foo
+       .word foo