bug-binutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Bug gold/16711] Linker script causes gold to allocate file space for bs


From: cvs-commit at gcc dot gnu.org
Subject: [Bug gold/16711] Linker script causes gold to allocate file space for bss
Date: Mon, 12 Dec 2016 01:32:24 +0000

https://sourceware.org/bugzilla/show_bug.cgi?id=16711

--- Comment #2 from cvs-commit at gcc dot gnu.org <cvs-commit at gcc dot 
gnu.org> ---
The master branch has been updated by Cary Coutant <address@hidden>:

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=5d9f66cb84b9f228c1082d3a1037355edceddded

commit 5d9f66cb84b9f228c1082d3a1037355edceddded
Author: Cary Coutant <address@hidden>
Date:   Sun Dec 11 17:31:25 2016 -0800

    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.

    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.

-- 
You are receiving this mail because:
You are on the CC list for the bug.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]