関数がライブラリ内に存在するかどうかを判断したり、コンパイルされたライブラリ内の関数を一覧表示したりするにはどうすればよいですか?
5 に答える
nmコマンドを使用して、静的ライブラリ内のシンボルを一覧表示できます。
nm -g -C <libMylib.a>
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
Microsoftツールの場合、「link /dump /symbols <filename>
」はあなたに厄介な詳細を提供します。読みやすいリストを提供する他の方法(またはオプション)がおそらくあります。
objdump -T
Linux / Unixでは、特定のオブジェクトに含まれるエクスポートされたシンボルを一覧表示するために使用できます。Windowsの下にはdumpbin
(IIRC dumpbin /exports
)があります。オーバーロードを許可するために、C++関数名がマングルされていることに注意してください。
編集:codelogicの回答を見た後、 objdumpは-Cも理解してマングリング解除を実行することを思い出しました。
次のコマンドを使用します。
objdump -t "your-library"
関数名だけでなく、シンボルテーブル全体を必要以上に出力します。取得したシンボルのさまざまな属性を確認すると、変数などから関数を分類できるようになります。