* elf32-ppc.c (ppc_elf_finish_dynamic_sections): Handle vxworks
authorAlan Modra <amodra@gmail.com>
Fri, 19 Sep 2008 09:51:32 +0000 (09:51 +0000)
committerAlan Modra <amodra@gmail.com>
Fri, 19 Sep 2008 09:51:32 +0000 (09:51 +0000)
_GLOBAL_OFFSET_TABLE_ in .got.plt section.  Add BFD_ASSERTs.

bfd/ChangeLog
bfd/elf32-ppc.c

index 4a1769d19574bcbaabc0bd4adc4ca68cccae8511..25214d854e00e882d1e2290169fd235ff917ea6e 100644 (file)
@@ -1,3 +1,8 @@
+2008-09-19  Alan Modra  <amodra@bigpond.net.au>
+
+       * elf32-ppc.c (ppc_elf_finish_dynamic_sections): Handle vxworks
+       _GLOBAL_OFFSET_TABLE_ in .got.plt section.  Add BFD_ASSERTs.
+
 2008-09-17  Bob Wilson  <bob.wilson@acm.org>
 
        * elf32-xtensa.c (elf_xtensa_check_relocs): Check for negative refcount.
index 10828209b2ee1c8bd237a2bd38c6edee50d25d12..1d9cabd2dc0358926bddc84e9d93db255aff2387 100644 (file)
@@ -7727,29 +7727,38 @@ ppc_elf_finish_dynamic_sections (bfd *output_bfd,
        }
     }
 
-  /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4 so that a function can
-     easily find the address of the _GLOBAL_OFFSET_TABLE_.  */
   if (htab->got != NULL)
     {
-      if (htab->elf.hgot->root.u.def.section == htab->got)
+      if (htab->elf.hgot->root.u.def.section == htab->got
+         || htab->elf.hgot->root.u.def.section == htab->sgotplt)
        {
-         unsigned char *p = htab->got->contents;
-         bfd_vma val;
+         unsigned char *p = htab->elf.hgot->root.u.def.section->contents;
 
          p += htab->elf.hgot->root.u.def.value;
          if (htab->plt_type == PLT_OLD)
-           bfd_put_32 (output_bfd, 0x4e800021 /* blrl */, p - 4);
+           {
+             /* Add a blrl instruction at _GLOBAL_OFFSET_TABLE_-4
+                so that a function can easily find the address of
+                _GLOBAL_OFFSET_TABLE_.  */
+             BFD_ASSERT (htab->elf.hgot->root.u.def.value - 4
+                         < htab->elf.hgot->root.u.def.section->size);
+             bfd_put_32 (output_bfd, 0x4e800021, p - 4);
+           }
 
-         val = 0;
          if (sdyn != NULL)
-           val = sdyn->output_section->vma + sdyn->output_offset;
-         bfd_put_32 (output_bfd, val, p);
+           {
+             bfd_vma val = sdyn->output_section->vma + sdyn->output_offset;
+             BFD_ASSERT (htab->elf.hgot->root.u.def.value
+                         < htab->elf.hgot->root.u.def.section->size);
+             bfd_put_32 (output_bfd, val, p);
+           }
        }
       else
        {
          (*_bfd_error_handler) (_("%s not defined in linker created %s"),
                                 htab->elf.hgot->root.root.string,
-                                htab->got->name);
+                                (htab->sgotplt != NULL
+                                 ? htab->sgotplt->name : htab->got->name));
          bfd_set_error (bfd_error_bad_value);
          ret = FALSE;
        }