555

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

それが違いを生む場合、私はgcc 4.0.2を使用しています。

4

11 に答える 11

671

シンボルを一覧表示するための標準ツールは です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
于 2008-08-29T17:21:08.550 に答える
91

.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}';
于 2009-10-25T10:39:36.357 に答える
56
objdump -TC /usr/lib/libexample.so
于 2010-01-15T18:25:47.270 に答える
44

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

nm -D libNAME.so

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

nm -g libNAME.a
于 2013-02-06T19:54:44.537 に答える
37

-fvisibility =hidden と #pragma GCC の可視性がnm で常に表示されていたので、なぜ-fvisibility=hidden#pragma GCC の可視性が影響を及ぼさなかったのか疑問に思っていました。実際には2つのシンボルテーブルのようです:

  • nmでリストできるもの
  • readelfobjdumpで一覧表示できるもの

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

于 2010-09-07T08:55:02.707 に答える
17

Android.soファイルの場合、NDK ツールチェーンには、他の回答に記載されている必要なツールが付属しています: readelfobjdumpおよびnm.

于 2014-11-04T15:33:32.380 に答える
12

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

于 2008-08-29T21:22:13.727 に答える
11

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

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

于 2008-08-29T17:07:11.563 に答える
7

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

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

nm --バージョン

GNU nm 2.17.50.0.6-12.el5 20061020

于 2010-11-11T07:00:56.083 に答える
2

シンボルが存在するかどうかを知りたいだけの場合は、使用できます

objdump -h /path/to/object

またはデバッグ情報を一覧表示する

objdump -g /path/to/object
于 2019-02-08T11:30:53.907 に答える