[SERVER-28133] Clang builds trip -Wl,--detect-odr-violations warnings when linking against gcc-compiled shared objects Created: 27/Feb/17  Updated: 05/Apr/17  Resolved: 15/Mar/17

Status: Closed
Project: Core Server
Component/s: Build
Affects Version/s: None
Fix Version/s: 3.5.5

Type: Bug Priority: Major - P3
Reporter: Mathias Stearn Assignee: Andrew Morrow (Inactive)
Resolution: Done Votes: 0
Labels: None
Remaining Estimate: Not Specified
Time Spent: Not Specified
Original Estimate: Not Specified

Backwards Compatibility: Fully Compatible
Operating System: ALL
Sprint: Platforms 2017-03-27
Participants:

 Description   

The issue seems to be that clang and g++ use different rules for assigning
line numbers to functions. It seems like g++ uses the first
line of the signature (excluding template<...>) and clang uses the line
with the opening '{'. This is a problem because g++ was used to compile
libstdc++.so and clang was used to compile our .o's. This seems to only happen in --opt=off builds because clang inlines these functions otherwise.

Example errors:

/usr/bin/ld.gold: warning: while linking build/ninja/mongo/mongod: symbol 'std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' defined in multiple places (possible ODR violation):
  /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h:4931 from build/ninja/mongo/libbase.a(build/ninja/mongo/logger/rotatable_file_manager.o)
  /build/gcc-multilib/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/basic_string.h:4929 from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../lib64/libstdc++.so
/usr/bin/ld.gold: warning: while linking build/ninja/mongo/mongod: symbol 'std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' defined in multiple places (possible ODR violation):
  /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.tcc:1149 from build/ninja/mongo/client/libclientdriver.a(build/ninja/mongo/client/connection_string_connect.o)
  /build/gcc-multilib/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/basic_string.tcc:1147 from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../lib64/libstdc++.so
/usr/bin/ld.gold: warning: while linking build/ninja/mongo/mongod: symbol 'std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char*, void>(char*, char*, std::allocator<char> const&)' defined in multiple places (possible ODR violation):
  /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h:552 from build/ninja/mongo/db/catalog/libcatalog.a(build/ninja/mongo/db/catalog/index_catalog.o)
  /build/gcc-multilib/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/basic_string.h:549 from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../lib64/libstdc++.so
/usr/bin/ld.gold: warning: while linking build/ninja/mongo/mongod: symbol 'std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(char, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)' defined in multiple places (possible ODR violation):
  /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.tcc:1164 from build/ninja/mongo/db/pipeline/libdocument_source.a(build/ninja/mongo/db/pipeline/document_source_unwind.o)
  /build/gcc-multilib/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/basic_string.tcc:1163 from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../lib64/libstdc++.so
/usr/bin/ld.gold: warning: while linking build/ninja/mongo/mongod: symbol 'std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, void>(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<char> const&)' defined in multiple places (possible ODR violation):
  /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h:552 from build/ninja/mongo/db/repl/libisself.a(build/ninja/mongo/db/repl/isself.o)
  /build/gcc-multilib/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/basic_string.h:549 from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../lib64/libstdc++.so
/usr/bin/ld.gold: warning: while linking build/ninja/mongo/mongod: symbol 'void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::forward_iterator_tag)' defined in multiple places (possible ODR violation):
  /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.tcc:209 from build/ninja/mongo/db/repl/libisself.a(build/ninja/mongo/db/repl/isself.o)
  /build/gcc-multilib/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/basic_string.tcc:206 from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../lib64/libstdc++.so
/usr/bin/ld.gold: warning: while linking build/ninja/mongo/mongod: symbol 'std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string<char const*, void>(char const*, char const*, std::allocator<char> const&)' defined in multiple places (possible ODR violation):
  /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h:552 from build/ninja/mongo/client/libsasl_client.a(build/ninja/mongo/client/sasl_client_authenticate.o)
  /build/gcc-multilib/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/basic_string.h:549 from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../lib64/libstdc++.so
/usr/bin/ld.gold: warning: while linking build/ninja/mongo/mongod: symbol 'void std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::_M_construct<__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > > >(__gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, __gnu_cxx::__normal_iterator<char const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::forward_iterator_tag)' defined in multiple places (possible ODR violation):
  /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.tcc:209 from build/ninja/mongo/client/libclientdriver.a(build/ninja/mongo/client/mongo_uri_connect.o)
  /build/gcc-multilib/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/basic_string.tcc:206 from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../lib64/libstdc++.so
/usr/bin/ld.gold: warning: while linking build/ninja/mongo/mongod: symbol 'std::__cxx11::basic_string<wchar_t, std::char_traits<wchar_t>, std::allocator<wchar_t> >::basic_string<wchar_t const*, void>(wchar_t const*, wchar_t const*, std::allocator<wchar_t> const&)' defined in multiple places (possible ODR violation):
  /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../include/c++/6.3.1/bits/basic_string.h:552 from build/ninja/third_party/boost-1.60.0/libboost_regex.a(build/ninja/third_party/boost-1.60.0/libs/regex/src/wc_regex_traits.o)
  /build/gcc-multilib/src/gcc-build/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/basic_string.h:549 from /usr/bin/../lib64/gcc/x86_64-pc-linux-gnu/6.3.1/../../../../lib64/libstdc++.so



 Comments   
Comment by Githook User [ 15/Mar/17 ]

Author:

{u'username': u'acmorrow', u'name': u'Andrew Morrow', u'email': u'acm@mongodb.com'}

Message: SERVER-28133 Don't mix the ODR detector, clang, and libstdc++
Branch: master
https://github.com/mongodb/mongo/commit/4948241998903e628ea3c18204191e71ee4b3896

Comment by Githook User [ 28/Feb/17 ]

Author:

{u'username': u'RedBeard0531', u'name': u'Mathias Stearn', u'email': u'mathias@10gen.com'}

Message: SERVER-28133 --disable-warnings-as-errors should also apply to linker
Branch: master
https://github.com/mongodb/mongo/commit/a9cf9dffdc4a320b5269876f8e4f00bd0cfb95d2

Generated at Thu Feb 08 04:17:13 UTC 2024 using Jira 9.7.1#970001-sha1:2222b88b221c4928ef0de3161136cc90c8356a66.