GNU attribute output on errors

Alan Modra amodra@gmail.com
Tue Jul 3 10:23:00 GMT 2018


On Tue, Jul 03, 2018 at 09:49:32AM +0100, Nick Clifton wrote:
> Hi Alan,
> 
> > Nick, I'd like this on the branch too.  Is that OK?
> 
> Yup - please go ahead.

More testing revealed another problem.

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.

diff --git a/bfd/elflink.c b/bfd/elflink.c
index e5592b023a..aabbf7f667 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -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--;

-- 
Alan Modra
Australia Development Lab, IBM



More information about the Binutils mailing list