Компиляция LLVM в macOS и установка правильного RPATH - PullRequest
0 голосов
/ 24 февраля 2020

Вопрос : Как правильно установить перемещаемое значение 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?

...