web-dev-qa-db-ja.com

MacOSX:バイナリでリンクされているダイナミックライブラリはどれですか?

バイナリがロードされない理由を理解できませんでした。これはMATLAB(MEXファイル)によってロードされたdylibであり、さまざまな場所にあるかなりの数のdylibにリンクしています。 MATLABは、MEXファイルを読み込めないと言っていますが、どの依存関係が見つからないのかわかりません。

誰かがこのようなものをデバッグする方法について何か提案がありますか?

Linuxでは、lddはこの問題をデバッグするのに最適なツールです。 otool -LはLinuxのlddと同等のMacOSであると人々は言い続けていますが、これは真実ではありません。 lddは実際にライブラリを探し、どのライブラリが見つかり、どこで見つかったかを示します。 otool -Lは、リンクに必要なライブラリのみを示します。それらがそこにあるかどうかを確認するための努力はしません。 @rpathを使用する場合、ライブラリが検索される場所もわかりません。

otool -l(小文字のL)は、「ロードコマンド」のダンプを提供します。そこには、LC_RPATHライブラリが検索される場所を確立する@rpathコマンドが表示されます。しかし、これらはどの依存関係が見つからないかを私に説明することができませんでした。

11
Cris Luengo

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
10
rob mayoff

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
4
apmccartney