Correct removal of .gnu.attributes
authorAlan Modra <amodra@gmail.com>
Tue, 3 Jul 2018 08:27:36 +0000 (17:57 +0930)
committerAlan Modra <amodra@gmail.com>
Tue, 3 Jul 2018 09:22:52 +0000 (18:52 +0930)
Setting SEC_EXCLUDE for empty .gnu.attributes is too late in the link
process for the linker to remove the section.  That must be done in
bfd_elf_final_link, as we do for removed group sections.

* elflink.c (bfd_elf_final_link): Remove zero size .gnu.attributes
sections.

bfd/ChangeLog
bfd/elflink.c

index b4dbd2e..d111645 100644 (file)
@@ -1,5 +1,10 @@
 2018-07-03  Alan Modra  <amodra@gmail.com>
 
+       * elflink.c (bfd_elf_final_link): Remove zero size .gnu.attributes
+       sections.
+
+2018-07-03  Alan Modra  <amodra@gmail.com>
+
        * elf-bfd.h (ATTR_TYPE_FLAG_ERROR, ATTR_TYPE_HAS_ERROR): Define.
        * elf-attrs.c (is_default_attr): Handle ATTR_TYPE_HAS_ERROR.
        * elf32-ppc.c (_bfd_elf_ppc_merge_fp_attributes): Use
index e5592b0..aabbf7f 100644 (file)
@@ -11719,6 +11719,8 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
   std_attrs_section = get_elf_backend_data (abfd)->obj_attrs_section;
   for (o = abfd->sections; o != NULL; o = o->next)
     {
+      bfd_boolean remove = FALSE;
+
       if ((std_attrs_section && strcmp (o->name, std_attrs_section) == 0)
          || strcmp (o->name, ".gnu.attributes") == 0)
        {
@@ -11735,19 +11737,21 @@ bfd_elf_final_link (bfd *abfd, struct bfd_link_info *info)
            }
 
          attr_size = bfd_elf_obj_attr_size (abfd);
+         bfd_set_section_size (abfd, o, attr_size);
+         /* Skip this section later on.  */
+         o->map_head.link_order = NULL;
          if (attr_size)
-           {
-             bfd_set_section_size (abfd, o, attr_size);
-             attr_section = o;
-             /* Skip this section later on.  */
-             o->map_head.link_order = NULL;
-           }
+           attr_section = o;
          else
-           o->flags |= SEC_EXCLUDE;
+           remove = TRUE;
        }
       else if ((o->flags & SEC_GROUP) != 0 && o->size == 0)
        {
          /* Remove empty group section from linker output.  */
+         remove = TRUE;
+       }
+      if (remove)
+       {
          o->flags |= SEC_EXCLUDE;
          bfd_section_list_remove (abfd, o);
          abfd->section_count--;