http://gcc.gnu.org/bugzilla/show_bug.cgi?id=53780
Bug #: 53780 Summary: [l4.7.1 lto] linker fails with lto and "standard" object file Classification: Unclassified Product: gcc Version: 4.7.1 Status: UNCONFIRMED Severity: minor Priority: P3 Component: lto AssignedTo: unassig...@gcc.gnu.org ReportedBy: vincenzo.innoce...@cern.ch here mostly for the record as works with 4.8.0 and it has an easy workaround it maybe related to PR53337 either on vanilla fedora 17 or with gcc version 4.7.2 20120615 (prerelease) [gcc-4_7-branch revision 188650] (GCC) GNU gold (GNU Binutils 2.22.52.20120515) 1.11 linker fails in the following example c++ -fPIC -std=c++11 -fvisibility-inlines-hidden -O2 -flto -c boostLto.cc c++ -fPIC -std=c++11 -fvisibility-inlines-hidden -Os -c boostLto2.cc echo link ok c++ -flto -O2 -pthread boostLto2.o boostLto.o -shared -fPIC -o bha.so -fvisibility-inlines-hidden -std=c++11 echo link fails c++ -flto -O2 -pthread boostLto.o boostLto2.o -shared -fPIC -o bha.so -fvisibility-inlines-hidden -std=c++11 fedora 17 link ok link fails `_ZTIN5boost6detail15sp_counted_baseE' referenced in section `.data.rel.ro._ZTVN5boost6detail15sp_counted_baseE[_ZTVN5boost6detail15sp_counted_baseE]' of boostLto2.o: defined in discarded section `.gnu.linkonce.t._ZTIN5boost6detail15sp_counted_baseE' of boostLto.o (symbol from plugin) `_ZThn16_N5boost16exception_detail10clone_implINS0_19error_info_injectorINS_21thread_resource_errorEEEED1Ev' referenced in section `.data.rel.ro._ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_21thread_resource_errorEEEEE[_ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_21thread_resource_errorEEEEE]' of boostLto2.o: defined in discarded section `.gnu.linkonce.t._ZN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_21thread_resource_errorEEEED5Ev' of boostLto.o (symbol from plugin) `_ZThn16_N5boost16exception_detail10clone_implINS0_19error_info_injectorINS_21thread_resource_errorEEEED0Ev' referenced in section `.data.rel.ro._ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_21thread_resource_errorEEEEE[_ZTVN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_21thread_resource_errorEEEEE]' of boostLto2.o: defined in discarded section ….. `_ZThn56_N5boost16exception_detail10clone_implINS0_19error_info_injectorINS_21thread_resource_errorEEEED0Ev' referenced in section `.data.rel.ro' of /tmp/ccnOkzqM.ltrans1.ltrans.o: defined in discarded section `.gnu.linkonce.t._ZN5boost16exception_detail10clone_implINS0_19error_info_injectorINS_21thread_resource_errorEEEED0Ev' of boostLto.o (symbol from plugin) /bin/ld: bha.so: hidden symbol `.LTHUNK2.3978' isn't defined /bin/ld: final link failed: Bad value collect2: error: ld returned 1 exit status ===================================== with gcc version 4.7.2 20120615 (prerelease) [gcc-4_7-branch revision 188650] (GCC) GNU gold (GNU Binutils 2.22.52.20120515) 1.11 link ok link fails boostLto2.o:boostLto2.cc:function vtable for boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::gregorian::bad_day_of_month> >: warning: relocation refers to discarded section /afs/cern.ch/user/i/innocent/w3/gcc47slc5/bin/ld: error: hidden symbol '_ZThn16_N5boost16exception_detail10clone_implINS0_19error_info_injectorINS_9gregorian16bad_day_of_monthEEEED1Ev' is not defined locally ….. /tmp/innocent/ccZ6RxXH.ltrans1.ltrans.o:ccZ6RxXH.ltrans1.o:function vtable for boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::gregorian::bad_day_of_year> > [clone .local.282]: warning: relocation refers to discarded section /afs/cern.ch/user/i/innocent/w3/gcc47slc5/bin/ld: error: hidden symbol '_ZThn56_N5boost16exception_detail10clone_implINS0_19error_info_injectorINS_9gregorian15bad_day_of_yearEEEED0Ev' is not defined locally collect2: error: ld returned 1 exit status ================== code cat boostLto.cc #include "boost/thread/mutex.hpp" namespace edm0 { boost::mutex* getGlobalMutex(); } boost::mutex* edm0::getGlobalMutex() { static boost::mutex m_; return &m_; } [innocent@pcphsftkepler ctest]$ cat boostLto2.cc #include "boost/thread/mutex.hpp" namespace edm2 { boost::mutex* getGlobalMutex(); } boost::mutex* edm2::getGlobalMutex() { static boost::mutex m_; return &m_; } #include "boost/shared_ptr.hpp" #include "boost/date_time.hpp" #include "boost/date_time/gregorian/gregorian_types.hpp" #include "boost/date_time/posix_time/posix_time_types.hpp" #include "boost/date_time/c_local_time_adjustor.hpp" typedef boost::posix_time::ptime TimePoint_t; typedef boost::posix_time::time_duration Duration_t; #include<string> #include<sstream> #include<iomanip> #include<ctime> struct A { A(){} virtual ~A(){} A(int j) : i(j){} int i; }; struct B { A & a() {return *pa;} boost::shared_ptr<A> pa; int j; }; boost::shared_ptr<A> make2(int i) { return boost::shared_ptr<A>(new A(i)); } int get2(boost::shared_ptr<A> a) { return (*a).i; } int get2(B b) { return b.a().i; } std::string dateStamp2(TimePoint_t theTime) { typedef boost::date_time::c_local_adjustor<boost::posix_time::ptime> local_adj; tm ptm = boost::posix_time::to_tm( local_adj::utc_to_local(theTime) ); std::ostringstream dateStampStr; dateStampStr << std::setfill('0') << std::setw(4) << ptm.tm_year+1900 << std::setfill('0') << std::setw(2) << ptm.tm_mon+1 << std::setfill('0') << std::setw(2) << ptm.tm_mday; return dateStampStr.str(); }