MacOSX:哪些动态库通过二进制链接?

Cri*_*ngo 8 macos rpath otool ldd

我无法弄清楚为什么我的二进制文件无法加载。它是MATLAB加载的dylib(MEX文件),并链接到位于不同位置的许多dylib。MATLAB告诉我它无法加载MEX文件,但是我无法弄清它找不到哪个依赖项。

有人对如何调试这样的东西有任何建议吗?

在Linux上,ldd是调试此问题的理想工具。人们一直说otool -LMacOS与Linux等效ldd,但这不是事实。ldd实际上会查找这些库,并告诉您可以找到哪些库以及在何处找到它们。otool -L仅告诉您需要链接的库。无需检查它们是否存在。它甚至没有告诉您使用库时在哪里搜索库@rpath

otool -l(小写的L)为您提供了“加载命令”的转储,您可以在LC_RPATH其中看到这些命令,这些命令确定了在何处@rpath搜索库。但是这些无法向我解释未找到哪个依赖项。

apm*_*ney 9

在处理可执行文件时,Rob Mayoff 的回答是一个很好的解决方案。如果您发现需要检查 dylib 的运行时依赖项,以下脚本my-ldd可能会有用。

#!/usr/bin/env bash 

while getopts "r" OPTION; do
  case $OPTION in   
    r) export DYLD_PRINT_RPATHS=1;;
  esac
done
shift $((OPTIND-1))

cp `which true` .
DYLD_PRINT_LIBRARIES=1 \
DYLD_PRINT_LIBRARIES_POST_LAUNCH=1 \
DYLD_INSERT_LIBRARIES=$1 \
./true
rm ./true
Run Code Online (Sandbox Code Playgroud)

其中一个脚本可以被调用为

my-ldd ./foo.dylib
Run Code Online (Sandbox Code Playgroud)

或(使用 rpath 尝试回显)

my-ldd -r ./foo.dylib
Run Code Online (Sandbox Code Playgroud)

  • 好的!这需要“true”二进制文件的本地副本的原因是什么?我尝试以这种方式运行`/usr/bin/true`,但它不起作用。 (2认同)
  • 我遇到了同样的问题。这是 Apple 实施的增强安全措施。有关更多讨论,请参阅 [this](/sf/answers/3393514001/) 链接 (2认同)

rob*_*off 7

在运行matlab之前,请尝试设置以下环境变量:

export DYLD_PRINT_LIBRARIES=1
export DYLD_PRINT_LIBRARIES_POST_LAUNCH=1
export DYLD_PRINT_RPATHS=1
Run Code Online (Sandbox Code Playgroud)

运行man dyld更多可能性。

您也可以只为matlab命令设置变量,如下所示:

DYLD_PRINT_LIBRARIES=1 DYLD_PRINT_LIBRARIES_POST_LAUNCH=1 DYLD_PRINT_RPATHS=1 matlab
Run Code Online (Sandbox Code Playgroud)