Skip to content

Building fails with builtin_llvm=OFF due to unintend libbsd linking #12152

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
1 task done
stephanlachnit opened this issue Jan 29, 2023 · 1 comment
Closed
1 task done

Comments

@stephanlachnit
Copy link
Contributor

stephanlachnit commented Jan 29, 2023

  • Checked for duplicates

Describe the bug

Building master (+ fix for #12151) with builtin_llvm=OFF results in this build error:

[5940/8663] /usr/lib/ccache/c++  -I"/<<PKGBUILDDIR>>/core/dictgen/res" -I"/<<PKGBUILDDIR>>/core/dictgen/src" -I"/<<PKGBUILDDIR>>/core/foundation/res" -I"/<<PKGBUILDDIR>>/core/clingutils/res" -I"/<<PKGBUILDDIR>>/core/base/inc" -I"/<<PKGBUILDDIR>>/core/clib/inc" -I"/<<PKGBUILDDIR>>/core/meta/inc" -I"/<<PKGBUILDDIR>>/core/foundation/inc" -I"/<<PKGBUILDDIR>>/obj-x86_64-linux-gnu/ginclude" -I"/<<PKGBUILDDIR>>/interpreter/cling/include" -isystem "/<<PKGBUILDDIR>>/interpreter/llvm/src/tools/clang/include" -isystem "/<<PKGBUILDDIR>>/obj-x86_64-linux-gnu/interpreter/llvm/src/tools/clang/include" -isystem /usr/lib/llvm-13/include -g -O2 -ffile-prefix-map=/<<PKGBUILDDIR>>=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fdiagnostics-color=always -std=c++17 -Wno-implicit-fallthrough -Wno-noexcept-type -pipe  -Wshadow -Wall -W -Woverloaded-virtual -fsigned-char -pthread -fPIC -fvisibility-inlines-hidden -g -O2 -ffile-prefix-map=/<<PKGBUILDDIR>>=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fdiagnostics-color=always -std=c++17 -Wno-implicit-fallthrough -Wno-noexcept-type -pipe  -Wshadow -Wall -W -Woverloaded-virtual -fsigned-char -pthread   -fno-strict-aliasing -Wwrite-strings -Wno-shadow -Wno-unused-parameter -Wno-deprecated-declarations -std=c++17 -fno-rtti -MD -MT core/dictgen/CMakeFiles/Dictgen.dir/src/rootcling_impl.cxx.o -MF core/dictgen/CMakeFiles/Dictgen.dir/src/rootcling_impl.cxx.o.d -o core/dictgen/CMakeFiles/Dictgen.dir/src/rootcling_impl.cxx.o -c '/<<PKGBUILDDIR>>/core/dictgen/src/rootcling_impl.cxx'
<<snip>>
[6107/8663] : && /usr/lib/ccache/c++ -fPIC -g -O2 -ffile-prefix-map=/<<PKGBUILDDIR>>=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fdiagnostics-color=always -std=c++17 -Wno-implicit-fallthrough -Wno-noexcept-type -pipe  -Wshadow -Wall -W -Woverloaded-virtual -fsigned-char -pthread  -Wl,-z,relro -Wl,-z,now -Wl,--no-undefined -Wl,--hash-style="both" -shared -Wl,-soname,libCling.so.6.27 -o lib/libCling.so.6.27.99 core/clingutils/CMakeFiles/ClingUtils.dir/src/RStl.cxx.o core/clingutils/CMakeFiles/ClingUtils.dir/src/TClingUtils.cxx.o core/dictgen/CMakeFiles/Dictgen.dir/src/BaseSelectionRule.cxx.o core/dictgen/CMakeFiles/Dictgen.dir/src/ClassSelectionRule.cxx.o core/dictgen/CMakeFiles/Dictgen.dir/src/DictSelectionReader.cxx.o core/dictgen/CMakeFiles/Dictgen.dir/src/LinkdefReader.cxx.o core/dictgen/CMakeFiles/Dictgen.dir/src/rootcling_impl.cxx.o core/dictgen/CMakeFiles/Dictgen.dir/src/Scanner.cxx.o core/dictgen/CMakeFiles/Dictgen.dir/src/SelectionRules.cxx.o core/dictgen/CMakeFiles/Dictgen.dir/src/TModuleGenerator.cxx.o core/dictgen/CMakeFiles/Dictgen.dir/src/VariableSelectionRule.cxx.o core/dictgen/CMakeFiles/Dictgen.dir/src/XMLReader.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/rootclingTCling.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TCling.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingBaseClassInfo.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingCallbacks.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingCallFunc.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingClassInfo.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingDataMemberInfo.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingDeclInfo.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingDiagnostics.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingMemberIter.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingMethodArgInfo.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingMethodInfo.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingRdictModuleFileExtension.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingTypedefInfo.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingTypeInfo.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingValue.cxx.o  -Wl,-rpath,/usr/lib/llvm-13/lib:::::::::::::::::::::::::::::::::::::::::::::  interpreter/llvm/src/lib/libclingInterpreter.a  interpreter/llvm/src/lib/libclingMetaProcessor.a  interpreter/llvm/src/lib/libclingUtils.a  -Wl,--unresolved-symbols=ignore-in-object-files  interpreter/llvm/src/lib/libclingInterpreter.a  interpreter/llvm/src/lib/libclingUtils.a  interpreter/llvm/src/lib/libclangCodeGen.a  interpreter/llvm/src/lib/libclangRewriteFrontend.a  interpreter/llvm/src/lib/libclangFrontend.a  interpreter/llvm/src/lib/libclangDriver.a  interpreter/llvm/src/lib/libclangParse.a  interpreter/llvm/src/lib/libclangRewrite.a  interpreter/llvm/src/lib/libclangSerialization.a  interpreter/llvm/src/lib/libclangSema.a  interpreter/llvm/src/lib/libclangAnalysis.a  interpreter/llvm/src/lib/libclangASTMatchers.a  interpreter/llvm/src/lib/libclangEdit.a  -ldl  interpreter/llvm/src/lib/libclangAST.a  interpreter/llvm/src/lib/libclangLex.a  interpreter/llvm/src/lib/libclangBasic.a  /usr/lib/llvm-13/lib/libLLVM-13.so.1 && :
FAILED: lib/libCling.so.6.27.99 
: && /usr/lib/ccache/c++ -fPIC -g -O2 -ffile-prefix-map=/<<PKGBUILDDIR>>=. -fstack-protector-strong -Wformat -Werror=format-security -Wdate-time -D_FORTIFY_SOURCE=2 -fdiagnostics-color=always -std=c++17 -Wno-implicit-fallthrough -Wno-noexcept-type -pipe  -Wshadow -Wall -W -Woverloaded-virtual -fsigned-char -pthread  -Wl,-z,relro -Wl,-z,now -Wl,--no-undefined -Wl,--hash-style="both" -shared -Wl,-soname,libCling.so.6.27 -o lib/libCling.so.6.27.99 core/clingutils/CMakeFiles/ClingUtils.dir/src/RStl.cxx.o core/clingutils/CMakeFiles/ClingUtils.dir/src/TClingUtils.cxx.o core/dictgen/CMakeFiles/Dictgen.dir/src/BaseSelectionRule.cxx.o core/dictgen/CMakeFiles/Dictgen.dir/src/ClassSelectionRule.cxx.o core/dictgen/CMakeFiles/Dictgen.dir/src/DictSelectionReader.cxx.o core/dictgen/CMakeFiles/Dictgen.dir/src/LinkdefReader.cxx.o core/dictgen/CMakeFiles/Dictgen.dir/src/rootcling_impl.cxx.o core/dictgen/CMakeFiles/Dictgen.dir/src/Scanner.cxx.o core/dictgen/CMakeFiles/Dictgen.dir/src/SelectionRules.cxx.o core/dictgen/CMakeFiles/Dictgen.dir/src/TModuleGenerator.cxx.o core/dictgen/CMakeFiles/Dictgen.dir/src/VariableSelectionRule.cxx.o core/dictgen/CMakeFiles/Dictgen.dir/src/XMLReader.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/rootclingTCling.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TCling.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingBaseClassInfo.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingCallbacks.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingCallFunc.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingClassInfo.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingDataMemberInfo.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingDeclInfo.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingDiagnostics.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingMemberIter.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingMethodArgInfo.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingMethodInfo.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingRdictModuleFileExtension.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingTypedefInfo.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingTypeInfo.cxx.o core/metacling/src/CMakeFiles/MetaCling.dir/TClingValue.cxx.o  -Wl,-rpath,/usr/lib/llvm-13/lib:::::::::::::::::::::::::::::::::::::::::::::  interpreter/llvm/src/lib/libclingInterpreter.a  interpreter/llvm/src/lib/libclingMetaProcessor.a  interpreter/llvm/src/lib/libclingUtils.a  -Wl,--unresolved-symbols=ignore-in-object-files  interpreter/llvm/src/lib/libclingInterpreter.a  interpreter/llvm/src/lib/libclingUtils.a  interpreter/llvm/src/lib/libclangCodeGen.a  interpreter/llvm/src/lib/libclangRewriteFrontend.a  interpreter/llvm/src/lib/libclangFrontend.a  interpreter/llvm/src/lib/libclangDriver.a  interpreter/llvm/src/lib/libclangParse.a  interpreter/llvm/src/lib/libclangRewrite.a  interpreter/llvm/src/lib/libclangSerialization.a  interpreter/llvm/src/lib/libclangSema.a  interpreter/llvm/src/lib/libclangAnalysis.a  interpreter/llvm/src/lib/libclangASTMatchers.a  interpreter/llvm/src/lib/libclangEdit.a  -ldl  interpreter/llvm/src/lib/libclangAST.a  interpreter/llvm/src/lib/libclangLex.a  interpreter/llvm/src/lib/libclangBasic.a  /usr/lib/llvm-13/lib/libLLVM-13.so.1 && :
/usr/bin/ld: core/dictgen/CMakeFiles/Dictgen.dir/src/rootcling_impl.cxx.o: undefined reference to symbol 'strlcat@@LIBBSD_0.0'
/usr/bin/ld: /lib/x86_64-linux-gnu/libbsd.so.0: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status

Digging a bit deeper with the -Wl,--verbose linker flag:

<<snip>>
attempt to open /usr/lib/llvm-13/lib/libLLVM-13.so.1 succeeded
/usr/lib/llvm-13/lib/libLLVM-13.so.1
<<snip>>
libedit.so.2 needed by /usr/lib/llvm-13/lib/libLLVM-13.so.1
<<snip>>
libbsd.so.0 needed by /lib/x86_64-linux-gnu/libedit.so.2
attempt to open /usr/lib/llvm-13/lib/libbsd.so.0 failed
<<snip>>
found libbsd.so.0 at /lib/x86_64-linux-gnu/libbsd.so.0
/usr/bin/ld: core/dictgen/CMakeFiles/Dictgen.dir/src/rootcling_impl.cxx.o: undefined reference to symbol 'strlcat@@LIBBSD_0.0'
/usr/bin/ld: /lib/x86_64-linux-gnu/libbsd.so.0: error adding symbols: DSO missing from command line

So the issue is that the system libLLVM-13.so.1 links against libbsd.so.0, which defines strlcat as a global symbol. Since rootcling_impl also defines this symbol as global, there is an unresolved conflict.

Expected behavior

Tbh I'm not sure how this should be fixed.

Clearly by default there is no strlcat et al on linux by default, but there is libbsd and this should be checked somwhere. Currently this check is in core/foundation/inc/ROOT/RConfig.hxx:248-276 and only takes into account the operating system.

Check with __has_include if bsd/string.h exists on other unixes might be a way to do it, but I would have no clue how to do the proper linking. Also it doesn't fix the issue if libbsd is introduced in a downstream project using ROOT.

Alternatively, I think the "better" solution is to add a link_libbsd build option (disabled by default ofc). If enabled, it adds -lbsd to the public link flags of Clib and sets some compile flag like HAS_STRLCPY_VIA_LIBBSD (in addition to HAS_STRLCPY) that triggers the inclusion of bsd/string.h in clib/inc/strlcpy.h in the #else case of #ifndef HAS_STRLCPY.

To Reproduce

git master, builtin_llvm=OFF, #12151 fixed via ${CLING_BINARY_DIR} instead of ${LLVM_BINARY_DIR}

Setup

master, Debian Sid, LLVM 13.0.1-11, gcc 12.2.0-3

Additional context

@stephanlachnit
Copy link
Contributor Author

Closed via #13420.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants