Вопрос : Как правильно установить перемещаемое значение RPATH
во время компиляции LLVM 9 в macOS 10.15, чтобы приложения и библиотеки, связанные с общими библиотеками LLVM, находили их?
Среда : для нашего проекта мы собираем LLVM v9.0.0 на macOS 10.15.3 с включенным SIP с использованием CMake:
cmake $SOURCEDIR/llvm \
-DLLVM_ENABLE_PROJECTS="clang;clang-tools-extra;compiler-rt" \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_INSTALL_PREFIX:PATH="$INSTALLROOT" \
-DLLVM_INSTALL_UTILS=ON \
-DPYTHON_EXECUTABLE=$(which python3) \
-DDEFAULT_SYSROOT=${DEFAULT_SYSROOT} \
-DBUILD_SHARED_LIBS=ON
При создании стрелки appache мы связываемся с некоторыми из полученных общих библиотек, которые затем ссылки на наше приложение. При выполнении этого приложения мы получаем RPATH
связанную ошибку
./o2-test-framework-ASoA
dyld: Library not loaded: @rpath/libLLVMMCJIT.dylib
Referenced from: /Users/alibuild/alice/sw/osx_x86-64/arrow/v0.14.1-1/lib/libgandiva.14.1.0.dylib
Reason: image not found
zsh: abort sw/BUILD/O2-latest/O2/stage/tests/o2-test-framework-ASoA
Проверка рассматриваемой библиотеки LLVM дает
otool -L sw/osx_x86-64/Clang/latest/lib/libLLVMMCJIT.dylib
sw/osx_x86-64/Clang/latest/lib/libLLVMMCJIT.dylib:
@rpath/libLLVMMCJIT.dylib (compatibility version 0.0.0, current version 0.0.0)
@rpath/libLLVMExecutionEngine.dylib (compatibility version 0.0.0, current version 0.0.0)
@rpath/libLLVMRuntimeDyld.dylib (compatibility version 0.0.0, current version 0.0.0)
@rpath/libLLVMTarget.dylib (compatibility version 0.0.0, current version 0.0.0)
@rpath/libLLVMObject.dylib (compatibility version 0.0.0, current version 0.0.0)
@rpath/libLLVMCore.dylib (compatibility version 0.0.0, current version 0.0.0)
@rpath/libLLVMSupport.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 800.7.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.0.0)
otool -l sw/osx_x86-64/Clang/latest/lib/libLLVMMCJIT.dylib | grep -A2 RPATH
cmd LC_RPATH
cmdsize 32
path @loader_path/../lib (offset 12)
, что заставляет нас предположить, что LC_RPATH
не установлен правильно.
Изменение пути libLLVMMCJIT.dylib
приводит к тому, что приложение снова находит библиотеки, так что, похоже, проблема в способе компиляции LLVM.
install_name_tool -id $PWD/sw/osx_x86-64/Clang/latest/lib/libLLVMMCJIT.dylib $PWD/sw/osx_x86-64/Clang/latest/lib/libLLVMMCJIT.dylib
alibuild@alibuildmac01wifi alice % otool -l sw/osx_x86-64/Clang/latest/lib/libLLVMMCJIT.dylib | grep -A2 RPATH
cmd LC_RPATH
cmdsize 32
path @loader_path/../lib (offset 12)
otool -L sw/osx_x86-64/Clang/latest/lib/libLLVMMCJIT.dylib
sw/osx_x86-64/Clang/latest/lib/libLLVMMCJIT.dylib:
/Users/alibuild/alice/sw/osx_x86-64/Clang/latest/lib/libLLVMMCJIT.dylib (compatibility version 0.0.0, current version 0.0.0)
@rpath/libLLVMExecutionEngine.dylib (compatibility version 0.0.0, current version 0.0.0)
@rpath/libLLVMRuntimeDyld.dylib (compatibility version 0.0.0, current version 0.0.0)
@rpath/libLLVMTarget.dylib (compatibility version 0.0.0, current version 0.0.0)
@rpath/libLLVMObject.dylib (compatibility version 0.0.0, current version 0.0.0)
@rpath/libLLVMCore.dylib (compatibility version 0.0.0, current version 0.0.0)
@rpath/libLLVMSupport.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 800.7.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1281.0.0)
Как мы можем гарантировать, что LLVM во время сборки установит правильный LC_RPATH
?