From: Alan Modra Date: Wed, 30 Sep 2015 02:15:32 +0000 (+0930) Subject: Consistency check for merge sections X-Git-Tag: users/ARM/embedded-binutils-2_26-branch-2016q1~555 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=630993ec93fed0f2da1c4511b865cc69f5f0e835;p=thirdparty%2Fbinutils-gdb.git 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. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 16dd16601bc..f4ca2ec55f2 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2015-09-30 Alan Modra + + 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 * config.bfd (targ_selvecs): Add fdpic and misc targets diff --git a/bfd/elflink.c b/bfd/elflink.c index ff7ae73b89c..90af6cfdfa0 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -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; }