https://gcc.gnu.org/bugzilla/show_bug.cgi?id=110844
Bug ID: 110844 Summary: LTO sometimes fail with -save-temp -dumpdir options Product: gcc Version: 13.1.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: lto Assignee: unassigned at gcc dot gnu.org Reporter: frankhb1989 at gmail dot com CC: marxin at gcc dot gnu.org Target Milestone: --- Cases: $ cd /tmp $ g++ --version g++ (GCC) 13.1.1 20230714 Copyright (C) 2023 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ echo 'int main(){}' > a.cc $ g++ -flto -c a.cc -o a.o $ g++ -flto -save-temps -dumpdir . a.o $ g++ -flto -c a.cc -o a.o -save-temps -dumpdir . $ g++ -flto -save-temps -dumpdir . a.o $ g++ -flto -save-temps -dumpdir /tmp/ a.o /usr/sbin/ld: error: could not open arguments file collect2: error: ld returned 1 exit status The error message is from lto-plugin.c. Setting the environment variables (indicated by 'g++ -v' and then 'collect2 -v' from the result) properly, by "b fopen if *(char*)$rsi == 'w'" for ld running in gdb a few times, it shows something goes wrong in 'link_output_name' which forms 'arguments_file_name': the variable incorrectly contains all the remain characters in the command line. (This is also reproduced in MSYS2 ld which has no debug symbols distributed together, after changing $rsi to $rdx.) The parsing implementation of '-dumpdir' arguments introduced in 1dedc12d186a110854537e1279b4e6c29f2df35a then looks quite suspicious.