nm コマンドは、オブジェクトファイル(.o)、静的ライブラリ(.a)、実行ファイルなどに含まれるシンボル(関数・変数)を一覧表示 するためのコマンドです。
未定義シンボルやエクスポートされる関数の確認、リンクエラー調査に利用されます。
構文(Syntax)
nm [オプション] ファイル...
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
| (なし) | シンボルを表示(アドレス・タイプ・名前) | nm a.out |
-a | デバッグシンボルも含めて全て表示 | nm -a foo.o |
-g | 外部(グローバル)シンボルのみ表示 | nm -g libfoo.a |
-u | 未定義シンボルのみ表示 | nm -u main.o |
-C | C++ のシンボル名をデマングル(可読化) | nm -C libfoo.a |
-D | 動的シンボルのみ表示(共有ライブラリに対して) | nm -D libbar.so |
-S | シンボルサイズも表示 | nm -S foo.o |
--defined-only | 定義済みシンボルだけ表示 | nm --defined-only main.o |
シンボルの種別(代表的な記号)
| 記号 | 意味 |
|---|---|
T | テキスト領域(関数が定義されている) |
U | 未定義シンボル(外部からリンクされる必要あり) |
B | 未初期化データ領域(BSS) |
D | 初期化済みデータ領域(データセクション) |
R | 読み取り専用データ |
W | 弱いシンボル(weak symbol) |
実行例
実行ファイルのシンボルを表示
nm a.out
出力例:
0000000000001139 T main
U printf
(main は定義済み関数、printf は未定義で外部リンクが必要)
C++ シンボルをデマングルして表示
nm -C libmylib.a
出力例:
0000000000000000 T MyClass::hello()
U std::cout
未定義シンボルのみ表示
nm -u main.o
出力例:
U printf
グローバルシンボルのみ表示
nm -g foo.o
動的シンボルを表示(共有ライブラリ対象)
nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep printf
出力例:
00000000000648a0 T printf
エラー例(存在しないファイル指定)
nm notfound.o
出力例:
nm: notfound.o: No such file
関連コマンド
objdump: オブジェクトファイルの詳細を表示readelf: ELF ファイルのセクションやシンボルを表示ar: 静的ライブラリを作成・展開(nmと併用されることが多い)
備考
nmはリンクエラー(未定義シンボルや多重定義)の原因調査に非常に有用です。- C++ のシンボルはマングルされており、
-Cを付けてデマングルするのが実用的です。 - 静的ライブラリ(
.a)に対して実行すると、内部の.oファイルのシンボルもまとめて表示されます。
参考
- manページ: man7.org nm(1)
- GNU binutils: https://www.gnu.org/software/binutils/

コメント