14

関数がライブラリ内に存在するかどうかを判断したり、コンパイルされたライブラリ内の関数を一覧表示したりするにはどうすればよいですか?

4

5 に答える 5

26

nmコマンドを使用して、静的ライブラリ内のシンボルを一覧表示できます。

nm -g -C <libMylib.a>
于 2008-12-24T20:00:29.710 に答える
15

ELFバイナリの場合、readelfを使用できます。

readelf -sW a.out | awk '$4 == "FUNC"' | c++filt

-s:リスト記号 -W:長すぎる名前をカットしないでください

次に、awkコマンドはすべての関数をフィルターで除外し、c++filtはそれらの関数をアンマングルします。つまり、内部の命名スキームから変換され、人間が読める形式で表示されます。これに似た名前を出力します(boost.filesystem libから取得):

285: 0000bef0    91 FUNC    WEAK   DEFAULT   11 boost::exception::~exception()

c ++ filtがない場合、名前は次のように表示されます。_ZN5boost9exceptionD0Ev

于 2008-12-24T20:08:06.010 に答える
7

Microsoftツールの場合、「link /dump /symbols <filename>」はあなたに厄介な詳細を提供します。読みやすいリストを提供する他の方法(またはオプション)がおそらくあります。

于 2008-12-24T20:21:09.027 に答える
6

objdump -TLinux / Unixでは、特定のオブジェクトに含まれるエクスポートされたシンボルを一覧表示するために使用できます。Windowsの下にはdumpbin(IIRC dumpbin /exports)があります。オーバーロードを許可するために、C++関数名がマングルされていることに注意してください。

編集:codelogicの回答を見た後 objdumpは-Cも理解してマングリング解除を実行することを思い出しました。

于 2008-12-24T20:02:48.923 に答える
5

次のコマンドを使用します。

objdump -t "your-library"

関数名だけでなく、シンボルテーブル全体を必要以上に出力します。取得したシンボルのさまざまな属性を確認すると、変数などから関数を分類できるようになります。

于 2008-12-24T20:00:58.147 に答える