.so ファイル内のシンボルを一覧表示するにはどうすればよいですか

シンボルを一覧表示するための標準ツールは 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 [email protected]_2.2.5 (14)
     3: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND [email protected]_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