This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[gold commit] PR 16711: Fix problems with bss handling in linker scripts


PR 16711 noted that gold allocates file space for BSS sections when
using a linker script. I've fixed that by rewriting
set_section_addresses and set_section_list_addresses to track the file
offset separate from the current virtual address, so that BSS sections
do not move the file offset. Now, if a series of BSS sections come at
the end of a segment, we do not  allocate file space; but if a script
forces them into the middle of a segment, we will still allocate file
space (matching Gnu ld behavior). I've also added a warning when that
happens.

That exposed another problem where orphan .bss sections were sometimes
placed in the middle of a segment. For example, if the script mentions
the .got section, but both .data and .bss are orphans, gold would put
both .data and .bss in front of .got. I've fixed that by ensuring that
orphan BSS sections are always placed after all other allocated
sections.

It also exposed a problem where the SUBALIGN property is not handled
properly. The ld manual clearly states that it should override input
section alignment, whether greater or less than the given alignment,
but gold would only increase an input section's alignment. Gold would
also place the output section based on its original alignment before
the SUBALIGN property took effect, leading to a misaligned output
section (where the input section was properly aligned in memory, but
was not aligned relative to the start of the section), in violation of
the ELF/gABI spec. I've fixed that by making sure that the SUBALIGN
property overrides the internal alignment of the input sections as
well as the external alignment of the output section. This affected
the behavior of script_test_2, which was written to expect a
misaligned section.

The net effect is, I think, improved compatibility with the BFD
linker. There are still cases where orphan placement differs, but the
differences should be rarer and less important. ALIGN and SUBALIGN
behavior is closer, but still not an exact match -- I still found
cases where ld would create a misaligned output section, and where
gold will properly align it.

-cary


2016-12-11  Cary Coutant  <ccoutant@gmail.com>

gold/
        PR gold/16711
        * output.cc (Output_section::set_final_data_size): Calculate data size
        based on relative offset rather than file offset.
        (Output_segment::set_section_addresses): Track file offset separately
        from address offset.
        (Output_segment::set_section_list_addresses): Add pfoff parameter.
        Track file offset separately.  Don't move file offset for BSS
        sections.
        * output.h (Output_segment::set_section_list_addresses): Add pfoff
        parameter.
        * script-sections.cc (Orphan_section_placement): Add PLACE_LAST_ALLOC.
        (Orphan_section_placement::Orphan_section_placement): Initialize it.
        (Orphan_section_placement::output_section_init): Track last allocated
        section.
        (Orphan_section_placement::find_place): Place BSS after last allocated
        section.
        (Output_section_element_input::set_section_addresses): Always override
        input section alignment when SUBALIGN is specified.
        (Output_section_definition::set_section_addresses): Override alignment
        of output section when SUBALIGN is specified.

        * testsuite/Makefile.am (script_test_15a, script_test_15b)
        (script_test_15c): New test cases.
        * testsuite/Makefile.in: Regenerate.
        * testsuite/script_test_2.cc: Adjust expected layout.
        * testsuite/script_test_15.c: New source file.
        * testsuite/script_test_15a.sh: New shell script.
        * testsuite/script_test_15a.t: New linker script.
        * testsuite/script_test_15b.sh: New shell script.
        * testsuite/script_test_15b.t: New linker script.
        * testsuite/script_test_15c.sh: New shell script.
        * testsuite/script_test_15c.t: New linker script.

Attachment: pr16711.patch
Description: Binary data


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]