ld: Fix LTO for MinGW targets

When creating a dummy BFD for an IR file, the output BFD is used as
a template for the new BFD, when it needs to be the input BFD passed
into the function when not dealing with a BFD plugin.

On most targets this is not an issue as the input and output formats
are the same anyway, but on MinGW targets, there are two variant
formats used (pe-i386/pe-x86-64 and pei-i386/pei-x86-64) which are
similar but not interchangeable here.

	PR ld/18199
	* plugin.c (plugin_get_ir_dummy_bfd): Use srctemplate as the
	template when calling bfd_create if it does not use the BFD
	plugin target vector.
This commit is contained in:
Kwok Cheung Yeung 2015-12-10 16:11:07 +00:00
parent 6479e48ef9
commit 4a07dc8135
2 changed files with 11 additions and 2 deletions

View File

@ -1,3 +1,10 @@
2015-12-10 Kwok Cheung Yeung <kcy@codesourcery.com>
PR ld/18199
* plugin.c (plugin_get_ir_dummy_bfd): Use srctemplate as the
template when calling bfd_create if it does not use the BFD
plugin target vector.
2015-12-02 Alan Modra <amodra@gmail.com>
* configure.ac (--enable-initfini-array): Remove run test. Default

View File

@ -295,16 +295,18 @@ static bfd *
plugin_get_ir_dummy_bfd (const char *name, bfd *srctemplate)
{
bfd *abfd;
bfd_boolean bfd_plugin_target;
bfd_use_reserved_id = 1;
bfd_plugin_target = bfd_plugin_target_p (srctemplate->xvec);
abfd = bfd_create (concat (name, IRONLY_SUFFIX, (const char *) NULL),
link_info.output_bfd);
bfd_plugin_target ? link_info.output_bfd : srctemplate);
if (abfd != NULL)
{
abfd->flags |= BFD_LINKER_CREATED | BFD_PLUGIN;
if (!bfd_make_writable (abfd))
goto report_error;
if (! bfd_plugin_target_p (srctemplate->xvec))
if (!bfd_plugin_target)
{
bfd_set_arch_info (abfd, bfd_get_arch_info (srctemplate));
bfd_set_gp_size (abfd, bfd_get_gp_size (srctemplate));