* elf64-ppc.c (struct ppc64_elf_obj_tdata): Replace opd_relocs
authorAlan Modra <amodra@gmail.com>
Thu, 25 Jul 2013 15:18:26 +0000 (15:18 +0000)
committerAlan Modra <amodra@gmail.com>
Thu, 25 Jul 2013 15:18:26 +0000 (15:18 +0000)
with a union.
(opd_entry_value): Cache .opd section contents.
(ppc64_elf_relocate_section): Adjust.

bfd/ChangeLog
bfd/elf64-ppc.c

index efbf5bb0f50bdadf9efe7b1b0784f19b356cdad5..0f25f37cfffed4587c49df646e83711cc0e4284f 100644 (file)
@@ -1,3 +1,10 @@
+2013-07-25  Alan Modra  <amodra@gmail.com>
+
+       * elf64-ppc.c (struct ppc64_elf_obj_tdata): Replace opd_relocs
+       with a union.
+       (opd_entry_value): Cache .opd section contents.
+       (ppc64_elf_relocate_section): Adjust.
+
 2013-07-25  Alan Modra  <amodra@gmail.com>
 
        PR ld/15762
index b0a9afb1a96d98e530df5df45e2472be70169131..349f9b3fd43748a3655c2b36e7f6e4ae608a5da5 100644 (file)
@@ -2615,8 +2615,13 @@ struct ppc64_elf_obj_tdata
      sections means we potentially need one of these for each input bfd.  */
   struct got_entry tlsld_got;
 
-  /* A copy of relocs before they are modified for --emit-relocs.  */
-  Elf_Internal_Rela *opd_relocs;
+  union {
+    /* A copy of relocs before they are modified for --emit-relocs.  */
+    Elf_Internal_Rela *relocs;
+
+    /* Section contents.  */
+    bfd_byte *contents;
+  } opd;
 
   /* Nonzero if this bfd has small toc/got relocs, ie. that expect
      the reloc to be in the range -32768 to 32767.  */
@@ -5574,12 +5579,16 @@ opd_entry_value (asection *opd_sec,
      at a final linked executable with addr2line or somesuch.  */
   if (opd_sec->reloc_count == 0)
     {
-      char buf[8];
+      bfd_byte *contents = ppc64_elf_tdata (opd_bfd)->opd.contents;
 
-      if (!bfd_get_section_contents (opd_bfd, opd_sec, buf, offset, 8))
-       return (bfd_vma) -1;
+      if (contents == NULL)
+       {
+         if (!bfd_malloc_and_get_section (opd_bfd, opd_sec, &contents))
+           return (bfd_vma) -1;
+         ppc64_elf_tdata (opd_bfd)->opd.contents = contents;
+       }
 
-      val = bfd_get_64 (opd_bfd, buf);
+      val = bfd_get_64 (opd_bfd, contents + offset);
       if (code_sec != NULL)
        {
          asection *sec, *likely = NULL;
@@ -5611,7 +5620,7 @@ opd_entry_value (asection *opd_sec,
 
   BFD_ASSERT (is_ppc64_elf (opd_bfd));
 
-  relocs = ppc64_elf_tdata (opd_bfd)->opd_relocs;
+  relocs = ppc64_elf_tdata (opd_bfd)->opd.relocs;
   if (relocs == NULL)
     relocs = _bfd_elf_link_read_relocs (opd_bfd, opd_sec, NULL, NULL, TRUE);
 
@@ -14065,8 +14074,8 @@ ppc64_elf_relocate_section (bfd *output_bfd,
       bfd_size_type amt;
       amt = input_section->reloc_count * sizeof (Elf_Internal_Rela);
       rel = bfd_alloc (input_bfd, amt);
-      BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd_relocs == NULL);
-      ppc64_elf_tdata (input_bfd)->opd_relocs = rel;
+      BFD_ASSERT (ppc64_elf_tdata (input_bfd)->opd.relocs == NULL);
+      ppc64_elf_tdata (input_bfd)->opd.relocs = rel;
       if (rel == NULL)
        return FALSE;
       memcpy (rel, relocs, amt);