* elf32-ppc.c (ppc_elf_relocate_section <R_PPC_PLTREL24>): Adjust
authorAlan Modra <amodra@gmail.com>
Mon, 4 Mar 2013 12:12:11 +0000 (12:12 +0000)
committerAlan Modra <amodra@gmail.com>
Mon, 4 Mar 2013 12:12:11 +0000 (12:12 +0000)
non-zero addends when relocatable, rather than addends >= 32768.
Always zero "addend" before applying relocation.

bfd/ChangeLog
bfd/elf32-ppc.c

index 8b949e4..70015a5 100644 (file)
@@ -1,3 +1,9 @@
+2013-03-04  Alan Modra  <amodra@gmail.com>
+
+       * elf32-ppc.c (ppc_elf_relocate_section <R_PPC_PLTREL24>): Adjust
+       non-zero addends when relocatable, rather than addends >= 32768.
+       Always zero "addend" before applying relocation.
+
 2013-03-04  Nick Clifton  <nickc@redhat.com>
 
        * archive64.c (bfd_elf64_archive_write_armap): Fix calculation of
 2013-01-07  Tom Tromey  <tromey@redhat.com>
 
        * section.c (_bfd_std_section): Rename from std_section.
-        (bfd_com_section_ptr, bfd_und_section_ptr, bfd_abs_section_ptr)
-        (STD_SECTION): Update.
+       (bfd_com_section_ptr, bfd_und_section_ptr, bfd_abs_section_ptr)
+       (STD_SECTION): Update.
        * bfd-in2.h: Rebuild.
 
 2013-01-04  Juergen Urban <JuergenUrban@gmx.de>
index bac1ce2..c05f2f0 100644 (file)
@@ -7472,7 +7472,7 @@ ppc_elf_relocate_section (bfd *output_bfd,
        {
          if (got2 != NULL
              && r_type == R_PPC_PLTREL24
-             && rel->r_addend >= 32768)
+             && rel->r_addend != 0)
            {
              /* R_PPC_PLTREL24 is rather special.  If non-zero, the
                 addend specifies the GOT pointer offset within .got2.  */
@@ -8477,33 +8477,37 @@ ppc_elf_relocate_section (bfd *output_bfd,
          break;
 
        case R_PPC_PLTREL24:
-         if (h == NULL || ifunc != NULL)
-           break;
-         /* Relocation is to the entry for this symbol in the
-            procedure linkage table.  */
-         {
-           struct plt_entry *ent = find_plt_ent (&h->plt.plist, got2,
-                                                 info->shared ? addend : 0);
-           addend = 0;
-           if (ent == NULL
-               || htab->plt == NULL)
-             {
-               /* We didn't make a PLT entry for this symbol.  This
-                  happens when statically linking PIC code, or when
-                  using -Bsymbolic.  */
-               break;
-             }
+         if (h != NULL && ifunc == NULL)
+           {
+             struct plt_entry *ent = find_plt_ent (&h->plt.plist, got2,
+                                                   info->shared ? addend : 0);
+             if (ent == NULL
+                 || htab->plt == NULL)
+               {
+                 /* We didn't make a PLT entry for this symbol.  This
+                    happens when statically linking PIC code, or when
+                    using -Bsymbolic.  */
+               }
+             else
+               {
+                 /* Relocation is to the entry for this symbol in the
+                    procedure linkage table.  */
+                 unresolved_reloc = FALSE;
+                 if (htab->plt_type == PLT_NEW)
+                   relocation = (htab->glink->output_section->vma
+                                 + htab->glink->output_offset
+                                 + ent->glink_offset);
+                 else
+                   relocation = (htab->plt->output_section->vma
+                                 + htab->plt->output_offset
+                                 + ent->plt.offset);
+               }
+           }
 
-           unresolved_reloc = FALSE;
-           if (htab->plt_type == PLT_NEW)
-             relocation = (htab->glink->output_section->vma
-                           + htab->glink->output_offset
-                           + ent->glink_offset);
-           else
-             relocation = (htab->plt->output_section->vma
-                           + htab->plt->output_offset
-                           + ent->plt.offset);
-         }
+         /* R_PPC_PLTREL24 is rather special.  If non-zero, the
+            addend specifies the GOT pointer offset within .got2.
+            Don't apply it to the relocation field.  */
+         addend = 0;
          break;
 
          /* Relocate against _SDA_BASE_.  */