* elf64-ppc.c (ppc_size_one_stub): Size relbrlt. Accept info arg
authorAlan Modra <amodra@gmail.com>
Tue, 4 Nov 2003 08:51:36 +0000 (08:51 +0000)
committerAlan Modra <amodra@gmail.com>
Tue, 4 Nov 2003 08:51:36 +0000 (08:51 +0000)
rather than htab.
(ppc64_elf_size_stubs): Adjust ppc_size_one_stub traversal.  Zero
relbrlt size.
(ppc64_elf_build_stubs): Allocate space for relbrlt.

bfd/ChangeLog
bfd/elf64-ppc.c

index 9bad45f336ca5a0c774344c69baafdd9d6a1a1c6..c05032090be7f42326f87b96f1e83f5bd26f5a2b 100644 (file)
@@ -1,3 +1,11 @@
+2003-11-04  Alan Modra  <amodra@bigpond.net.au>
+
+       * elf64-ppc.c (ppc_size_one_stub): Size relbrlt.  Accept info arg
+       rather than htab.
+       (ppc64_elf_size_stubs): Adjust ppc_size_one_stub traversal.  Zero
+       relbrlt size.
+       (ppc64_elf_build_stubs): Allocate space for relbrlt.
+
 2003-11-04  Alan Modra  <amodra@bigpond.net.au>
 
        * bfd-in.h (_bfd_elf_tls_setup): Declare.
index d6291f4e0452f70c8aad5d81d4236848bfdc85e9..4024a94e358d33c35dbe268b008d6ea13d65f6a3 100644 (file)
@@ -6354,13 +6354,16 @@ static bfd_boolean
 ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
 {
   struct ppc_stub_hash_entry *stub_entry;
+  struct bfd_link_info *info;
   struct ppc_link_hash_table *htab;
   bfd_vma off;
   int size;
 
   /* Massage our args to the form they really have.  */
   stub_entry = (struct ppc_stub_hash_entry *) gen_entry;
-  htab = in_arg;
+  info = in_arg;
+
+  htab = ppc_hash_table (info);
 
   if (stub_entry->stub_type == ppc_stub_plt_call)
     {
@@ -6427,6 +6430,9 @@ ppc_size_one_stub (struct bfd_hash_entry *gen_entry, void *in_arg)
              br_entry->iter = htab->stub_iteration;
              br_entry->offset = htab->brlt->_raw_size;
              htab->brlt->_raw_size += 8;
+
+             if (info->shared)
+               htab->relbrlt->_raw_size += sizeof (Elf64_External_Rela);
            }
 
          stub_entry->stub_type += ppc_stub_plt_branch - ppc_stub_long_branch;
@@ -7007,8 +7013,13 @@ ppc64_elf_size_stubs (bfd *output_bfd,
          }
       htab->brlt->_raw_size = 0;
       htab->brlt->_cooked_size = 0;
+      if (info->shared)
+       {
+         htab->relbrlt->_raw_size = 0;
+         htab->relbrlt->_cooked_size = 0;
+       }
 
-      bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, htab);
+      bfd_hash_traverse (&htab->stub_hash_table, ppc_size_one_stub, info);
 
       /* Ask the linker to do its stuff.  */
       (*htab->layout_sections_again) ();
@@ -7211,6 +7222,13 @@ ppc64_elf_build_stubs (bfd_boolean emit_stub_syms,
       if (htab->brlt->contents == NULL)
        return FALSE;
     }
+  if (info->shared && htab->relbrlt->_raw_size != 0)
+    {
+      htab->relbrlt->contents = bfd_zalloc (htab->relbrlt->owner,
+                                           htab->relbrlt->_raw_size);
+      if (htab->relbrlt->contents == NULL)
+       return FALSE;
+    }
 
   /* Build the stubs as directed by the stub hash table.  */
   bfd_hash_traverse (&htab->stub_hash_table, ppc_build_one_stub, info);