エルドラド カジノ

6.13. Binutils-2.22

Binutils パッケージは、リンカーやアセンブラーなどのようにオブジェクトファイルを取り扱うツール類を提供します。

概算ビルド時間: 1.9 SBU
必要ディスク容量: 343 MB

6.13.1. Binutils のインストール

PTY が chroot 環境内にて正しく作動しているかどうかを確認するために、以下の簡単なテストを実行します。

expect -c "spawn ls"

上のコマンドは以下を出力するはずです。

spawn ls

上のような出力ではなく、以下のような出力メッセージが含まれていたら、PTY の動作が適切に構築できていないことを示しています。 Binutils や GCC のテストスイートを実行する前に、この症状は解消しておく必要があります。

The system has no more ptys.
Ask your system administrator to create more.

standards.info ファイルの日付が古いため、インストールしないことにします。 より新しいものが Autoconf の作業を通じてインストールされます。

rm -fv etc/standards.info
sed -i.bak '/^INFO/s/standards.info //' etc/Makefile.in

コンパイラーの最適化を行った場合にビルドに失敗するため、これを修正するパッチを適用します。

patch -Np1 -i ../binutils-2.22-build_fix-1.patch

Binutils のドキュメントによると Binutils のビルドにあたっては、ソースディレクトリ以外の専用のビルドディレクトリを作成することが推奨されています。

mkdir -v ../binutils-build
cd ../binutils-build

Binutils をコンパイルするための準備をします。

../binutils-2.22/configure --prefix=/usr --enable-shared

パッケージをコンパイルします。

make tooldir=/usr

make パラメーターの意味:

tooldir=/usr

通常 tooldir (実行ファイルが最終的に配置されるディレクトリ) は $(exec_prefix)/$(target_alias) に設定されています。 x86_64 マシンでは /usr/x86_64-unknown-linux-gnu となります。 LFS は自分で設定を定めていくシステムですから /usr ディレクトリ配下に CPU ターゲットを特定するディレクトリを設ける必要がありません。 $(exec_prefix)/$(target_alias) というディレクトリ構成は、クロスコンパイル環境において必要となるものです。 (例えばパッケージをコンパイルするマシンが Intel であり、そこから PowerPC マシン用の実行コードを生成するような場合です。)

[重要項目]

重要項目

本節における Binutils のテストスイートは極めて重要なものです。 したがってどのような場合であっても必ず実行してください。

コンパイル結果をテストします。

make -k check

パッケージをインストールします。

make tooldir=/usr install

libiberty ヘッダーファイルをインストールします。 他のパッケージがこれを必要としている場合があるためです。

cp -v ../binutils-2.22/include/libiberty.h /usr/include

6.13.2. Binutils の構成

インストールプログラム: addr2line, ar, as, c++filt, elfedit, gprof, ld, ld.bfd, nm, objcopy, objdump, ranlib, readelf, size, strings, strip
インストールライブラリ: libiberty.a, libbfd.{a,so}, libopcodes.{a,so}
インストールディレクトリ: /usr/lib/ldscripts

概略説明

addr2line

指定された実行モジュール名とアドレスに基づいて、プログラム内のアドレスをファイル名と行番号に変換します。 これは実行モジュール内のデバッグ情報を利用します。 特定のアドレスがどのソースファイルと行番号に該当するかを確認するものです。

ar

アーカイブの生成、修正、抽出を行います。

as

gcc の出力結果をアセンブルして、オブジェクトファイルとして生成するアセンブラー。

c++filt

リンカーから呼び出されるもので C++ と Java のシンボルを複合 (demangle) し、オーバーロード関数が破壊されることを回避します。

elfedit

ELF ファイルの ELF ヘッダーを更新します。

gprof

コールグラフ (call graph) のプロファイルデータを表示します。

ld

複数のオブジェクトファイルやアーカイブファイルから、一つのファイルを生成するリンカー。 データの再配置やシンボル参照情報の結合を行います。

ld.bfd

ld へのハードリンク。

nm

指定されたオブジェクトファイル内のシンボル情報を一覧表示します。

objcopy

オブジェクトファイルの変換を行います。

objdump

指定されたオブジェクトファイルの各種情報を表示します。 さまざまなオプションを用いることで特定の情報表示が可能です。 表示される情報は、コンパイル関連ツールを開発する際に有用なものです。

ranlib

アーカイブの内容を索引として生成し、それをアーカイブに保存します。 索引は、アーカイブのメンバーによって定義されるすべてのシンボルの一覧により構成されます。 アーカイブのメンバーとは再配置可能なオブジェクトファイルのことです。

readelf

ELF フォーマットのバイナリファイルの情報を表示します。

size

指定されたオブジェクトファイルのセクションサイズと合計サイズを一覧表示します。

strings

指定されたファイルに対して、印字可能な文字の並びを出力します。 文字は所定の長さ (デフォルトでは 4文字) 以上のものが対象となります。 オブジェクトファイルの場合デフォルトでは、初期化セクションとロードされるセクションからのみ文字列を抽出し出力します。 これ以外の種類のファイルの場合は、ファイル全体が走査されます。

strip

オブジェクトファイルからデバッグシンボルを取り除きます。

libiberty

以下に示すような数多くの GNU プログラムが利用する処理ルーチンを提供します。 getoptobstackstrerrorstrtolstrtoul

libbfd

バイナリファイルディスクリプター (Binary File Descriptor) ライブラリ。

libopcodes

opcodes (オペレーションコード; プロセッサー命令を「認識可能なテキスト」として表現したもの) を取り扱うライブラリ。 このライブラリは objdump などのように、ビルド作業にて利用するユーティリティプログラムが利用しています。