2002-09-19 Jakub Jelinek <jakub@redhat.com>
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 20 Sep 2002 05:54:41 +0000 (05:54 +0000)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 20 Sep 2002 05:54:41 +0000 (05:54 +0000)
* elf32-ppc.c (ppc_elf_finish_dynamic_symbol): Clear .got word
even if generating R_PPC_RELATIVE reloc.
(ppc_elf_relocate_section): Make sure relocation is performed
if skip == -2.  Clear memory at r_offset when creating dynamic
relocation.

bfd/ChangeLog
bfd/elf32-ppc.c

index e697ce3b3d609b80e5d0095eb8d2149549443ead..8874b8c1ef171b513f142783fd4db98a602bd932 100644 (file)
@@ -1,3 +1,11 @@
+2002-09-19  Jakub Jelinek  <jakub@redhat.com>
+
+       * elf32-ppc.c (ppc_elf_finish_dynamic_symbol): Clear .got word
+       even if generating R_PPC_RELATIVE reloc.
+       (ppc_elf_relocate_section): Make sure relocation is performed
+       if skip == -2.  Clear memory at r_offset when creating dynamic
+       relocation.
+
 2002-09-19  Jakub Jelinek  <jakub@redhat.com>
 
        * reloc.c (BFD_RELOC_386_TLS_TPOFF, BFD_RELOC_386_TLS_IE,
index d5ed0c4c69be75e4fd50207a20141958a458cb20..a2a0a6da698e2032ee5f6e54c23a839100c82b06 100644 (file)
@@ -2743,11 +2743,11 @@ ppc_elf_finish_dynamic_symbol (output_bfd, info, h, sym)
       else
        {
          BFD_ASSERT ((h->got.offset & 1) == 0);
-         bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
          rela.r_info = ELF32_R_INFO (h->dynindx, R_PPC_GLOB_DAT);
          rela.r_addend = 0;
        }
 
+      bfd_put_32 (output_bfd, (bfd_vma) 0, sgot->contents + h->got.offset);
       bfd_elf32_swap_reloca_out (output_bfd, &rela,
                                 ((Elf32_External_Rela *) srela->contents
                                  + srela->reloc_count));
@@ -3287,13 +3287,19 @@ ppc_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                                          + sreloc->reloc_count));
              ++sreloc->reloc_count;
 
-             /* This reloc will be computed at runtime, so there's no
-                 need to do anything now, unless this is a RELATIVE
-                 reloc in an unallocated section.  */
-             if (skip != -1
-                 || (input_section->flags & SEC_ALLOC) != 0
-                 || ELF32_R_TYPE (outrel.r_info) != R_PPC_RELATIVE)
+             if (skip == -1)
                continue;
+
+             /* This reloc will be computed at runtime.  We clear the memory
+                so that it contains predictable value.  */
+             if (! skip
+                 && ((input_section->flags & SEC_ALLOC) != 0
+                     || ELF32_R_TYPE (outrel.r_info) != R_PPC_RELATIVE))
+               {
+                 relocation = howto->pc_relative ? outrel.r_offset : 0;
+                 addend = 0;
+                 break;
+               }
            }
 
          /* Arithmetic adjust relocations that aren't going into a
@@ -3390,7 +3396,6 @@ ppc_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                off &= ~1;
              else
                {
-                 bfd_put_32 (output_bfd, relocation, sgot->contents + off);
 
                  if (info->shared)
                    {
@@ -3412,8 +3417,10 @@ ppc_elf_relocate_section (output_bfd, info, input_bfd, input_section,
                                                   srelgot->contents)
                                                  + srelgot->reloc_count));
                      ++srelgot->reloc_count;
+                     relocation = 0;
                    }
 
+                 bfd_put_32 (output_bfd, relocation, sgot->contents + off);
                  local_got_offsets[r_symndx] |= 1;
                }