Using -flto in CXXFLAGS_FOR_TARGET

Xi Ruoyao ryxi@stu.xidian.edu.cn
Fri Jun 15 13:36:00 GMT 2018


On 2018-06-15 15:16 +0200, U.Mutlu wrote:
> Xi Ruoyao wrote on 06/15/2018 11:57 AM:
> > On 2018-06-15 11:31 +0200, U.Mutlu wrote:
> > > I tried to use -flto in CXXFLAGS_FOR_TARGET. It successfully built the compilers,
> > > but later when trying to use the compilers, the linker reported an error about
> > > something missing and aborted the linking.
> > 
> > PR 48200 renders shared libraries with versioned symbols (".symver") unusable if it
> > was built with -flto.  libstdc++ is affected.
> > 
> > > Of course the rationale was to optimize the compiler itself.
> > > 
> > > So, the question is: does it not make any sense to use -flto for the build itself?
> > > (Or should one specify -flto in some of the other config variables like
> > > CXXFLAGS_FOR_BUILD and/or the ...FLAGS vars maybe?)
> > 
> > Use --with-build-config=bootstrap-lto.
> > 
> > "C(XX)FLAGS_FOR_BUILD=-flto" also makes sense (see PR 59893).  But you should use
> > --disable-shared and build the shared libraries w/o LTO, at least for now to
> > workaround PR 48200.  And you should use patch to workaround PR 60160.
> 
> Thanks, also for the useful references.
> 
> The patch is somewhat old (from 2014), and applies only partially
> to the latest repo revision (I have to analyse it further yet).
> 
> The build finishes, but gives such warnings:
> 
> BFD: tsan_clock.o: plugin needed to handle lto object
> ...
> BFD: 
> .libs/libtsan.lax/libsanitizer_common.a/sanitizer_symbolizer_libbacktrace.o: 
> plugin needed to handle lto object
> ...
> 
> And compiling a C++ program with this newly generated compiler
> gives the said libstdc++ link errors:
> 
> /usr/local/gcc-latest/lib/gcc/x86_64-linux-gnu/9.0.0/../../../../lib64/libstdc++.so: 
> undefined reference to `std::istream::ignore(long)'
> /usr/local/gcc-latest/lib/gcc/x86_64-linux-gnu/9.0.0/../../../../lib64/libstdc++.so: 
> undefined reference to `std::basic_istream<wchar_t, std::char_traits<wchar_t> 
>  >::ignore(long)'
> collect2: error: ld returned 1 exit status
> 
> But, I'd skipped the bootstrap process (via --disable-bootstrap).
> Is it necessary for this to work?

Seems I was wrong about --disable-shared.  It could not suppress libstdc++.so
but suppressed the LTO plugin.

Do not use --disable-shared.  Then generated libstdc++.so *would* be broken
(because of PR 48200).  Then build GCC again w/o CXXFLAGS_FOR_TARGET=-flto, and
install the working libstdc++.so.

Or try to hack libstdc++ building system, use "-flto -ffat-lto-objects" to
compile .cc to .o, and use "-fno-lto" for *shared* library libstdc++.so.
(Maybe also other shared libraries of GCC).

I'm trying to resolve PR 48200, but no much progress now.
-- 
Xi Ruoyao <ryxi@stu.xidian.edu.cn>
School of Aerospace Science and Technology, Xidian University



More information about the Gcc-help mailing list