プログラム開発やデバッグの現場で「nmコマンド」を使ったことがある方、または名前だけ聞いたことがある方もいるでしょう。Linuxなどの開発環境で使われるこのコマンドは、コンパイル済みファイルの中身を調査するのに非常に役立ちます。
本記事では、nmコマンドの意味・機能・使い方・シンボルテーブルの読み方・プログラム開発での活用について、わかりやすく解説していきます。
nmコマンドとは「オブジェクトファイルや実行ファイルのシンボルテーブルを表示するUnix系OSのコマンド」
それではまず、nmコマンドの基本的な定義と役割について解説していきます。
nmコマンドはLinux・macOS・Unixなどのシステムで使用できるコマンドラインツールで、コンパイルによって生成されたオブジェクトファイル(.o)・スタティックライブラリ(.a)・共有ライブラリ(.so)・実行可能ファイルに含まれるシンボルテーブルの情報を表示する役割を持ちます。
nmコマンドの基本情報
コマンド名:nm
対応OS:Linux・macOS・Unix系OS全般
主な用途:シンボルテーブルの確認・未定義シンボルの調査・デバッグ支援
基本構文:nm [オプション] ファイル名
GNU Binutils版とBSD nm版で出力形式が若干異なる
「シンボル」とは関数名・変数名・ラベルなどのプログラム要素を識別するための名称であり、nmコマンドでシンボルの定義・参照・アドレスを確認することで、ライブラリの構成・リンクエラーの調査・逆アセンブル補助などに活用できます。
nmコマンドの出力フォーマットの読み方
続いては、nmコマンドの出力フォーマットと各カラムの意味を確認していきます。
基本的な出力フォーマット
nmコマンドの出力は一般的に以下の3カラム構成になっています。
nmコマンドの出力フォーマット
(アドレス)(タイプ)(シンボル名)
例:0000000000001234 T main
例: U printf
アドレス:シンボルのメモリアドレス(未定義の場合は空白)
タイプ:シンボルの種別を示す1文字(T・U・D・Bなど)
シンボル名:関数名・変数名など
シンボルタイプ(1文字コード)の意味
| タイプ文字 | 意味 | 説明 |
|---|---|---|
| T(t) | テキストセクション | コード(関数)が定義されている |
| U | 未定義(Undefined) | 参照しているが定義がない(外部参照) |
| D(d) | データセクション | 初期化済みグローバル変数 |
| B(b) | BSSセクション | 未初期化グローバル変数 |
| R(r) | 読み取り専用データ | 定数・文字列リテラルなど |
| W(w) | 弱いシンボル(Weak) | 上書き可能な定義 |
大文字はグローバルシンボル(外部公開)、小文字はローカルシンボル(ファイル内限定)を示します。
「U」(未定義)のシンボルが表示された場合、リンク時にそのシンボルが解決される必要があることを意味し、リンクエラーの診断に役立ちます。
nmコマンドの主なオプションと使い方
続いては、nmコマンドの主なオプションと実際の使用例を確認していきます。
よく使うオプション一覧
nmコマンドの主要オプション
nm -a ファイル:デバッグシンボルを含むすべてのシンボルを表示
nm -u ファイル:未定義シンボル(U)のみを表示
nm -n ファイル:アドレスの数値順にソートして表示
nm -r ファイル:逆順にソートして表示
nm -C ファイル:C++のマングリングされた名前をデマングルして表示
nm -D ファイル:動的シンボルテーブルを表示(共有ライブラリに有効)
nm -l ファイル:シンボルのソースファイル名と行番号を表示
C++のデマングルオプション(-C)の重要性
C++でコンパイルされたファイルでは、関数名が「マングリング(name mangling)」という処理で変換されているため、そのまま表示すると「_Z4testv」のような読みにくい文字列になります。
「nm -C」オプションを使うことで「test()」のような元の関数名で表示でき、デバッグ作業が格段にしやすくなります。
nmコマンドの実践的な活用場面
続いては、開発・デバッグ現場でのnmコマンドの実践的な活用場面を確認していきます。
リンクエラーの診断
ビルド時に「undefined reference to 〜」というリンクエラーが発生した際、nm -u コマンドで未定義シンボルを確認することで、どのライブラリや関数が欠けているかを特定できます。
ライブラリの関数一覧確認
共有ライブラリ(.soファイル)が提供している公開関数一覧を確認したい場合、「nm -D ライブラリ.so」で動的シンボルテーブルを表示することで、利用可能なAPIを素早く把握できます。
まとめ
本記事では、nmコマンドの意味・シンボルテーブルの読み方・主なオプション・実践的な活用場面について詳しく解説しました。
nmコマンドはオブジェクトファイルや実行ファイルのシンボル情報を表示するUnix系OSのツールで、リンクエラーの診断・ライブラリの内容確認・デバッグ支援に活躍します。
シンボルタイプの「T(コード定義)」「U(未定義)」「D(データ定義)」の意味を理解することで、出力結果を正しく読み解けるようになるでしょう。
開発現場でのトラブル解決ツールとして、nmコマンドをぜひ活用してみてください。