.so ファイルからエクスポートされるシンボルを一覧表示するにはどうすればよいですか? 可能であれば、それらのソースも知りたいです (たとえば、静的ライブラリから取り込まれた場合など)。
それが違いを生む場合、私はgcc 4.0.2を使用しています。
.so ファイルからエクスポートされるシンボルを一覧表示するにはどうすればよいですか? 可能であれば、それらのソースも知りたいです (たとえば、静的ライブラリから取り込まれた場合など)。
それが違いを生む場合、私はgcc 4.0.2を使用しています。
シンボルを一覧表示するための標準ツールは ですnm
。次のように簡単に使用できます。
nm -gD yourLib.so
C++ ライブラリのシンボルを表示したい場合は、「-C」オプションを追加して、シンボルをデマングルします (デマングルするとはるかに読みやすくなります)。
nm -gDC yourLib.so
.so ファイルが elf 形式の場合、次の 2 つのオプションがあります。
どちらかobjdump
( -C
C++ のデマングリングにも役立ちます):
$ objdump -TC libz.so
libz.so: file format elf64-x86-64
DYNAMIC SYMBOL TABLE:
0000000000002010 l d .init 0000000000000000 .init
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 free
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __errno_location
0000000000000000 w D *UND* 0000000000000000 _ITM_deregisterTMCloneTable
または使用readelf
:
$ readelf -Ws libz.so
Symbol table '.dynsym' contains 112 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000002010 0 SECTION LOCAL DEFAULT 10
2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND free@GLIBC_2.2.5 (14)
3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __errno_location@GLIBC_2.2.5 (14)
4: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTable
.so
ファイルがelf形式の場合は、readelfプログラムを使用して、バイナリからシンボル情報を抽出できます。このコマンドは、シンボルテーブルを提供します。
readelf -Ws /usr/lib/libexample.so
この.so
ファイルで定義されているものだけを抽出する必要があり、参照されているライブラリでは抽出しないでください。この場合、7番目の列には数値が含まれている必要があります。単純な正規表現を使用して抽出できます。
readelf -Ws /usr/lib/libstdc++.so.6 | grep '^\([[:space:]]\+[^[:space:]]\+\)\{6\}[[:space:]]\+[[:digit:]]\+'
または、Caspinによって提案されたように、:
readelf -Ws /usr/lib/libstdc++.so.6 | awk '{print $8}';
objdump -TC /usr/lib/libexample.so
共有ライブラリ libNAME.so の場合、Linux でシンボルを表示するには -D スイッチが必要でした
nm -D libNAME.so
および他の人が報告した静的ライブラリの場合
nm -g libNAME.a
-fvisibility =hidden と #pragma GCC の可視性がnm で常に表示されていたので、なぜ-fvisibility=hiddenと#pragma GCC の可視性が影響を及ぼさなかったのか疑問に思っていました。実際には2つのシンボルテーブルのようです:
前者には、リンカーまたはインストールコマンドに指定できるstripまたは -s スイッチで削除できるデバッグ シンボルが含まれていると思います。また、nm に何も表示されなくなったとしても、エクスポートされたシンボルは ELF の「動的シンボル テーブル」にあるため、引き続きエクスポートされます。これは後者です。
Android.so
ファイルの場合、NDK ツールチェーンには、他の回答に記載されている必要なツールが付属しています: readelf
、objdump
およびnm
.
各シンボルのソースを取得するには、nm フラグに -l を追加してみてください。ライブラリがデバッグ情報 (gcc -g) でコンパイルされている場合、これはソース ファイルと行番号になります。Konrad が言ったように、オブジェクト ファイル / 静的ライブラリはおそらく現時点では不明です。
nm -g
binutils ツールチェーンのツールを使用できます。ただし、それらのソースは常にすぐに入手できるとは限りません。そして、この情報が常に取得できるかどうかは実際にはわかりません。おそらくobjcopy
、さらなる情報が明らかになるでしょう。
/編集: ツールの名前はもちろんnm
です。フラグ-g
は、エクスポートされたシンボルのみを表示するために使用されます。
nm -g extern 変数をリストします。これは、エクスポートされたシンボルである必要はありません。非静的ファイル スコープ変数 (C) はすべて extern 変数です。
nm -D は動的テーブルにシンボルをリストし、dlsym でそのアドレスを見つけることができます。
nm --バージョン
GNU nm 2.17.50.0.6-12.el5 20061020
シンボルが存在するかどうかを知りたいだけの場合は、使用できます
objdump -h /path/to/object
またはデバッグ情報を一覧表示する
objdump -g /path/to/object