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

时间:2017-08-02 15:09:02

标签: macos ldd rpath otool

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

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

在Linux上,ldd是调试此问题的完美工具。人们一直说otool -L是MacOS等同于Linux ldd,但事实并非如此。 ldd实际上会查找库,并告诉您可以找到哪些库以及找到它们的位置。 otool -L仅告诉您需要链接哪些库。它不会努力检查它们是否在那里。它甚至不会告诉您在使用@rpath时搜索库的位置。

otool -l(小写L)为您提供了“加载命令”的转储,在那里您可以看到LC_RPATH命令,它们确定搜索@rpath库的位置。但是这些都无法向我解释找不到哪种依赖。

2 个答案:

答案 0 :(得分:4)

在运行matlab之前尝试设置这些环境变量:

export DYLD_PRINT_LIBRARIES=1
export DYLD_PRINT_LIBRARIES_POST_LAUNCH=1
export DYLD_PRINT_RPATHS=1

运行man dyld以获得更多可能性。

你也可以像这样设置matlab命令的变量:

DYLD_PRINT_LIBRARIES=1 DYLD_PRINT_LIBRARIES_POST_LAUNCH=1 DYLD_PRINT_RPATHS=1 matlab

答案 1 :(得分:2)

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

其中脚本可以调用为

my-ldd ./foo.dylib

或(使用rpath尝试回显)

my-ldd -r ./foo.dylib
相关问题