Consistency check for merge sections
authorAlan Modra <amodra@gmail.com>
Wed, 30 Sep 2015 02:15:32 +0000 (11:45 +0930)
committerAlan Modra <amodra@gmail.com>
Wed, 30 Sep 2015 06:36:09 +0000 (16:06 +0930)
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.

bfd/ChangeLog
bfd/elflink.c

index 16dd16601bc0d054816d60adce2af4fef7729f3b..f4ca2ec55f27a7b293cb12431345671a01e40310 100644 (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
index ff7ae73b89ccabff5d3b0fd3afbf928033f1ba78..90af6cfdfa0db957995614c3185a762ca302337e 100644 (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;
 }