diff options
author | Alan Modra <amodra@gmail.com> | 2018-07-03 17:57:36 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2018-07-03 18:52:52 +0930 |
commit | b8a6ced79668ec8af3180e50b76f7517ebbab0d9 (patch) | |
tree | d1eea4f9ae80bbf669ba5f268fb6e2bfb4b05847 /bfd | |
parent | 8d2c8c3d17926826864f4b739362f66af547428f (diff) | |
download | gdb-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/ChangeLog | 5 | ||||
-rw-r--r-- | bfd/elflink.c | 18 |
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--; |