.soファイルにシンボルをリストする方法


486

.soファイルからエクスポートされるシンボルを一覧表示するにはどうすればよいですか?可能であれば、それらのソースも知りたいです(たとえば、静的ライブラリから取得した場合)。

違いがある場合は、gcc 4.0.2を使用しています。


プラットフォームによって違いが生まれます。AppleはGCC 4.0を提供nmしていますが、-Dand -g(IIRC)などの一部のオプションには応答しません。
jww 2013

Mac OSでは何も印刷されません。
IgorGanapolsky 2016年

3
@jww nmはGNUではなくBSDだからnmです。
OrangeDog 2016

回答:


577

シンボルをリストするための標準的なツールは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

35
ただし、これは常に.soファイルで機能するとは限らないため、別の回答で言及されている「readelf」ソリューションを使用する必要がある場合があります。
Brooks Moses

9
OS Xバージョンのnmには、シンボルをデマングルするための「-C」オプションがないことに注意してください。代わりにc ++ filtを使用できます。ここにスクリプトの例:v8.googlecode.com/svn/branches/bleeding_edge/tools/mac-nm nm -g /usr/lib/libstdc++.6.dylib | c ++ filt -p -i
fredbaba 2013年

5
readelf -Wsすべてのシンボルをnm -g表示し、外部から見えるシンボルのみを表示することに注意してください。複数のシンボルファイルを調べてコマンドの交換を開始する場合、これは混乱を招く可能性があります。
Andrew B

3
objectdump -TCリストにも追加します。とは逆にreadelf -Ws、マングルされた名前は表示されません。
Yan Foto 2015

2
@BrooksMoses .soファイルの場合--dynamicnmコマンドラインに追加する必要がある場合があります。
user7610

84

.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}';

19
readelf -Ws /usr/lib/libstdc++.so.6 | awk '{print $ 8}'; 正規表現は素晴らしいですが、時には少しawkが長い道のりを進んでいます。
deft_code


42

共有ライブラリlibNAME.soの場合、私のLinuxでシンボルを表示するには-Dスイッチが必要でした

nm -D libNAME.so

他の人が報告した静的ライブラリの場合

nm -g libNAME.a

35

すべてのシンボルが常にnmで表示されていたため、なぜ-fvisibility = hidden#pragma GCCの可視性が何の影響もないように思えたのですが、この記事でreadelfobjdumpが表示されるまで、そこに気づきました。実際には2つのシンボルテーブルのようです:

  • nmでリストできるもの
  • readelfobjdumpでリストできるもの

前者には、リンカまたはインストールコマンドに指定できるストリップまたは-sスイッチでストリップできるデバッグシンボルが含まれていると思います。nmに何もリストされなくなっても、エクスポートされたシンボルはELFの「動的シンボルテーブル」にあるため、エクスポートされます。後者は後者です。


3
ありがとうございました!これは、「nm」が.soファイルのシンボルを表示しない場合がある理由を説明しています。
Brooks Moses

10
nm -D-ダイナミックシンボルテーブルをリストできます
pt123

19

C ++ .soファイルの場合、最終的なnmコマンドはnm --demangle --dynamic --defined-only --extern-only <my.so>

# nm --demangle --dynamic --defined-only --extern-only /usr/lib64/libqpid-proton-cpp.so | grep work | grep add
0000000000049500 T proton::work_queue::add(proton::internal::v03::work)
0000000000049580 T proton::work_queue::add(proton::void_function0&)
000000000002e7b0 W proton::work_queue::impl::add_void(proton::internal::v03::work)
000000000002b1f0 T proton::container::impl::add_work_queue()
000000000002dc50 T proton::container::impl::container_work_queue::add(proton::internal::v03::work)
000000000002db60 T proton::container::impl::connection_work_queue::add(proton::internal::v03::work)

ソース:https : //stackoverflow.com/a/43257338


11

各シンボルのソースを取得するには、nmフラグに-lを追加してみてください。ライブラリがデバッグ情報(gcc -g)でコンパイルされている場合、これはソースファイルと行番号になります。コンラッドが言ったように、オブジェクトファイル/静的ライブラリはおそらく現時点では不明です。


11

Androidの場合.so、ファイル、NDKツールチェーンは、他の回答で述べた必要なツールが付属していますreadelfobjdumpnm


9

nm -gbinutilsツールチェーンのツールを使用できます。ただし、それらのソースは常に容易に入手できるとは限りません。そして、私はこの情報がいつでも取得できるかどうかさえ実際にはわかりません。おそらく、objcopyさらなる情報を明らかにします。

/ EDIT:ツールの名前はもちろんnmです。このフラグ-gは、エクスポートされたシンボルのみを表示するために使用されます。


6

nm -gは、extern変数をリストします。これは、エクスポートされたシンボルである必要はありません。(Cの)非静的ファイルスコープ変数はすべて外部変数です。

nm -Dは動的テーブルにシンボルをリストします。これは、dlsymによってそのアドレスを見つけることができます。

nm-バージョン

GNU nm 2.17.50.0.6-12.el5 20061020


1

あなただけの記号があるかどうかを知りたい場合は提示し、使用することができます

objdump -h /path/to/object

またはデバッグ情報をリストする

objdump -g /path/to/object
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.