PowerPC64, don't relocate nops

This fixes a "bug" in that nops emitted as part of code optimization
were being relocated.  As it happens the relocation value was always
zero so the nop wasn't changed.  Whew!  I've also moved the use of
"howto" later since I was caught out in some recent code changes with
the howto not matching r_type.

	* elf64-ppc.c (ppc64_elf_relocate_section): Don't relocate nops
	emitted for toc sequence optimization.  Set and use "howto" later.
This commit is contained in:
Alan Modra 2018-02-02 16:55:21 +10:30
parent 59498c305e
commit d830549dba
2 changed files with 14 additions and 4 deletions

View file

@ -1,3 +1,8 @@
2018-02-02 Alan Modra <amodra@gmail.com>
* elf64-ppc.c (ppc64_elf_relocate_section): Don't relocate nops
emitted for toc sequence optimization. Set and use "howto" later.
2018-02-01 Simon Marchi <simon.marchi@ericsson.com>
* elf64-ppc.c (ppc64_elf_archive_symbol_lookup): Avoid pointer

View file

@ -15067,7 +15067,6 @@ ppc64_elf_relocate_section (bfd *output_bfd,
/* Multi-instruction sequences that access the TOC can be
optimized, eg. addis ra,r2,0; addi rb,ra,x;
to nop; addi rb,r2,x; */
howto = ppc64_elf_howto_table[(int) r_type];
switch (r_type)
{
default:
@ -15099,6 +15098,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
{
bfd_byte *p = contents + (rel->r_offset & ~3);
bfd_put_32 (input_bfd, NOP, p);
goto copy_reloc;
}
break;
@ -15140,9 +15140,13 @@ ppc64_elf_relocate_section (bfd *output_bfd,
/* xgettext:c-format */
info->callbacks->minfo
(_("%H: warning: %s unexpected insn %#x.\n"),
input_bfd, input_section, rel->r_offset, howto->name, insn);
input_bfd, input_section, rel->r_offset,
ppc64_elf_howto_table[r_type]->name, insn);
else
bfd_put_32 (input_bfd, NOP, p);
{
bfd_put_32 (input_bfd, NOP, p);
goto copy_reloc;
}
}
break;
@ -15240,7 +15244,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
/* xgettext:c-format */
(_("%H: error: %s not a multiple of %u\n"),
input_bfd, input_section, rel->r_offset,
howto->name,
ppc64_elf_howto_table[r_type]->name,
mask + 1);
bfd_set_error (bfd_error_bad_value);
ret = FALSE;
@ -15252,6 +15256,7 @@ ppc64_elf_relocate_section (bfd *output_bfd,
/* Dynamic relocs are not propagated for SEC_DEBUGGING sections
because such sections are not SEC_ALLOC and thus ld.so will
not process them. */
howto = ppc64_elf_howto_table[(int) r_type];
if (unresolved_reloc
&& !((input_section->flags & SEC_DEBUGGING) != 0
&& h->elf.def_dynamic)