* elf32-ppc.c (ppc_elf_check_relocs): For old gcc -fPIC code
authorAlan Modra <amodra@gmail.com>
Mon, 23 May 2005 16:22:25 +0000 (16:22 +0000)
committerAlan Modra <amodra@gmail.com>
Mon, 23 May 2005 16:22:25 +0000 (16:22 +0000)
force old plt layout.

bfd/ChangeLog
bfd/elf32-ppc.c

index 4983c7aeb5b4a464cf83e69cf0d1efa790f07da8..78035203681723e9f9ddf32a4a6dac38ff94b5b6 100644 (file)
@@ -1,3 +1,8 @@
+2005-05-24  Alan Modra  <amodra@bigpond.net.au>
+
+       * elf32-ppc.c (ppc_elf_check_relocs): For old gcc -fPIC code
+       force old plt layout.
+
 2005-05-22  Richard Henderson  <rth@redhat.com>
 
        * elf64-alpha.c (elf64_alpha_relax_section): Ignore non-allocated
index 585bf7d5a04d2c1a62069eb39fd331cbe6b74237..c9119239c6a09a475941d05f46e07dd721708a7c 100644 (file)
@@ -3160,14 +3160,32 @@ ppc_elf_check_relocs (bfd *abfd,
            info->flags |= DF_STATIC_TLS;
          goto dodyn;
 
-         /* When creating a shared object, we must copy these
-            relocs into the output file.  We create a reloc
-            section in dynobj and make room for the reloc.  */
+       case R_PPC_REL32:
+         if (h == NULL
+             && got2 != NULL
+             && (sec->flags & SEC_CODE) != 0
+             && (info->shared || info->pie)
+             && !htab->old_plt)
+           {
+             /* Old -fPIC gcc code has .long LCTOC1-LCFx just before
+                the start of a function, which assembles to a REL32
+                reference to .got2.  If we detect one of these, then
+                force the old PLT layout because the linker cannot
+                reliably deduce the GOT pointer value needed for
+                PLT call stubs.  */
+             asection *s;
+
+             s = bfd_section_from_r_symndx (abfd, &htab->sym_sec, sec,
+                                            r_symndx);
+             if (s == got2)
+               htab->old_plt = 1;
+           }
+         /* fall through */
+
        case R_PPC_REL24:
        case R_PPC_REL14:
        case R_PPC_REL14_BRTAKEN:
        case R_PPC_REL14_BRNTAKEN:
-       case R_PPC_REL32:
          if (h == NULL)
            break;
          if (h == htab->elf.hgot)