* 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.
This commit is contained in:
Alan Modra 2013-07-25 15:18:26 +00:00
parent 7fdc15218d
commit 729eabd5c8
2 changed files with 25 additions and 9 deletions

View 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

View 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;
union {
/* A copy of relocs before they are modified for --emit-relocs. */
Elf_Internal_Rela *opd_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))
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);