Skip to content

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

Closed
@stephanlachnit

Description

@stephanlachnit
  • 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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions