Support ELF SHF_GNU_MBIND and PT_GNU_MBIND_XXX
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 4 Apr 2017 16:05:48 +0000 (09:05 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 4 Apr 2017 16:06:04 +0000 (09:06 -0700)
commita91e1603afb6704545793e967a1a3dfe96b389de
tree631a0fd733778fbcc14c12f41c4fdb88f3348737
parentb52920324fabbcad93042f2e17de52696d0dab42
Support ELF SHF_GNU_MBIND and PT_GNU_MBIND_XXX

Mark an ALLOC section, which should be placed in special memory area,
with SHF_GNU_MBIND.  Its sh_info field indicates the special memory
type.  GNU_MBIND section names start with ".mbind" so that they are
placed as orphan sections by linker.  All input GNU_MBIND sections
with the same sh_type, sh_flags and sh_info are placed in one output
GNU_MBIND section.  In executable and shared object, create a
GNU_MBIND segment for each GNU_MBIND section and its segment type is
PT_GNU_MBIND_LO plus the sh_info value.  Each GNU_MBIND segment is
aligned at page boundary.

The assembler syntax:

    .section .mbind.foo,"adx",%progbits
                          ^             0: Special memory type.
                          |
                         'd' for SHF_GNU_MBIND.

    .section .mbind.foo,"adx",%progbits,0x1
                          ^             1: Special memory type.
                          |
                         'd' for SHF_GNU_MBIND.

    .section .mbind.bar,"adG",%progbits,.foo_group,comdat,0x2
                          ^                               2: Special memory type.
                          |
                         'd' for SHF_GNU_MBIND.

bfd/

* elf.c (get_program_header_size): Add a GNU_MBIND segment for
each GNU_MBIND section and align GNU_MBIND section to page size.
(_bfd_elf_map_sections_to_segments): Create a GNU_MBIND
segment for each GNU_MBIND section.
(_bfd_elf_init_private_section_data): Copy sh_info from input
for GNU_MBIND section.

binutils/

* NEWS: Mention support for ELF SHF_GNU_MBIND and
PT_GNU_MBIND_XXX.
* readelf.c (get_segment_type): Handle PT_GNU_MBIND_XXX.
(get_elf_section_flags): Handle SHF_GNU_MBIND.
(process_section_headers): Likewise.
* testsuite/binutils-all/mbind1.s: New file.
* testsuite/binutils-all/objcopy.exp: Run readelf test on
mbind1.s.

gas/

* NEWS: Mention support for ELF SHF_GNU_MBIND.
* config/obj-elf.c (section_match): New.
(get_section): Match both sh_info and group name.
(obj_elf_change_section): Add argument for sh_info.  Pass both
sh_info and group name to get_section. Issue an error for
SHF_GNU_MBIND section without SHF_ALLOC.  Set sh_info.
(obj_elf_parse_section_letters): Set SHF_GNU_MBIND for 'd'.
(obj_elf_section): Support SHF_GNU_MBIND section info.
* config/obj-elf.h (obj_elf_change_section): Add argument for
sh_info.
* config/tc-arm.c (start_unwind_section): Pass 0 as sh_info to
obj_elf_change_section.
* config/tc-ia64.c (obj_elf_vms_common): Likewise.
* config/tc-microblaze.c (microblaze_s_data): Likewise.
(microblaze_s_sdata): Likewise.
(microblaze_s_rdata): Likewise.
(microblaze_s_bss): Likewise.
* config/tc-mips.c (s_change_section): Likewise.
* config/tc-msp430.c (msp430_profiler): Likewise.
* config/tc-rx.c (parse_rx_section): Likewise.
* config/tc-tic6x.c (tic6x_start_unwind_section): Likewise.
* doc/as.texinfo: Document 'd' for SHF_GNU_MBIND.
* testsuite/gas/elf/elf.exp: Run section12a, section12b and
section13.
* testsuite/gas/elf/section10.d: Updated.
* testsuite/gas/elf/section10.s: Likewise.
* testsuite/gas/elf/section12.s: New file.
* testsuite/gas/elf/section12a.d: Likewise.
* testsuite/gas/elf/section12b.d: Likewise.
* testsuite/gas/elf/section13.l: Likewise.
* testsuite/gas/elf/section13.d: Likewise.
* testsuite/gas/elf/section13.s: Likewise.

include/

* elf/common.h (PT_GNU_MBIND_NUM): New.
(PT_GNU_MBIND_LO): Likewise.
(PT_GNU_MBIND_HI): Likewise.
(SHF_GNU_MBIND): Likewise.

ld/

* NEWS: Mention support for ELF SHF_GNU_MBIND and
PT_GNU_MBIND_XXX.
* emultempl/elf32.em (gld${EMULATION_NAME}_place_orphan): Place
input GNU_MBIND sections with the same type, attributes and
sh_info field into a single output GNU_MBIND section.
* testsuite/ld-elf/elf.exp: Run mbind2a and mbind2b.
* testsuite/ld-elf/mbind1.s: New file.
* testsuite/ld-elf/mbind1a.d: Likewise.
* testsuite/ld-elf/mbind1b.d: Likewise.
* testsuite/ld-elf/mbind1c.d: Likewise.
* testsuite/ld-elf/mbind2a.s: Likewise.
* testsuite/ld-elf/mbind2b.c: Likewise.
40 files changed:
bfd/ChangeLog
bfd/elf.c
binutils/ChangeLog
binutils/NEWS
binutils/readelf.c
binutils/testsuite/binutils-all/mbind1.s [new file with mode: 0644]
binutils/testsuite/binutils-all/objcopy.exp
gas/ChangeLog
gas/NEWS
gas/config/obj-elf.c
gas/config/obj-elf.h
gas/config/tc-arm.c
gas/config/tc-ia64.c
gas/config/tc-microblaze.c
gas/config/tc-mips.c
gas/config/tc-msp430.c
gas/config/tc-rx.c
gas/config/tc-tic6x.c
gas/doc/as.texinfo
gas/testsuite/gas/elf/elf.exp
gas/testsuite/gas/elf/section10.d
gas/testsuite/gas/elf/section10.s
gas/testsuite/gas/elf/section12.s [new file with mode: 0644]
gas/testsuite/gas/elf/section12a.d [new file with mode: 0644]
gas/testsuite/gas/elf/section12b.d [new file with mode: 0644]
gas/testsuite/gas/elf/section13.d [new file with mode: 0644]
gas/testsuite/gas/elf/section13.l [new file with mode: 0644]
gas/testsuite/gas/elf/section13.s [new file with mode: 0644]
include/ChangeLog
include/elf/common.h
ld/ChangeLog
ld/NEWS
ld/emultempl/elf32.em
ld/testsuite/ld-elf/elf.exp
ld/testsuite/ld-elf/mbind1.s [new file with mode: 0644]
ld/testsuite/ld-elf/mbind1a.d [new file with mode: 0644]
ld/testsuite/ld-elf/mbind1b.d [new file with mode: 0644]
ld/testsuite/ld-elf/mbind1c.d [new file with mode: 0644]
ld/testsuite/ld-elf/mbind2a.s [new file with mode: 0644]
ld/testsuite/ld-elf/mbind2b.c [new file with mode: 0644]