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
Describe the bug
Building master (+ fix for #12151) with
builtin_llvm=OFFresults in this build error:Digging a bit deeper with the
-Wl,--verboselinker flag:So the issue is that the system
libLLVM-13.so.1links againstlibbsd.so.0, which definesstrlcatas a global symbol. Sincerootcling_implalso 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
strlcatet 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_includeifbsd/string.hexists 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_libbsdbuild option (disabled by default ofc). If enabled, it adds-lbsdto the public link flags ofCliband sets some compile flag likeHAS_STRLCPY_VIA_LIBBSD(in addition toHAS_STRLCPY) that triggers the inclusion of bsd/string.h in clib/inc/strlcpy.h in the#elsecase 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