nmコマンドはオブジェクトファイルや実行ファイルを指定することでそのオブジェクトファイルのシンボル情報を確認できます。シンボル情報は、コンパイラがソースコードにある変数名などの情報をオブジェクトファイルに変換するときに、どのように変換されたかの情報を確認できるため、デバッグ情報として利用できるかもしれません。
目次
- 1 シンボル情報のタイプの文字対応表
- 2 シンボル情報を表示
- 3 ファイル名も表示 (-Aオプションまたは-oオプション)
- 4 デバッグ用のシンボルを含めすべてのシンボルを表示 (-aオプション)
- 5 動的シンボルの情報を表示 (-Dオプション)
- 6 出力フォーマットを指定 (-fオプション)
- 7 externalシンボルのみを表示 (-gオプション)
- 8 未定義シンボルのみを表示 (--undefined-onlyオプション)
- 9 定義済みシンボルのみを表示 (--defined-onlyオプション)
- 10 デバッグ情報を利用してシンボルに行番号を追加 (-lオプション)
- 11 シンボル値でソート (-nオプションまたは-vオプション)
- 12 シンボルのサイズを表示 (-Sオプション)
- 13 逆順でソート (-rオプション)
- 14 アーカイブファイルのインデックスを含むシンボル情報を表示 (-sオプション)
- 15 シンボル値の基数を指定 (-tオプション)
- 16 参考
シンボル情報のタイプの文字対応表
nmコマンドでは
1 |
0000000000000000 T main |
のような形式でシンボル情報が表示されます。
一番左がシンボル値(デフォルト:16進数)、真ん中がシンボルのタイプ、一番右がシンボル名になります。
シンボルのタイプは例えば、以下のような種類があります。また、シンボルのタイプは基本的に大文字がグローバルで、小文字がローカルとなります。
シンボルのタイプ
文字 | 意味 |
A | シンボル値が絶対値 |
B (b) | 初期化されていないデータセクション(BSS) |
C | コモンシンボル |
D (d) | 初期化されているデータセクション |
I | 他のシンボルの間接参照 |
N | デバッグシンボル |
R (r) | read onlyデータセクション |
T (t) | テキストセクション |
U | 未定義シンボル |
V (v) | weak symbol |
W (w) | weak symbol (タグ付けされていない) |
? | シンボルタイプが不明 |
シンボル情報を表示
nmコマンドはオブジェクトファイルを指定するとシンボル情報を表示できます。
nmコマンドで引数を指定しない場合、a.outのファイルが指定されます。
コマンド例
1 |
nm prog.o |
実行結果
1 2 3 4 |
U func1 U func2 U func3 0000000000000000 T main |
ファイル名も表示
(-Aオプションまたは-oオプション)
-Aオプションまたは-oオプションを用いるとシンボル情報にファイル名の情報が表示されます。
コマンド例
1 |
nm -o prog.o |
実行結果
1 2 3 4 |
prog.o: U func1 prog.o: U func2 prog.o: U func3 prog.o:0000000000000000 T main |
デバッグ用のシンボルを含めすべてのシンボルを表示
(-aオプション)
-aオプションを用いると通常では表示されないシンボルがすべて表示されます。
コマンド例
1 |
nm -a prog.o |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
0000000000000000 b .bss 0000000000000000 n .comment 0000000000000000 d .data 0000000000000000 N .debug_abbrev 0000000000000000 N .debug_aranges 0000000000000000 N .debug_info 0000000000000000 N .debug_line 0000000000000000 N .debug_str 0000000000000000 r .eh_frame 0000000000000000 n .note.GNU-stack 0000000000000000 t .text U func1 U func2 U func3 0000000000000000 T main 0000000000000000 a prog.c |
動的シンボルの情報を表示
(-Dオプション)
-Dオプションを用いると動的シンボルの情報を表示します。動的シンボルの情報は共有ライブラリ等を使用しているオブジェクトファイルで確認できます。
コマンド例
1 |
nm -D func.so |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
w _ITM_deregisterTMCloneTable w _ITM_registerTMCloneTable w _Jv_RegisterClasses 0000000000201028 B __bss_start w __cxa_finalize w __gmon_start__ 0000000000201028 D _edata 0000000000201030 B _end 000000000000071c T _fini 0000000000000590 T _init 00000000000006e0 T func1 00000000000006f3 T func2 0000000000000706 T func3 U puts |
出力フォーマットを指定
(-fオプション)
-fオプションを用いると出力フォーマットを変更できます。出力フォーマットは'bsd', 'sysv', 'posix'になります。デフォルトの出力フォーマットは'bsd'になります。
コマンド例
1 |
nm -f sysv prog.o |
実行結果
1 2 3 4 5 6 7 8 |
Symbols from prog.o: Name Value Class Type Size Line Section func1 | | U | NOTYPE| | |*UND* func2 | | U | NOTYPE| | |*UND* func3 | | U | NOTYPE| | |*UND* main |0000000000000000| T | FUNC|000000000000001a| |.text |
コマンド例
1 |
nm -f posix prog.o |
実行結果
1 2 3 4 |
func1 U func2 U func3 U main T 0000000000000000 000000000000001a |
externalシンボルのみを表示
(-gオプション)
-gオプション用いると外部に公開されているシンボルのみが表示されます。例えば、C言語のstatic修飾子を用いるとシンボルのスコープがそのファイルのみになります。ここでnmコマンドの-gオプションを用いて、シンボル情報を確認するとstatic修飾子を用いたシンボルが表示されません。
prog2.c
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <stdio.h> void testfunc(void); static void static_testfunc(void); void testfunc(){ printf("testfunc\n"); } void static_testfunc(){ printf("static_testfunc\n"); } int main(){ testfunc(); static_testfunc(); return 0; } |
nmコマンドの実行結果(-gオプションなし)
1 2 3 4 5 |
$ nm prog2.o 0000000000000022 T main U puts 0000000000000011 t static_testfunc 0000000000000000 T testfunc |
コマンド例
1 |
$ nm -g prog2.o |
実行結果
1 2 3 |
0000000000000022 T main U puts 0000000000000000 T testfunc |
未定義シンボルのみを表示
(--undefined-onlyオプション)
--undefined-onlyオプションを用いると未定義シンボルのみを表示します。
コマンド例
1 |
nm --undefined-only prog.o |
実行結果
1 2 3 |
U func1 U func2 U func3 |
定義済みシンボルのみを表示
(--defined-onlyオプション)
--defined-onlyオプションを用いると定義済みシンボルのみが表示されます。
コマンド例
1 |
nm --defined-only prog.o |
実行結果
1 |
0000000000000000 T main |
デバッグ情報を利用してシンボルに行番号を追加
(-lオプション)
-lオプションを用いるとオブジェクトファイルにあるデバッグ情報を利用して行番号を追加して表示します。デバッグ情報は例えば、gccの-gオプションを用いると作成されるオブジェクトファイルにデバッグ情報が追加されます。
コマンド例
1 |
nm -l prog.o |
実行結果
1 2 3 4 |
U func1 /home/ubuntu/test_objdump/prog.c:8 U func2 /home/ubuntu/test_objdump/prog.c:9 U func3 /home/ubuntu/test_objdump/prog.c:10 0000000000000000 T main /home/ubuntu/test_objdump/prog.c:7 |
シンボル値でソート
(-nオプションまたは-vオプション)
-nオプションまたは-vオプションを用いるとシンボル値でソートされます。
コマンド例
1 |
nm -n prog2.o |
実行結果
1 2 3 4 |
U puts 0000000000000000 T testfunc 0000000000000011 t static_testfunc 0000000000000022 T main |
シンボルのサイズを表示
(-Sオプション)
-Sオプションを用いるとシンボル値の後にシンボルのサイズが表示されます。また、--size-sortオプションを用いるとそのサイズでソートを行うことができます。
コマンド例
1 |
nm -S --size-sort prog2.o |
実行結果
1 2 3 |
0000000000000011 0000000000000011 t static_testfunc 0000000000000000 0000000000000011 T testfunc 0000000000000022 0000000000000015 T main |
逆順でソート
(-rオプション)
-rオプションを用いると逆順でソートを行うことができます。例えば、-nオプションと一緒に用いるとシンボル値で逆順のソートを行うことができます。
コマンド例
1 |
nm -n -r prog2.o |
実行結果
1 2 3 4 |
0000000000000022 T main 0000000000000011 t static_testfunc 0000000000000000 T testfunc U puts |
また、-nオプション等のオプションがない場合、シンボル名をアルファベット順の逆順でソートします。
コマンド例
1 |
nm -r prog2.o |
実行結果
1 2 3 4 |
0000000000000000 T testfunc 0000000000000011 t static_testfunc U puts 0000000000000022 T main |
アーカイブファイルのインデックスを含むシンボル情報を表示
(-sオプション)
-sオプションを用いるとシンボル情報のほかにアーカイブファイルのインデックス情報が表示されます。
コマンド例
1 |
nm -s archive.a |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
Archive index: func1 in file1.o func2 in file2.o func3 in file3.o file1.o: 0000000000000000 T func1 U puts file2.o: 0000000000000000 T func2 U puts file3.o: 0000000000000000 T func3 U puts |
シンボル値の基数を指定
(-tオプション)
-tオプションを用いるとシンボル値の基数を変更できます。シンボル値の基数のデフォルトは16進数になります。-tオプションで指定できるのは、d (10進数), o (8進数), x (16進数)になります。
コマンド例
1 |
nm -t o prog2.o |
実行結果
1 2 3 4 |
0000000000000042 T main U puts 0000000000000021 t static_testfunc 0000000000000000 T testfunc |