PR13616, linker should pad executable sections with nops, not zeros

This implements padding of orphan executable sections for PowerPC.
Of course, the simple implementation of bfd_arch_ppc_nop_fill and
removing the NOP definition didn't work, with powerpc64 hitting a
testsuite failure linking to S-records.  That's because the srec
target is BFD_ENDIAN_UNKNOWN so the test of bfd_big_endian (abfd) in
default_data_link_order therefore returned false, resulting in a
little-endian nop pattern.  The rest of the patch fixes that problem
by adding a new field to bfd_link_info that can be used to determine
actual endianness on targets like srec.

	PR 13616
include/
	* bfdlink.h (struct bfd_link_info <big_endian>): New field.
bfd/
	* cpu-powerpc.c (bfd_arch_ppc_nop_fill): New function, use it
	for all ppc arch info.
	* linker.c (default_data_link_order): Pass info->big_endian to
	arch_info->fill function.
ld/
	* emulparams/elf64lppc.sh (NOP): Don't define.
	* emulparams/elf64ppc.sh (NOP): Don't define.
	* ldwrite.c (build_link_order): Use link_info.big_endian.  Move
	code determining endian to use for data_statement to..
	* ldemul.c (after_open_default): ..here.  Set link_info.big_endian.
This commit is contained in:
Alan Modra
2019-10-16 21:23:29 +10:30
parent 12234dfd5f
commit 22216541c1
10 changed files with 117 additions and 70 deletions

View File

@ -2469,7 +2469,7 @@ _bfd_default_link_order (bfd *abfd,
static bfd_boolean
default_data_link_order (bfd *abfd,
struct bfd_link_info *info ATTRIBUTE_UNUSED,
struct bfd_link_info *info,
asection *sec,
struct bfd_link_order *link_order)
{
@ -2489,7 +2489,7 @@ default_data_link_order (bfd *abfd,
fill_size = link_order->u.data.size;
if (fill_size == 0)
{
fill = abfd->arch_info->fill (size, bfd_big_endian (abfd),
fill = abfd->arch_info->fill (size, info->big_endian,
(sec->flags & SEC_CODE) != 0);
if (fill == NULL)
return FALSE;