Skip to content
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

Link errors when attempting to use external LLVM & Clang #430

Closed
Apteryks opened this issue Sep 5, 2021 · 2 comments · Fixed by root-project/root#15563
Closed

Link errors when attempting to use external LLVM & Clang #430

Apteryks opened this issue Sep 5, 2021 · 2 comments · Fixed by root-project/root#15563
Labels

Comments

@Apteryks
Copy link
Contributor

Apteryks commented Sep 5, 2021

Describe the bug

When using LLVM and Clang as external dependencies (but built using their patched sources), Cling fails to link, showing various missing LLVM symbols.

[ 97%] Building CXX object tools/Jupyter/CMakeFiles/libclingJupyter.dir/Kernel.cpp.o
cd /tmp/guix-build-cling-0.9-1.d78d1a0.drv-0/build/tools/Jupyter && /gnu/store/rn75fm7adgx3pw5j8pg3bczfqq1y17lk-gcc-7.5.0/bin/c++  -DCLING_VERSION="1.0~dev" -DGTEST_HAS_RTTI=0 -D_GNU_SOURCE -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS -I/tmp/guix-build-cling-0.9-1.d78d1a0.drv-0/build/tools/Jupyter -I/tmp/guix-build-cling-0.9-1.d78d1a0.drv-0/source/tools/Jupyter -I/tmp/guix-build-cling-0.9-1.d78d1a0.drv-0/source/include -I/tmp/guix-build-cling-0.9-1.d78d1a0.drv-0/build/include  -fPIC -fvisibility-inlines-hidden -Werror=date-time -std=c++11 -w -ffunction-sections -fdata-sections -fno-common -Woverloaded-virtual -fno-strict-aliasing -Wno-nested-anon-types -Wno-covered-switch-default -Wno-unused-local-typedef -fno-rtti -O3 -DNDEBUG -fPIC -fvisibility=default -fvisibility-inlines-hidden    -fno-exceptions -fno-unwind-tables -fno-asynchronous-unwind-tables -fno-rtti -fexceptions -frtti -o CMakeFiles/libclingJupyter.dir/Kernel.cpp.o -c /tmp/guix-build-cling-0.9-1.d78d1a0.drv-0/source/tools/Jupyter/Kernel.cpp
[ 98%] Linking CXX shared library ../../lib/libclingJupyter.so
cd /tmp/guix-build-cling-0.9-1.d78d1a0.drv-0/build/tools/Jupyter && /gnu/store/qixwn3dw6glj848hrr3h8fxm6s7wzxm3-cmake-minimal-3.16.5/bin/cmake -E cmake_link_script CMakeFiles/libclingJupyter.dir/link.txt --verbose=1
/gnu/store/rn75fm7adgx3pw5j8pg3bczfqq1y17lk-gcc-7.5.0/bin/c++ -fPIC  -fPIC -fvisibility-inlines-hidden -Werror=date-time -std=c++11 -w -ffunction-sections -fdata-sections -fno-common -Woverloaded-virtual -fno-strict-aliasing -Wno-nested-anon-types -Wno-covered-switch-default -Wno-unused-local-typedef -fno-rtti -O3 -DNDEBUG  -Wl,-O3  -Wl,-z,defs -Wl,-z,nodelete -shared -Wl,-soname,libclingJupyter.so.9 -o ../../lib/libclingJupyter.so.9 CMakeFiles/libclingJupyter.dir/Kernel.cpp.o  -Wl,-rpath,::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: -lclangAST -lclangBasic -lclangCodeGen -lclangDriver -lclangFrontend -lclangLex -lclangParse -lclangSema -lclangSerialization ../../lib/libclingUserInterface.a ../../lib/libclingMetaProcessor.a -Wl,--whole-archive ../../lib/libclingInterpreter.a -Wl,--no-whole-archive ../../lib/libclingUtils.a -lclangCodeGen -lclangDriver -lclangFrontend -lclangParse -lclangSema -lclangAnalysis -lclangEdit -lclangRewrite -lclangRewriteFrontend -lclangAST -lclangBasic -lclangLex -lclangSerialization -ldl /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMCoroutines.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMCoverage.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMLTO.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMOption.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMOrcJIT.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMExecutionEngine.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMRuntimeDyld.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMNVPTXCodeGen.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMipo.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMNVPTXDesc.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMNVPTXInfo.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMX86CodeGen.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMScalarOpts.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMTarget.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMTransformUtils.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMAnalysis.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMX86AsmParser.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMX86Desc.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMObject.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMCore.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMX86Disassembler.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMMC.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMBinaryFormat.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMX86Info.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMX86Utils.so.9 /gnu/store/1jzp899by0sssssjg75wr78m235xdnha-llvm-9.0.1/lib/libLLVMSupport.so.9 
ld: /gnu/store/cdphqx9ifjzcqrxbmq5ijg6pq3frm9gn-clang-9.0.1/lib/libclangSerialization.a(ASTReader.cpp.o): in function `llvm::BitstreamCursor::advance(unsigned int)':
(.text._ZN4llvm15BitstreamCursor7advanceEj[_ZN4llvm15BitstreamCursor7advanceEj]+0xa7): undefined reference to `llvm::BitstreamCursor::ReadAbbrevRecord()'
ld: /gnu/store/cdphqx9ifjzcqrxbmq5ijg6pq3frm9gn-clang-9.0.1/lib/libclangSerialization.a(ASTReader.cpp.o): in function `clang::ASTRecordReader::readRecord(llvm::BitstreamCursor&, unsigned int)':
(.text._ZN5clang15ASTRecordReader10readRecordERN4llvm15BitstreamCursorEj+0x22): undefined reference to `llvm::BitstreamCursor::readRecord(unsigned int, llvm::SmallVectorImpl<unsigned long>&, llvm::StringRef*)'
ld: /gnu/store/cdphqx9ifjzcqrxbmq5ijg6pq3frm9gn-clang-9.0.1/lib/libclangSerialization.a(ASTReader.cpp.o): in function `clang::ASTReader::ReadBlockAbbrevs(llvm::BitstreamCursor&, unsigned int)':
(.text._ZN5clang9ASTReader16ReadBlockAbbrevsERN4llvm15BitstreamCursorEj+0x1e): undefined reference to `llvm::BitstreamCursor::EnterSubBlock(unsigned int, unsigned int*)'
ld: (.text._ZN5clang9ASTReader16ReadBlockAbbrevsERN4llvm15BitstreamCursorEj+0xe8): undefined reference to `llvm::BitstreamCursor::ReadAbbrevRecord()'
ld: /gnu/store/cdphqx9ifjzcqrxbmq5ijg6pq3frm9gn-clang-9.0.1/lib/libclangSerialization.a(ASTReader.cpp.o): in function `SkipCursorToBlock(llvm::BitstreamCursor&, unsigned int)':
(.text._ZL17SkipCursorToBlockRN4llvm15BitstreamCursorEj+0x5d): undefined reference to `llvm::BitstreamCursor::skipRecord(unsigned int)'
ld: (.text._ZL17SkipCursorToBlockRN4llvm15BitstreamCursorEj+0x20b): undefined reference to `llvm::BitstreamCursor::EnterSubBlock(unsigned int, unsigned int*)'
ld: /gnu/store/cdphqx9ifjzcqrxbmq5ijg6pq3frm9gn-clang-9.0.1/lib/libclangSerialization.a(ASTReader.cpp.o): in function `readASTFileSignature(llvm::StringRef)':
(.text._ZL20readASTFileSignatureN4llvm9StringRefE+0x1b9): undefined reference to `llvm::BitstreamCursor::readRecord(unsigned int, llvm::SmallVectorImpl<unsigned long>&, llvm::StringRef*)'
ld: /gnu/store/cdphqx9ifjzcqrxbmq5ijg6pq3frm9gn-clang-9.0.1/lib/libclangSerialization.a(ASTReader.cpp.o): in function `clang::ASTReader::readUnhashedControlBlockImpl(clang::serialization::ModuleFile*, llvm::StringRef, unsigned int, bool, clang::ASTReaderListener*, bool)':
(.text._ZN5clang9ASTReader28readUnhashedControlBlockImplEPNS_13serialization10ModuleFileEN4llvm9StringRefEjbPNS_17ASTReaderListenerEb+0x237): undefined reference to `llvm::BitstreamCursor::readRecord(unsigned int, llvm::SmallVectorImpl<unsigned long>&, llvm::StringRef*)'
ld: /gnu/store/cdphqx9ifjzcqrxbmq5ijg6pq3frm9gn-clang-9.0.1/lib/libclangSerialization.a(ASTReader.cpp.o): in function `clang::ASTReader::readInputFileInfo(clang::serialization::ModuleFile&, unsigned int)':
(.text._ZN5clang9ASTReader17readInputFileInfoERNS_13serialization10ModuleFileEj+0x143): undefined reference to `llvm::BitstreamCursor::readRecord(unsigned int, llvm::SmallVectorImpl<unsigned long>&, llvm::StringRef*)'
ld: /gnu/store/cdphqx9ifjzcqrxbmq5ijg6pq3frm9gn-clang-9.0.1/lib/libclangSerialization.a(ASTReader.cpp.o): in function `clang::ASTReader::getOriginalSourceFile(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, clang::FileManager&, clang::PCHContainerReader const&, clang::DiagnosticsEngine&)':
(.text._ZN5clang9ASTReader21getOriginalSourceFileERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEERNS_11FileManagerERKNS_18PCHContainerReaderERNS_17DiagnosticsEngineE+0x472): undefined reference to `llvm::BitstreamCursor::readRecord(unsigned int, llvm::SmallVectorImpl<unsigned long>&, llvm::StringRef*)'
ld: /gnu/store/cdphqx9ifjzcqrxbmq5ijg6pq3frm9gn-clang-9.0.1/lib/libclangSerialization.a(ASTReader.cpp.o): in function `clang::ASTReader::ReadSLocEntry(int)::{lambda(llvm::BitstreamCursor&, llvm::StringRef)#1}::operator()(llvm::BitstreamCursor&, llvm::StringRef) const':
(.text._ZZN5clang9ASTReader13ReadSLocEntryEiENKUlRN4llvm15BitstreamCursorENS1_9StringRefEE_clES3_S4_+0x98): undefined reference to `llvm::BitstreamCursor::readRecord(unsigned int, llvm::SmallVectorImpl<unsigned long>&, llvm::StringRef*)'
ld: /gnu/store/cdphqx9ifjzcqrxbmq5ijg6pq3frm9gn-clang-9.0.1/lib/libclangSerialization.a(ASTReader.cpp.o): in function `clang::ASTReader::ReadSourceManagerBlock(clang::serialization::ModuleFile&)':
(.text._ZN5clang9ASTReader22ReadSourceManagerBlockERNS_13serialization10ModuleFileE+0xb0): undefined reference to `llvm::BitstreamCursor::EnterSubBlock(unsigned int, unsigned int*)'
ld: (.text._ZN5clang9ASTReader22ReadSourceManagerBlockERNS_13serialization10ModuleFileE+0x14c): undefined reference to `llvm::BitstreamCursor::readRecord(unsigned int, llvm::SmallVectorImpl<unsigned long>&, llvm::StringRef*)'
ld: /gnu/store/cdphqx9ifjzcqrxbmq5ijg6pq3frm9gn-clang-9.0.1/lib/libclangSerialization.a(ASTReader.cpp.o): in function `clang::ASTReader::ReadExtensionBlock(clang::serialization::ModuleFile&)':
(.text._ZN5clang9ASTReader18ReadExtensionBlockERNS_13serialization10ModuleFileE+0xce): undefined reference to `llvm::BitstreamCursor::readRecord(unsigned int, llvm::SmallVectorImpl<unsigned long>&, llvm::StringRef*)'
ld: /gnu/store/cdphqx9ifjzcqrxbmq5ijg6pq3frm9gn-clang-9.0.1/lib/libclangSerialization.a(ASTReader.cpp.o): in function `clang::ASTReader::ReadOptionsBlock(llvm::BitstreamCursor&, unsigned int, bool, clang::ASTReaderListener&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)':
(.text._ZN5clang9ASTReader16ReadOptionsBlockERN4llvm15BitstreamCursorEjbRNS_17ASTReaderListenerERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE+0x37): undefined reference to `llvm::BitstreamCursor::EnterSubBlock(unsigned int, unsigned int*)'
ld: (.text._ZN5clang9ASTReader16ReadOptionsBlockERN4llvm15BitstreamCursorEjbRNS_17ASTReaderListenerERNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE+0x117): undefined reference to `llvm::BitstreamCursor::readRecord(unsigned int, llvm::SmallVectorImpl<unsigned long>&, llvm::StringRef*)'
ld: /gnu/store/cdphqx9ifjzcqrxbmq5ijg6pq3frm9gn-clang-9.0.1/lib/libclangSerialization.a(ASTReader.cpp.o): in function `clang::ASTReader::ReadControlBlock(clang::serialization::ModuleFile&, llvm::SmallVectorImpl<clang::ASTReader::ImportedModule>&, clang::serialization::ModuleFile const*, unsigned int)':
(.text._ZN5clang9ASTReader16ReadControlBlockERNS_13serialization10ModuleFileERN4llvm15SmallVectorImplINS0_14ImportedModuleEEEPKS2_j+0x48): undefined reference to `llvm::BitstreamCursor::EnterSubBlock(unsigned int, unsigned int*)'
[...]

See ba63aikq9ym2n7gjs13m56hxa77q25-cling-0.9-1.d78d1a0.drv.txt for the complete build log.

Expected behavior

Cling should build successfully.

To Reproduce

  1. Install Guix following https://guix.gnu.org/manual/en/html_node/Binary-Installation.html.
  2. Checktout https://gitlab.com/Apteryks/guix/-/commits/cling and build Guix following and http://guix.gnu.org/manual/en/html_node/Building-from-Git.html#Building-from-Git
  3. From the Guix checkout, run: ./pre-inst-env guix build cling

Setup

  1. Cling version 0.9, commit d78d1a0.
  2. Operating system Guix System
  3. From sources
@Apteryks Apteryks added the bug label Sep 5, 2021
@Apteryks
Copy link
Contributor Author

Apteryks commented Sep 7, 2021

Seems adding a link directive for clang-cpp resolves the issue, at least for libcling.

@Apteryks
Copy link
Contributor Author

Apteryks commented Sep 7, 2021

I've done the same for tools/driver and now I got a cling binary, but it fails to run like:

$ /gnu/store/zk5laplbwxncqjr8x3jsfrw73pvn4aly-cling-0.9-1.d78d1a0/bin/cling --help
: CommandLine Error: Option 'disable-symbolication' registered more than once!
LLVM ERROR: inconsistency in registered CommandLine options

Apteryks added a commit to Apteryks/root that referenced this issue May 18, 2024
The officially supported way to build LLVM/Clang as a shared library
is via the LLVM_BUILD_LLVM_DYLIB and LLVM_LINK_LLVM_DYLIB CMake
options (see: https://llvm.org/docs/BuildingADistribution.html).  When
built this way, the whole of Clang API is exposed as a shared
library (libclang-cpp.so).

* CMakeLists.txt: Query if we're in shared mode via llvm-config, and
register the result as LLVM_LIB_IS_SHARED.
[LLVM_LIB_IS_SHARED] <target_link_libraries>: Use the PUBLIC interface of the
LLVM shared library.
* lib/Interpreter/CMakeLists.txt [LLVM_LIB_IS_SHARED]: When defined, replace the
individual Clang components by clang-cpp.
* lib/MetaProcessor/CMakeLists.txt: Likewise.
* lib/Utils/CMakeLists.txt: Likewise.
* tools/Jupyter/CMakeLists.txt: Likewise.
* tools/driver/CMakeLists.txt: Likewise.
* tools/libcling/CMakeLists.txt: Likewise.

Fixes: <root-project/cling#430>
Apteryks added a commit to Apteryks/root that referenced this issue May 26, 2024
* CMakeLists.txt: Remove llvm-config related code, instead  using
modern 'find_package' constructs.

Fixes: <root-project/cling#430>
vgvassilev pushed a commit to root-project/root that referenced this issue May 27, 2024
* CMakeLists.txt: Remove llvm-config related code, instead  using
modern 'find_package' constructs.

Fixes: <root-project/cling#430>
FonsRademakers pushed a commit that referenced this issue May 27, 2024
* CMakeLists.txt: Remove llvm-config related code, instead  using
modern 'find_package' constructs.

Fixes: <#430>
PPaye pushed a commit to PPaye/root that referenced this issue Jun 3, 2024
* CMakeLists.txt: Remove llvm-config related code, instead  using
modern 'find_package' constructs.

Fixes: <root-project/cling#430>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

Successfully merging a pull request may close this issue.

1 participant