* elfxx-mips.c (mips_elf_sort_hash_table_f): Handle forced
authorDaniel Jacobowitz <drow@false.org>
Fri, 12 Oct 2007 15:59:19 +0000 (15:59 +0000)
committerDaniel Jacobowitz <drow@false.org>
Fri, 12 Oct 2007 15:59:19 +0000 (15:59 +0000)
local symbols specially.
(mips_elf_set_global_got_offset): Skip forced local symbols.

bfd/ChangeLog
bfd/elfxx-mips.c

index e7ab1d4..89cbac0 100644 (file)
@@ -1,3 +1,9 @@
+2007-10-12  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * elfxx-mips.c (mips_elf_sort_hash_table_f): Handle forced
+       local symbols specially.
+       (mips_elf_set_global_got_offset): Skip forced local symbols.
+
 2007-10-12  Alan Modra  <amodra@bigpond.net.au>
 
        * elf.c (elfcore_grok_prxfpreg): Fix comment typo.
index b2fcc9c..18be1fa 100644 (file)
@@ -2797,7 +2797,8 @@ mips_elf_sort_hash_table_f (struct mips_elf_link_hash_entry *h, void *data)
   /* Global symbols that need GOT entries that are not explicitly
      referenced are marked with got offset 2.  Those that are
      referenced get a 1, and those that don't need GOT entries get
-     -1.  */
+     -1.  Forced local symbols may also be marked with got offset 1,
+     but are never given global GOT entries.  */
   if (h->root.got.offset == 2)
     {
       BFD_ASSERT (h->tls_type == GOT_NORMAL);
@@ -2806,7 +2807,7 @@ mips_elf_sort_hash_table_f (struct mips_elf_link_hash_entry *h, void *data)
        hsd->low = (struct elf_link_hash_entry *) h;
       h->root.dynindx = hsd->max_unref_got_dynindx++;
     }
-  else if (h->root.got.offset != 1)
+  else if (h->root.got.offset != 1 || h->forced_local)
     h->root.dynindx = hsd->max_non_got_dynindx++;
   else
     {
@@ -3269,6 +3270,7 @@ mips_elf_set_global_got_offset (void **entryp, void *p)
 
   if (entry->abfd != NULL && entry->symndx == -1
       && entry->d.h->root.dynindx != -1
+      && !entry->d.h->forced_local
       && entry->d.h->tls_type == GOT_NORMAL)
     {
       if (g)