0

私は大きなプロジェクトをコンパイルしています。このプロジェクトは共有ライブラリ、特に lapack を使用しています。

特定の機能について、システムがどの共有ライブラリでそれを見つけるかを確認したいと思います。

ここでnm出力:

$ nm -DC ~/bin/app | grep potrf
                 U dpotrf_

予想通り、dpotrf_ は未定義です。

objdump の結果は次のとおりです。

$ objdump -TR  ~bin/app | grep potrf
0000000000925428 R_X86_64_JUMP_SLOT  dpotrf_

だからobjdumpは何かを見つけます!どの共有ライブラリで見つかったかを表示するオプションはありますか? またはそれを行う別のプログラムですか?

4

1 に答える 1

3

ldd は、候補ライブラリを見つけるための出発点であることは間違いありません。そのような目的のために .bashrc にあるものを次に示します (美しくはありませんが、私の目的には役立ちます)。

基本的に、サブディレクトリ内のすべてのライブラリ (.a、.so) に対して nm を実行します。nm が検索されたシンボルの出力を生成する場合、ライブラリ名と関連する行を nm から出力します。最後のステップは、「T」で始まる行を検索することです。これは、シンボルをプログラム コード (テキスト) として定義しているためです。

# run nm on a set of objects (ending with the 1st parameter) and
# grep the output for the 2nd parameter
function nmgrep ()
{
    for i in $( find \. -name \*$1 ); do
        if [[ ! -e $i ]]; then
            continue;
        fi  
        nm $i | grep $2 > /tmp/foo.tmp;
        if [[ -s /tmp/foo.tmp ]]; then
            echo $i; 
            cat /tmp/foo.tmp | grep $2
        fi  
        rm /tmp/foo.tmp
    done  
}

# find symbols definied/referenced in libs
function libgrep ()
{
    nmgrep .a $@
    nmgrep .so $@
}
于 2010-11-12T11:50:23.980 に答える