From 862a04415e1b490b4561fe5a44c9fa4120c50825 Mon Sep 17 00:00:00 2001 From: Jozef Lawrynowicz Date: Tue, 22 Sep 2020 21:00:35 +0100 Subject: [PATCH] Support SHF_GNU_RETAIN ELF section flag The GNU-specific SHF_GNU_RETAIN ELF section flag is defined as follows: ======================================================================= Section Attribute Flags +-------------------------------------+ | Name | Value | +-------------------------------------+ | SHF_GNU_RETAIN | 0x200000 (1 << 21) | +-------------------------------------+ SHF_GNU_RETAIN The link editor should not garbage collect the section if it is unused. ======================================================================= The new ".retain" assembler directive can be used to apply SHF_GNU_RETAIN to a section. Note that there is not a direct mapping of SHF_GNU_RETAIN to the BFD section flag SEC_KEEP. SEC_KEEP would prevent the user being able to explicitly remove an SHF_GNU_RETAIN section by placing it in /DISCARD/. bfd/ChangeLog: 2020-09-22 Jozef Lawrynowicz * elflink.c (bfd_elf_gc_sections): gc_mark the section if SHF_GNU_RETAIN is set. binutils/ChangeLog: 2020-09-22 Jozef Lawrynowicz * NEWS: Announce SHF_GNU_RETAIN. * readelf.c (get_elf_section_flags): Handle SHF_GNU_RETAIN. * testsuite/binutils-all/readelf.exp: Run new test. Don't run run_dump_test when there isn't an assembler available. * testsuite/binutils-all/retain1.d: New test. * testsuite/binutils-all/retain1.s: New test. gas/ChangeLog: 2020-09-22 Jozef Lawrynowicz * NEWS: Announce .retain directive and SHF_GNU_RETAIN. * config/obj-elf.c (elf_pseudo_table): Add "retain". (obj_elf_retain): New. (obj_elf_parse_section_letters): Handle 'R' flag. * doc/as.texi: Document .retain directive. (Section): Document 'R' flag. * testsuite/gas/elf/elf.exp: Run new tests. * testsuite/gas/elf/retain1.d: New test. * testsuite/gas/elf/retain1.s: New test. * testsuite/gas/elf/retain2.d: New test. * testsuite/gas/elf/retain2.l: New test. * testsuite/gas/elf/retain2.s: New test. * testsuite/gas/elf/retain3.d: New test. * testsuite/gas/elf/retain3.s: New test. * testsuite/gas/elf/section10.d: Adjust test. include/ChangeLog: 2020-09-22 Jozef Lawrynowicz * elf/common.h (SHF_GNU_RETAIN): Define. ld/ChangeLog: 2020-09-22 Jozef Lawrynowicz * NEWS: Announce SHF_GNU_RETAIN. * ld.texi (garbage collection): Document SHF_GNU_RETAIN. (Output Section Discarding): Likewise. * testsuite/ld-elf/elf.exp: Run new tests. * testsuite/ld-elf/retain1.msg: New test. * testsuite/ld-elf/retain1.s: New test. * testsuite/ld-elf/retain2.d: New test. * testsuite/ld-elf/retain2.ld: New test. * testsuite/ld-elf/retain2.map: New test. * testsuite/ld-elf/retain3.msg: New test. * testsuite/ld-elf/retain3.s: New test. * testsuite/ld-elf/retain4.s: New test. * testsuite/ld-elf/retain5.s: New test. * testsuite/ld-elf/retain6lib.s: New test. * testsuite/ld-elf/retain6main.s: New test. * testsuite/ld-elf/retain7.msg: New test. * testsuite/ld-elf/retain7lib.s: New test. * testsuite/ld-elf/retain7main.s: New test. --- bfd/elflink.c | 3 +- binutils/NEWS | 4 + binutils/readelf.c | 4 + binutils/testsuite/binutils-all/readelf.exp | 6 +- binutils/testsuite/binutils-all/retain1.d | 17 +++ binutils/testsuite/binutils-all/retain1.s | 114 ++++++++++++++++++++ gas/NEWS | 4 + gas/config/obj-elf.c | 71 +++++++++++- gas/doc/as.texi | 20 ++++ gas/testsuite/gas/elf/elf.exp | 7 ++ gas/testsuite/gas/elf/retain1.d | 24 +++++ gas/testsuite/gas/elf/retain1.s | 114 ++++++++++++++++++++ gas/testsuite/gas/elf/retain2.d | 3 + gas/testsuite/gas/elf/retain2.l | 3 + gas/testsuite/gas/elf/retain2.s | 7 ++ gas/testsuite/gas/elf/retain3.d | 24 +++++ gas/testsuite/gas/elf/retain3.s | 104 ++++++++++++++++++ gas/testsuite/gas/elf/retain4.d | 6 ++ gas/testsuite/gas/elf/retain4.s | 20 ++++ gas/testsuite/gas/elf/retain5.d | 6 ++ gas/testsuite/gas/elf/retain5.s | 18 ++++ gas/testsuite/gas/elf/section10.d | 4 +- include/elf/common.h | 1 + ld/NEWS | 4 + ld/ld.texi | 8 ++ ld/testsuite/ld-elf/elf.exp | 33 ++++++ ld/testsuite/ld-elf/retain1.msg | 9 ++ ld/testsuite/ld-elf/retain1.s | 114 ++++++++++++++++++++ ld/testsuite/ld-elf/retain2.d | 6 ++ ld/testsuite/ld-elf/retain2.ld | 7 ++ ld/testsuite/ld-elf/retain2.map | 32 ++++++ ld/testsuite/ld-elf/retain3.msg | 9 ++ ld/testsuite/ld-elf/retain3.s | 104 ++++++++++++++++++ ld/testsuite/ld-elf/retain4.s | 19 ++++ ld/testsuite/ld-elf/retain5.s | 13 +++ ld/testsuite/ld-elf/retain6lib.s | 6 ++ ld/testsuite/ld-elf/retain6main.s | 5 + ld/testsuite/ld-elf/retain7.msg | 1 + ld/testsuite/ld-elf/retain7lib.s | 17 +++ ld/testsuite/ld-elf/retain7main.s | 13 +++ 40 files changed, 977 insertions(+), 7 deletions(-) create mode 100644 binutils/testsuite/binutils-all/retain1.d create mode 100644 binutils/testsuite/binutils-all/retain1.s create mode 100644 gas/testsuite/gas/elf/retain1.d create mode 100644 gas/testsuite/gas/elf/retain1.s create mode 100644 gas/testsuite/gas/elf/retain2.d create mode 100644 gas/testsuite/gas/elf/retain2.l create mode 100644 gas/testsuite/gas/elf/retain2.s create mode 100644 gas/testsuite/gas/elf/retain3.d create mode 100644 gas/testsuite/gas/elf/retain3.s create mode 100644 gas/testsuite/gas/elf/retain4.d create mode 100644 gas/testsuite/gas/elf/retain4.s create mode 100644 gas/testsuite/gas/elf/retain5.d create mode 100644 gas/testsuite/gas/elf/retain5.s create mode 100644 ld/testsuite/ld-elf/retain1.msg create mode 100644 ld/testsuite/ld-elf/retain1.s create mode 100644 ld/testsuite/ld-elf/retain2.d create mode 100644 ld/testsuite/ld-elf/retain2.ld create mode 100644 ld/testsuite/ld-elf/retain2.map create mode 100644 ld/testsuite/ld-elf/retain3.msg create mode 100644 ld/testsuite/ld-elf/retain3.s create mode 100644 ld/testsuite/ld-elf/retain4.s create mode 100644 ld/testsuite/ld-elf/retain5.s create mode 100644 ld/testsuite/ld-elf/retain6lib.s create mode 100644 ld/testsuite/ld-elf/retain6main.s create mode 100644 ld/testsuite/ld-elf/retain7.msg create mode 100644 ld/testsuite/ld-elf/retain7lib.s create mode 100644 ld/testsuite/ld-elf/retain7main.s diff --git a/bfd/elflink.c b/bfd/elflink.c index 0e339f3c1e..6d1a1c5105 100644 --- a/bfd/elflink.c +++ b/bfd/elflink.c @@ -13977,7 +13977,8 @@ bfd_elf_gc_sections (bfd *abfd, struct bfd_link_info *info) || (elf_section_data (o)->this_hdr.sh_type == SHT_FINI_ARRAY))) || (elf_section_data (o)->this_hdr.sh_type == SHT_NOTE - && elf_next_in_group (o) == NULL ))) + && elf_next_in_group (o) == NULL) + || (elf_section_flags (o) & SHF_GNU_RETAIN))) { if (!_bfd_elf_gc_mark (info, o, gc_mark_hook)) return FALSE; diff --git a/binutils/NEWS b/binutils/NEWS index c0dc73d7d8..6c7d3f3953 100644 --- a/binutils/NEWS +++ b/binutils/NEWS @@ -4,6 +4,10 @@ symbol names. In addition the --demangle=