概要
nmはオブジェクトファイル内のシンボルテーブルを分析し、各シンボルの名前、タイプ、アドレスなどを出力します。これは、リンキング問題の診断、ライブラリの内容確認、コード最適化分析などに役立ちます。
主な機能
- オブジェクトファイルのシンボルリストの出力
- シンボルタイプ(関数、変数、定義済み、未定義など)の識別
- シンボルアドレスおよびサイズ情報の提供
- C++名デマングリングのサポート
主なオプション
nmコマンドは、シンボルリストをフィルタリングし、出力形式を制御する様々なオプションを提供します。
シンボルフィルタリング
出力形式
生成されたコマンド:
コマンドを組み合わせてみてください。
説明:
`nm` コマンドを実行します。
これらのオプションを組み合わせて、AIと一緒に仮想的にコマンドを実行してみてください。
使用例
nmコマンドを使用して、オブジェクトファイルのシンボル情報を確認する様々な方法を見ていきます。
基本シンボルリストの表示
gcc -c main.c -o main.o
nm main.o
コンパイルされた実行ファイルまたはオブジェクトファイルのすべてのシンボルを基本形式で出力します。
未定義シンボルのみの表示
nm -u main.o
リンクされていない外部関数や変数など、未定義のシンボルのみを出力し、リンキング問題を診断するのに役立ちます。
C++シンボルのデマングリング
g++ -c my_class.cpp -o my_class.o
nm -C my_class.o
C++オブジェクトファイルの複雑なシンボル名を、人間が読みやすい形式に変換して出力します。
シンボルサイズと共に表示
nm -S main.o
各シンボルのアドレスと共に、そのシンボルが占めるサイズ(バイト)を出力します。
ヒントと注意点
nmコマンドを効果的に活用するためのヒントと注意点です。
シンボルタイプ文字
nmの出力で各シンボルの横に表示される文字は、シンボルのタイプを示します。大文字はグローバルシンボル、小文字はローカルシンボルを意味します。
- A: 絶対シンボル (Absolute)
- B/b: 初期化されていないデータセクション (BSS)
- D/d: 初期化されたデータセクション
- T/t: テキスト(コード)セクション
- U: 未定義シンボル (Undefined)
- W/w: 弱いシンボル (Weak)
デバッグでの活用
nmは、リンカエラーを診断したり、特定の関数や変数がライブラリに正しく含まれているかを確認する際に非常に役立ちます。特に-uオプションは、未定義参照を見つけ出し、リンキング問題を解決するのに役立ちます。