Consistency check for merge sections

We can't allow sections to be merged and sized by the ELF linker
backend and then later be output by the generic linker backend.  The
generic linker backend doesn't understand merge sections.

	PR ld/19013
	* elflink.c (_bfd_elf_merge_sections): Only merge input bfds that
	will be handled by elf_link_input_bfd.  Rename abfd param to obfd.
This commit is contained in:
Alan Modra 2015-09-30 11:45:32 +09:30
parent a39d2e820d
commit 630993ec93
2 changed files with 13 additions and 4 deletions

View File

@ -1,3 +1,9 @@
2015-09-30 Alan Modra <amodra@gmail.com>
PR ld/19013
* elflink.c (_bfd_elf_merge_sections): Only merge input bfds that
will be handled by elf_link_input_bfd. Rename abfd param to obfd.
2015-09-30 Rich Felker <dalias@libc.org>
* config.bfd (targ_selvecs): Add fdpic and misc targets

View File

@ -6814,7 +6814,7 @@ merge_sections_remove_hook (bfd *abfd ATTRIBUTE_UNUSED,
/* Finish SHF_MERGE section merging. */
bfd_boolean
_bfd_elf_merge_sections (bfd *abfd, struct bfd_link_info *info)
_bfd_elf_merge_sections (bfd *obfd, struct bfd_link_info *info)
{
bfd *ibfd;
asection *sec;
@ -6823,7 +6823,10 @@ _bfd_elf_merge_sections (bfd *abfd, struct bfd_link_info *info)
return FALSE;
for (ibfd = info->input_bfds; ibfd != NULL; ibfd = ibfd->link.next)
if ((ibfd->flags & DYNAMIC) == 0)
if ((ibfd->flags & DYNAMIC) == 0
&& bfd_get_flavour (ibfd) == bfd_target_elf_flavour
&& (elf_elfheader (ibfd)->e_ident[EI_CLASS]
== get_elf_backend_data (obfd)->s->elfclass))
for (sec = ibfd->sections; sec != NULL; sec = sec->next)
if ((sec->flags & SEC_MERGE) != 0
&& !bfd_is_abs_section (sec->output_section))
@ -6831,7 +6834,7 @@ _bfd_elf_merge_sections (bfd *abfd, struct bfd_link_info *info)
struct bfd_elf_section_data *secdata;
secdata = elf_section_data (sec);
if (! _bfd_add_merge_section (abfd,
if (! _bfd_add_merge_section (obfd,
&elf_hash_table (info)->merge_info,
sec, &secdata->sec_info))
return FALSE;
@ -6840,7 +6843,7 @@ _bfd_elf_merge_sections (bfd *abfd, struct bfd_link_info *info)
}
if (elf_hash_table (info)->merge_info != NULL)
_bfd_merge_sections (abfd, info, elf_hash_table (info)->merge_info,
_bfd_merge_sections (obfd, info, elf_hash_table (info)->merge_info,
merge_sections_remove_hook);
return TRUE;
}