aboutsummaryrefslogtreecommitdiff
path: root/bfd
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2018-07-03 17:57:36 +0930
committerAlan Modra <amodra@gmail.com>2018-07-03 18:52:52 +0930
commitb8a6ced79668ec8af3180e50b76f7517ebbab0d9 (patch)
treed1eea4f9ae80bbf669ba5f268fb6e2bfb4b05847 /bfd
parent8d2c8c3d17926826864f4b739362f66af547428f (diff)
downloadgdb-b8a6ced79668ec8af3180e50b76f7517ebbab0d9.zip
gdb-b8a6ced79668ec8af3180e50b76f7517ebbab0d9.tar.gz
gdb-b8a6ced79668ec8af3180e50b76f7517ebbab0d9.tar.bz2
Correct removal of .gnu.attributes
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.
Diffstat (limited to 'bfd')
-rw-r--r--bfd/ChangeLog5
-rw-r--r--bfd/elflink.c18
2 files changed, 16 insertions, 7 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index b4dbd2e..d111645 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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
diff --git a/bfd/elflink.c b/bfd/elflink.c
index e5592b0..aabbf7f 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--;