nm – オブジェクトファイルやライブラリ内のシンボル一覧を表示するコマンド

バイナリ解析・シンボル
スポンサーリンク

nm コマンドは、オブジェクトファイル(.o)、静的ライブラリ(.a)、実行ファイルなどに含まれるシンボル(関数・変数)を一覧表示 するためのコマンドです。
未定義シンボルやエクスポートされる関数の確認、リンクエラー調査に利用されます。

構文(Syntax)

nm [オプション] ファイル...

主なオプション一覧

オプション説明使用例
(なし)シンボルを表示(アドレス・タイプ・名前)nm a.out
-aデバッグシンボルも含めて全て表示nm -a foo.o
-g外部(グローバル)シンボルのみ表示nm -g libfoo.a
-u未定義シンボルのみ表示nm -u main.o
-CC++ のシンボル名をデマングル(可読化)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 ファイルのシンボルもまとめて表示されます。

参考

スポンサーリンク
Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント