PR 2434
authorAlan Modra <amodra@gmail.com>
Fri, 17 Mar 2006 03:19:56 +0000 (03:19 +0000)
committerAlan Modra <amodra@gmail.com>
Fri, 17 Mar 2006 03:19:56 +0000 (03:19 +0000)
* elflink.c (elf_link_add_object_symbols): Save and restore
warning sym's linked sym.

bfd/ChangeLog
bfd/elflink.c

index 9171cead2d0473477bd2eea5d2a07e39e19257ff..5b8d908621044694aee74e1daa33a7e7a66206cf 100644 (file)
@@ -1,3 +1,9 @@
+2006-03-17  Alan Modra  <amodra@bigpond.net.au>
+
+       PR 2434
+       * elflink.c (elf_link_add_object_symbols): Save and restore
+       warning sym's linked sym.
+
 2006-03-16  Alan Modra  <amodra@bigpond.net.au>
 
        PR 2434
index 12dd273f909a6302b7d9391f5917ac3219404551..5466e0956a4db76bd99e9a7cfffa386d493de6e8 100644 (file)
@@ -3457,9 +3457,15 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
       for (entsize = 0, i = 0; i < htab->root.table.size; i++)
        {
          struct bfd_hash_entry *p;
+         struct elf_link_hash_entry *h;
 
          for (p = htab->root.table.table[i]; p != NULL; p = p->next)
-           entsize += htab->root.table.entsize;
+           {
+             h = (struct elf_link_hash_entry *) p;
+             entsize += htab->root.table.entsize;
+             if (h->root.type == bfd_link_hash_warning)
+               entsize += htab->root.table.entsize;
+           }
        }
 
       tabsize = htab->root.table.size * sizeof (struct bfd_hash_entry *);
@@ -3487,11 +3493,18 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
       for (i = 0; i < htab->root.table.size; i++)
        {
          struct bfd_hash_entry *p;
+         struct elf_link_hash_entry *h;
 
          for (p = htab->root.table.table[i]; p != NULL; p = p->next)
            {
              memcpy (old_ent, p, htab->root.table.entsize);
              old_ent = (char *) old_ent + htab->root.table.entsize;
+             h = (struct elf_link_hash_entry *) p;
+             if (h->root.type == bfd_link_hash_warning)
+               {
+                 memcpy (old_ent, h->root.u.i.link, htab->root.table.entsize);
+                 old_ent = (char *) old_ent + htab->root.table.entsize;
+               }
            }
        }
     }
@@ -4124,10 +4137,19 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
          for (p = htab->root.table.table[i]; p != NULL; p = p->next)
            {
              h = (struct elf_link_hash_entry *) p;
+             if (h->root.type == bfd_link_hash_warning)
+               h = (struct elf_link_hash_entry *) h->root.u.i.link;
              if (h->dynindx >= old_dynsymcount)
                _bfd_elf_strtab_delref (htab->dynstr, h->dynstr_index);
+
              memcpy (p, old_ent, htab->root.table.entsize);
              old_ent = (char *) old_ent + htab->root.table.entsize;
+             h = (struct elf_link_hash_entry *) p;
+             if (h->root.type == bfd_link_hash_warning)
+               {
+                 memcpy (h->root.u.i.link, old_ent, htab->root.table.entsize);
+                 old_ent = (char *) old_ent + htab->root.table.entsize;
+               }
            }
        }
 
@@ -4138,7 +4160,7 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
        free (nondeflt_vers);
       return TRUE;
     }
+
   if (old_tab != NULL)
     {
       free (old_tab);
@@ -9149,7 +9171,7 @@ bfd_elf_gc_sections (bfd *abfd, struct bfd_link_info *info)
 
       /* Keep .gcc_except_table.* if the associated .text.* is
         marked.  This isn't very nice, but the proper solution,
-        splitting .eh_frame up and using comdat doesn't pan out 
+        splitting .eh_frame up and using comdat doesn't pan out
         easily due to needing special relocs to handle the
         difference of two symbols in separate sections.
         Don't keep code sections referenced by .eh_frame.  */