Skip to content
  • H.J. Lu's avatar
    elf: Add PT_GNU_PROPERTY segment type · 0a59decb
    H.J. Lu authored
    Linkers group input note sections with the same name into one output
    note section with the same name.  One output note section is placed in
    one PT_NOTE segment.  New linkers merge all input .note.gnu.property
    sections into one output .note.gnu.property section with a single
    NT_GNU_PROPERTY_TYPE_0 note in a single PT_NOTE segment.  Since older
    linkers treat input .note.gnu.property section as a generic note section
    and just concatenate all input .note.gnu.property sections into one
    output .note.gnu.property section without merging them, we may
    see one or more NT_GNU_PROPERTY_TYPE_0 notes in PT_NOTE segment, which
    are invalid.
    
    GNU_PROPERTY_X86_UINT32_VALID was defined to address this issue such
    that linker sets the bit for non-relocatable outputs.  But it isn't
    sufficient:
    
    1. It doesn't cover generic properties.
    2. When -mx86-used-note=yes is passed to x86 assembler, the
    GNU_PROPERTY_X86_UINT32_VALID bit is set in GNU_PROPERTY_X86_ISA_1_USED
    property in object file and older linkers generate invalid
    NT_GNU_PROPERTY_TYPE_0 notes with the GNU_PROPERTY_X86_UINT32_VALID bit
    set.
    
    I am proposing the following changes:
    
    1. Add PT_GNU_PROPERTY segment type:
    
     # define PT_GNU_PROPERTY (PT_LOOS + 0x474e553)
    
    which covers .note.gnu.property section.
    2. Remove GNU_PROPERTY_X86_UINT32_VALID.
    
    bfd/
    
    	PR ld/23900
    	* elf.c (get_program_header_size): Add a PT_GNU_PROPERTY
    	segment for NOTE_GNU_PROPERTY_SECTION_NAME.
    	(_bfd_elf_map_sections_to_segments): Create a PT_GNU_PROPERTY
    	segment for NOTE_GNU_PROPERTY_SECTION_NAME.
    	* elfxx-x86.c (_bfd_elf_link_setup_gnu_properties): Don't set
    	GNU_PROPERTY_X86_UINT32_VALID.
    
    binutils/
    
    	PR ld/23900
    	* readelf.c (get_segment_type): Support PT_GNU_PROPERTY.
    	(decode_x86_isa): Don't check GNU_PROPERTY_X86_UINT32_VALID.
    	(decode_x86_feature_1): Likewise.
    	(decode_x86_feature_2): Likewise.
    	(print_gnu_property_note): Remove GNU_PROPERTY_X86_UINT32_VALID
    	check.
    	* testsuite/binutils-all/i386/empty.d: Updated.
    	* testsuite/binutils-all/x86-64/empty-x32.d: Likewise.
    	* testsuite/binutils-all/x86-64/empty.d: Likewise.
    	* testsuite/binutils-all/i386/pr21231b.s: Change
    	GNU_PROPERTY_X86_ISA_1_USED bits to 0x7fffffff.
    	* testsuite/binutils-all/x86-64/pr21231b.s: Likewise.
    
    gas/
    
    	PR ld/23900
    	* config/tc-i386.c (x86_cleanup): Don't set
    	GNU_PROPERTY_X86_UINT32_VALID.
    	* testsuite/gas/i386/property-1.s: Change
    	GNU_PROPERTY_X86_ISA_1_USED bits to 0.
    
    include/
    
    	PR ld/23900
    	* elf/common.h (PT_GNU_PROPERTY): New.
    	(GNU_PROPERTY_X86_UINT32_VALID): Removed.
    
    ld/
    
    	PR ld/23900
    	* testsuite/ld-elf/elf.exp: Run PR ld/23900 test.
    	* testsuite/ld-elf/pr23900-1-32.rd: New file.
    	* testsuite/ld-elf/pr23900-1-64.rd: Likewise.
    	* testsuite/ld-elf/pr23900-1.d: Likewise.
    	* testsuite/ld-elf/pr23900-1.s: Likewise.
    	* testsuite/ld-elf/pr23900-2.s: Likewise.
    	* testsuite/ld-elf/pr23900-2a.d: Likewise.
    	* testsuite/ld-elf/pr23900-2b.d: Likewise.
    	* testsuite/ld-i386/ibt-plt-1.d: Adjusted.
    	* testsuite/ld-i386/ibt-plt-2c.d: Likewise.
    	* testsuite/ld-i386/ibt-plt-2d.d: Likewise.
    	* testsuite/ld-i386/ibt-plt-3d.d: Likewise.
    	* testsuite/ld-x86-64/ibt-plt-1-x32.d: Likewise.
    	* testsuite/ld-x86-64/ibt-plt-1.d: Likewise.
    	* testsuite/ld-x86-64/ibt-plt-2c-x32.d: Likewise.
    	* testsuite/ld-x86-64/ibt-plt-2c.d: Likewise.
    	* testsuite/ld-x86-64/ibt-plt-2d-x32.d: Likewise.
    	* testsuite/ld-x86-64/ibt-plt-2c.d: Likewise.
    	* testsuite/ld-x86-64/ibt-plt-3c-x32.d: Likewise.
    	* testsuite/ld-x86-64/ibt-plt-3c.d: Likewise.
    	* testsuite/ld-x86-64/ibt-plt-3d-x32.d: Likewise.
    	* testsuite/ld-x86-64/ibt-plt-3d.d: Likewise.
    	* testsuite/ld-i386/pr23372c.d: Expect <None>
    	for GNU_PROPERTY_X86_ISA_1_USED.
    	* testsuite/ld-x86-64/pr23372c-x32.d: Likewise.
    	* testsuite/ld-x86-64/pr23372c.d: Likewise.
    	* testsuite/ld-x86-64/pr23372d-x32.d: Likewise.
    	* testsuite/ld-x86-64/pr23372d.d: Likewise.
    	* testsuite/ld-x86-64/property-x86-5a.s: Change
    	GNU_PROPERTY_X86_ISA_1_USED bits to 0.
    	* testsuite/ld-x86-64/property-x86-5b.s: Likewise.
    0a59decb
To find the state of this project's repository at the time of any of these versions, check out the tags.