Support SHF_GNU_RETAIN ELF section flag
authorJozef Lawrynowicz <jozef.l@mittosystems.com>
Wed, 18 Nov 2020 11:51:13 +0000 (11:51 +0000)
committerJozef Lawrynowicz <jozef.l@mittosystems.com>
Wed, 18 Nov 2020 11:51:13 +0000 (11:51 +0000)
commit99fabbc9739a87ba3433e66792e93b773896790e
tree6a52b12cc648532f3b38fd102cec221a207188ba
parent40d9d2fd796a184f04a83ca4442fd78034b5e00b
Support SHF_GNU_RETAIN ELF section flag

The SHF_GNU_RETAIN section flag is an extension to the GNU ELF OSABI.
It 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.
=========================================================

The .section directive accepts the "R" flag, which indicates
SHF_GNU_RETAIN should be applied to the section.

There is not a direct mapping of SHF_GNU_RETAIN to the BFD
section flag SEC_KEEP. Keeping these flags distinct allows
SHF_GNU_RETAIN sections to be explicitly removed by placing them in
/DISCARD/.

bfd/ChangeLog:

* elf-bfd.h (enum elf_gnu_osabi): Add elf_gnu_osabi_retain.
(struct elf_obj_tdata): Increase has_gnu_osabi to 4 bits.
* elf.c (_bfd_elf_make_section_from_shdr): Set elf_gnu_osabi_retain
for SHF_GNU_RETAIN.
(_bfd_elf_final_write_processing): Report if SHF_GNU_RETAIN is
not supported by the OSABI.
Adjust error messages.
* elflink.c (elf_link_input_bfd): Copy enabled has_gnu_osabi bits from
input BFD to output BFD.
(bfd_elf_gc_sections): gc_mark the section if SHF_GNU_RETAIN is set.

binutils/ChangeLog:

* NEWS: Announce SHF_GNU_RETAIN support.
* readelf.c (get_elf_section_flags): Handle SHF_GNU_RETAIN.
Recognize SHF_GNU_RETAIN and SHF_GNU_MBIND only for supported OSABIs.
* testsuite/binutils-all/readelf.exp: Run new tests.
Don't run run_dump_test when there isn't an assembler available.
* testsuite/lib/binutils-common.exp (supports_gnu_osabi): Adjust
comment.
* testsuite/binutils-all/readelf-maskos-1a.d: New test.
* testsuite/binutils-all/readelf-maskos-1b.d: New test.
* testsuite/binutils-all/readelf-maskos.s: New test.
* testsuite/binutils-all/retain1.s: New test.
* testsuite/binutils-all/retain1a.d: New test.
* testsuite/binutils-all/retain1b.d: New test.

gas/ChangeLog:

* NEWS: Announce SHF_GNU_RETAIN support.
* config/obj-elf.c (obj_elf_change_section): Merge SHF_GNU_RETAIN bit
between section declarations.
(obj_elf_parse_section_letters): Handle 'R' flag.
Handle numeric flag values within the SHF_MASKOS range.
(obj_elf_section): Validate SHF_GNU_RETAIN usage.
* doc/as.texi: Document 'R' flag to .section directive.
* testsuite/gas/elf/elf.exp: Run new tests.
* testsuite/gas/elf/section10.d: Unset SHF_GNU_RETAIN bit.
* testsuite/gas/elf/section10.s: Likewise.
* testsuite/gas/elf/section22.d: New test.
* testsuite/gas/elf/section22.s: New test.
* testsuite/gas/elf/section23.s: New test.
* testsuite/gas/elf/section23a.d: New test.
* testsuite/gas/elf/section23b.d: New test.
* testsuite/gas/elf/section23b.err: New test.
* testsuite/gas/elf/section24.l: New test.
* testsuite/gas/elf/section24.s: New test.
* testsuite/gas/elf/section24a.d: New test.
* testsuite/gas/elf/section24b.d: New test.

include/ChangeLog:

* elf/common.h (SHF_GNU_RETAIN): Define.

ld/ChangeLog:

* NEWS: Announce support for 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.s: New test.
* testsuite/ld-elf/retain1a.d: New test.
* testsuite/ld-elf/retain1b.d: 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.d: New test.
* testsuite/ld-elf/retain3.s: New test.
* testsuite/ld-elf/retain4.d: New test.
* testsuite/ld-elf/retain4.s: New test.
* testsuite/ld-elf/retain5.d: New test.
* testsuite/ld-elf/retain5.map: New test.
* testsuite/ld-elf/retain5lib.s: New test.
* testsuite/ld-elf/retain5main.s: New test.
* testsuite/ld-elf/retain6a.d: New test.
* testsuite/ld-elf/retain6b.d: New test.
* testsuite/ld-elf/retain6lib.s: New test.
* testsuite/ld-elf/retain6main.s: New test.
55 files changed:
bfd/ChangeLog
bfd/elf-bfd.h
bfd/elf.c
bfd/elflink.c
binutils/ChangeLog
binutils/NEWS
binutils/readelf.c
binutils/testsuite/binutils-all/readelf-maskos-1a.d [new file with mode: 0644]
binutils/testsuite/binutils-all/readelf-maskos-1b.d [new file with mode: 0644]
binutils/testsuite/binutils-all/readelf-maskos.s [new file with mode: 0644]
binutils/testsuite/binutils-all/readelf.exp
binutils/testsuite/binutils-all/retain1.s [new file with mode: 0644]
binutils/testsuite/binutils-all/retain1a.d [new file with mode: 0644]
binutils/testsuite/binutils-all/retain1b.d [new file with mode: 0644]
binutils/testsuite/lib/binutils-common.exp
gas/ChangeLog
gas/NEWS
gas/config/obj-elf.c
gas/doc/as.texi
gas/testsuite/gas/elf/elf.exp
gas/testsuite/gas/elf/section10.d
gas/testsuite/gas/elf/section10.s
gas/testsuite/gas/elf/section22.d [new file with mode: 0644]
gas/testsuite/gas/elf/section22.s [new file with mode: 0644]
gas/testsuite/gas/elf/section23.s [new file with mode: 0644]
gas/testsuite/gas/elf/section23a.d [new file with mode: 0644]
gas/testsuite/gas/elf/section23b.d [new file with mode: 0644]
gas/testsuite/gas/elf/section23b.err [new file with mode: 0644]
gas/testsuite/gas/elf/section24.s [new file with mode: 0644]
gas/testsuite/gas/elf/section24a.d [new file with mode: 0644]
gas/testsuite/gas/elf/section24b.d [new file with mode: 0644]
include/ChangeLog
include/elf/common.h
ld/ChangeLog
ld/NEWS
ld/ld.texi
ld/testsuite/ld-elf/elf.exp
ld/testsuite/ld-elf/retain1.s [new file with mode: 0644]
ld/testsuite/ld-elf/retain1a.d [new file with mode: 0644]
ld/testsuite/ld-elf/retain1b.d [new file with mode: 0644]
ld/testsuite/ld-elf/retain2.d [new file with mode: 0644]
ld/testsuite/ld-elf/retain2.ld [new file with mode: 0644]
ld/testsuite/ld-elf/retain2.map [new file with mode: 0644]
ld/testsuite/ld-elf/retain3.d [new file with mode: 0644]
ld/testsuite/ld-elf/retain3.s [new file with mode: 0644]
ld/testsuite/ld-elf/retain4.d [new file with mode: 0644]
ld/testsuite/ld-elf/retain4.s [new file with mode: 0644]
ld/testsuite/ld-elf/retain5.d [new file with mode: 0644]
ld/testsuite/ld-elf/retain5.map [new file with mode: 0644]
ld/testsuite/ld-elf/retain5lib.s [new file with mode: 0644]
ld/testsuite/ld-elf/retain5main.s [new file with mode: 0644]
ld/testsuite/ld-elf/retain6a.d [new file with mode: 0644]
ld/testsuite/ld-elf/retain6b.d [new file with mode: 0644]
ld/testsuite/ld-elf/retain6lib.s [new file with mode: 0644]
ld/testsuite/ld-elf/retain6main.s [new file with mode: 0644]