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

--- Comment #5 from Sourceware Commits <cvs-commit at gcc dot gnu.org> ---
The binutils-2_46-branch branch has been updated by H.J. Lu
<[email protected]>:

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

commit 2cd5360f35af63abd267ad628566b13ee8febaa8
Author: H.J. Lu <[email protected]>
Date:   Wed Apr 22 03:53:20 2026 +0800

    ld: Maintain the input file order

    When adding a new input archive, which comes from a linker script file
    and isn't referenced by any inputs, ld appends it to the input file list.
    On Linux, when -lm is used with /usr/lib64/libm.a:

    GROUP ( /usr/lib64/libm-2.42.a /usr/lib64/libmvec.a )

    the input file order looks like

    /usr/lib/gcc/x86_64-redhat-linux/15/../../../../lib64/crt1.o
    /usr/lib/gcc/x86_64-redhat-linux/15/../../../../lib64/crti.o
    /usr/lib/gcc/x86_64-redhat-linux/15/crtbeginT.o
    x.o (symbol from plugin)
    /usr/lib/gcc/x86_64-redhat-linux/15/../../../../lib64/libm.a
    /usr/lib/gcc/x86_64-redhat-linux/15/libgcc.a
    /usr/lib/gcc/x86_64-redhat-linux/15/libgcc_eh.a
    /usr/lib/gcc/x86_64-redhat-linux/15/../../../../lib64/libc.a
    /usr/lib/gcc/x86_64-redhat-linux/15/crtend.o
    /usr/lib/gcc/x86_64-redhat-linux/15/../../../../lib64/crtn.o
    /usr/lib64/libm-2.42.a
    /usr/lib64/libmvec.a

    since the compiler may not add compiler builtin functions to the LTO
    symbol table as it doesn't really know if builtin functions will have
    real symbols.  When ld extracts an element from the archive later during
    LTO rescan, the final input file order is

    /usr/lib/gcc/x86_64-redhat-linux/15/../../../../lib64/crt1.o
    /usr/lib/gcc/x86_64-redhat-linux/15/../../../../lib64/crti.o
    /usr/lib/gcc/x86_64-redhat-linux/15/crtbeginT.o
    x.o (symbol from plugin)
    /tmp/ccHN6O4n.ltrans0.ltrans.o
    /usr/lib/gcc/x86_64-redhat-linux/15/../../../../lib64/libm.a
    /usr/lib/gcc/x86_64-redhat-linux/15/libgcc.a
    /usr/lib/gcc/x86_64-redhat-linux/15/libgcc_eh.a
    /usr/lib/gcc/x86_64-redhat-linux/15/../../../../lib64/libc.a
    /usr/lib/gcc/x86_64-redhat-linux/15/crtend.o
    /usr/lib/gcc/x86_64-redhat-linux/15/../../../../lib64/crtn.o
    fclrexcpt.o

    where x.o references the builtin function, feclearexcept which is defined
    in fclrexcpt.o from /usr/lib64/libm-2.42.a.

    As the result, the .eh_frame section terminator in crtn.o is placed before
    fclrexcpt.o and the .eh_frame section in the output isn't terminated.  The
    output crashes when it runs over the .eh_frame section during EH frame
    registration.  Insert the new input file before the current input file to
    maintain the same input file order:

    /usr/lib/gcc/x86_64-redhat-linux/15/../../../../lib64/crt1.o
    /usr/lib/gcc/x86_64-redhat-linux/15/../../../../lib64/crti.o
    /usr/lib/gcc/x86_64-redhat-linux/15/crtbeginT.o
    x.o (symbol from plugin)
    /usr/lib64/libm-2.42.a
    /usr/lib64/libmvec.a
    /usr/lib/gcc/x86_64-redhat-linux/15/../../../../lib64/libm.a
    /usr/lib/gcc/x86_64-redhat-linux/15/libgcc.a
    /usr/lib/gcc/x86_64-redhat-linux/15/libgcc_eh.a
    /usr/lib/gcc/x86_64-redhat-linux/15/../../../../lib64/libc.a
    /usr/lib/gcc/x86_64-redhat-linux/15/crtend.o
    /usr/lib/gcc/x86_64-redhat-linux/15/../../../../lib64/crtn.o

    as the non-LTO input to properly terminate the .eh_frame section.

    Add a static LTO test to reference feclearexcept which is a compiler
    builtin function and isn't in the LTO symbol table when GCC is used.
    It triggers the run-time crash on glibc targets of a linker script
    libm.a without this fix when GCC 13 or above is used:

    https://gcc.gnu.org/bugzilla/show_bug.cgi?id=124869

    Also add a debug function, debug_input_files, to display the input file
    chain.  It is optimized out when compiler optimization is turned on.

            PR ld/34088
            * ldlang.c (current_input_file): Changed to the pointer to
            lang_input_statement_type.
            (new_afile): Insert the new input file before the current input
            file to maintain the input file order.
            (lang_add_input_file): Updated.
            (load_symbols): Likewise.
            (debug_input_files): New function.
            (lang_process): Reference it.
            * testsuite/ld-plugin/lto.exp: Run PR ld/34088 test.
            * testsuite/ld-plugin/pr34088.c: New file.

    Signed-off-by: H.J. Lu <[email protected]>
    (cherry picked from commit da208daeb710b26608a0b981df215e9da209af80)

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

Reply via email to