Tweet

binutils についての,adhoc な説明. 用語についてはかなりいい加減です.

ld

リンカ.

OS 上で動作するプログラムを作成する時は普通は gcc 経由で呼び出すので,明示的に ld を使う機会はほとんど無い.

が,スタンドアロンで動作させるプログラム(ブートローダなど)の場合は,たいていは明示的に呼び出す必要がある.

オブジェクトのアドレス配置などはリンカスクリプトで指定する. 簡易な配置はコマンドラインオプションでも指定可能.

objcopy

オブジェクトの形式変換.

例えば,linux カーネルをコンパイルして作成される vmlinux ファイル. これは elf 形式のため,このままメモリ上に配置しても実行することはできない. これをバイナリイメージ(というか,メモリ上に展開されるイメージ)に変換することができる.

あと,「形式」としてモトローラの S-redord もサポートしている. ROM ライタを使用する時は便利かも.

それから,特定のセクション(プログラム領域・定数領域・変数領域など)のみを選択することも可能.

objdump

ディスアセンブラ(だけ,というわけでもないのだけど).

まずは,-d オプション. ディスアセンブルを行う. elf 形式など,領域情報(プログラムコード・データの区別)が内包されているファイルの場合,そこらへんはよろしく取り計らってくれる.

が,前述の objcopy などでバイナリ形式に変換された場合,諸々の情報が落ちてしまっている. このような時は,-D オプションを使用する. ただし,プログラムコード・やデータの情報は落ちてしまっているので,データ領域もコードとしてディスアセンブルされてしまう. ここらは古き良き時代(?)のディスアセンブラ同様である.

gcc で -g フラグを付けてデバッグ情報付きでコンパイルされたファイルは,-S オプションも使用可能である. C のソースとアセンブラのニーモニックが霜降りで表示される.

strip

OS 上の実行オブジェクトから,ローカルシンボル・デバッグ情報などの実行時に不要な情報を削除する. ファイルシステムのフットプリント削減には有効.

シェアードライブラリ (*.so) にも適用可能であるが,不具合が出るという説もある.

linux のカーネルモジュールに適用すると,読み込みできなくなるので注意.

nm

オブジェクトファイル内のシンボルとアドレスの一覧を出力する.

strip したオブジェクトについては,-D オプションを付けると,外部参照しているシンボルについては表示させることができる.

アドレス・シンボルの種類・シンボル名の形式で出力される.

重要なのはシンボルの種類.

  • 大文字は外部参照可能,小文字はローカルのシンボルであることを表す.
  • U は未解決シンボル
    シェアードライブラリとリンクしたプログラムの場合は実行時リンクで解決されるシンボル.*.o ファイルの場合は,リンカ(と,実行時リンク)で解決されるべきシンボル.
  • T は,関数のエントリアドレス
    というか,ジャンプ先のアドレス,かな.

かな.


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2005-11-01 (火) 04:59:23 (4426d)