This is to fix a further problem with merging resource sections. It turns

out that the section is supposed to be page-aligned, but the newly merged
section was not being padded out to a page boundary.  This meant that when
the executable was stripped a badly sized .rsrc section was written out.

	PR ld/16807
	* peXXigen.c (rsrc_process_section): Page align the new contents
	befgore writing out.
This commit is contained in:
Nick Clifton 2014-06-03 17:18:27 +01:00
parent 1e2ccb612d
commit c32abae845
2 changed files with 36 additions and 2 deletions

View file

@ -1,3 +1,9 @@
2014-06-03 Nick Clifton <nickc@redhat.com>
PR ld/16807
* peXXigen.c (rsrc_process_section): Page align the new contents
befgore writing out.
2014-06-03 Alan Modra <amodra@gmail.com>
* elf64-ppc.c (ADDIS_R12_R2): Define.

View file

@ -2398,7 +2398,16 @@ rsrc_print_section (bfd * abfd, void * vfile)
if (data == (regions.section_end - 4))
data = regions.section_end;
else if (data < regions.section_end)
fprintf (file, _("\nWARNING: Extra data in .rsrc section - it will be ignored by Windows:\n"));
{
/* If the extra data is all zeros then do not complain.
This is just padding so that the section meets the
page size requirements. */
while (data ++ < regions.section_end)
if (*data != 0)
break;
if (data < regions.section_end)
fprintf (file, _("\nWARNING: Extra data in .rsrc section - it will be ignored by Windows:\n"));
}
}
}
@ -3911,6 +3920,7 @@ rsrc_process_section (bfd * abfd,
data = bfd_malloc (size);
if (data == NULL)
return;
datastart = data;
if (! bfd_get_section_contents (abfd, sec, data, 0, size))
@ -4052,7 +4062,7 @@ rsrc_process_section (bfd * abfd,
starts on an 8-byte boundary. FIXME: Is this correct ? */
sizeof_strings = (sizeof_strings + 7) & ~ 7;
new_data = bfd_malloc (size);
new_data = bfd_zalloc (abfd, size);
if (new_data == NULL)
goto end;
@ -4069,6 +4079,24 @@ rsrc_process_section (bfd * abfd,
/* Step five: Replace the old contents with the new.
We recompute the size as we may have lost entries due to mergeing. */
size = ((write_data.next_data - new_data) + 3) & ~ 3;
{
int page_size;
if (coff_data (abfd)->link_info)
{
page_size = pe_data (abfd)->pe_opthdr.FileAlignment;
/* If no file alignment has been set, default to one.
This repairs 'ld -r' for arm-wince-pe target. */
if (page_size == 0)
page_size = 1;
}
else
page_size = PE_DEF_FILE_ALIGNMENT;
size = (size + page_size - 1) & - page_size;
}
bfd_set_section_contents (pfinfo->output_bfd, sec, new_data, 0, size);
sec->size = sec->rawsize = size;