20. オブジェクトのシンボルをリスト nm

 
20.1 nm オブジェクトのシンボルをリスト
20.2 find との組み合わせ

20.1 nm オブジェクトのシンボルをリスト

 実行可能ファイル、オブジェクトファイルもしくはライブラリファイルのシンボルをリストします。  基本形は
> nm [オプション] [オブジェクトファイル名]

 オブジェクトファイルを省略すると「a.out を検索します。(このあたり、も~「a.out」がデフォルトっていうのはなくなったりしないのかしら)

 オブジェクトファイル名として「*.o」のような一般的なオブジェクト、「*.a」のようなスタティックリンクライブラリ、「*.so」のようなダイナミックリンクライブラリが指定可能です。

#include <stdio.h>

int main(int argc, char* argv[])
{
    return 0;
}

 というソース「a.c」をコンパイル・リンクして

> clang a.c

 「nm」で出力すると以下のようになります。

> nm a.out
08049630 d _DYNAMIC
080496e8 d _GLOBAL_OFFSET_TABLE_
         w _Jv_RegisterClasses
08049620 d __CTOR_END__

	~ 略 ~

080485c0 T _fini
080482f8 T _init
         U _init_tls@@FBSD_1.0
08048350 T _start
08048370 t _start1
0804814c r abitag
         U atexit@@FBSD_1.0
08048164 r crt_noinit_tag
08049710 B environ
         U exit@@FBSD_1.0
080484c0 t finalizer
08048530 t frame_dummy
08048560 T main

 2列目に出力しているアルファベットは以下の型を意味します。
 小文字の場合はローカルシンボルで大文字はグローバルシンボルとなります。

文字 意 味
A 絶対値でリンクで変更されない (???)
B 初期化されないデータ
C コモンシンボル。初期化されないデータ
D 初期化されているデータ
G 小さなオブジェクトの初期化されたデータ
I 別のシンボルへの間接的な参照
N デバッグシンボル
R 読み込み専用データ
S 小さなオブジェクトの初期化されていないデータ
T テキスト(コード)
U 未定義
V ウィーク (weak:弱い) オブジェクト
W ウィーク (weak:弱い) オブジェクト
- a.out のスタブ (stab)
? 未知の型

20.2 find との組み合わせ

 ライブラリでシンボル定義が存在することが分かっている。  ライブラリにオブジェクトをいれているかどうかわからない。  という状況であったとき、以下のように find と組み合わせて、シンボルの一覧を抽出したり、有無を調べたりしました。  一覧を抽出  (ディレクトリ名やなんかはあくまで参考程度に)
> find ./ -name "*.so" -print -exec nm {} \; > ファイル名.txt

 関数の有無を調査

> find ./ -name "*.so" -print -exec nm {} \; | grep 関数名