.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( -CC++ のデマングリングにも役立ちます):
$ 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 -gbinutils ツールチェーンのツールを使用できます。ただし、それらのソースは常にすぐに入手できるとは限りません。そして、この情報が常に取得できるかどうかは実際にはわかりません。おそらく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