* 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.
This commit is contained in:
Alan Modra 2013-03-04 12:12:11 +00:00
parent 17e3916e23
commit f75e0e336f
2 changed files with 39 additions and 29 deletions

View 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
@ -1017,8 +1023,8 @@
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>

View 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_. */