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 オプションを付けると,外部参照しているシンボルについては表示させることができる. アドレス・シンボルの種類・シンボル名の形式で出力される. 重要なのはシンボルの種類.
かな. |