6.12. Binutils-2.19.1

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

概算ビルド時間: 2.1 SBU テストスイート込み
必要ディスク容量: 222 MB テストスイート込み

6.12.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

Glibc-2.10.1 に対してコンパイルテストが失敗するため、これを修正します。

sed -i -e 's/getline/get_line/' libiberty/testsuite/test-demangle.c

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

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

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

../binutils-2.19.1/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 check

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

make tooldir=/usr install

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

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

6.12.2. Binutils の構成

インストールプログラム: addr2line, ar, as, c++filt, gprof, ld, nm, objcopy, objdump, ranlib, readelf, size, strings, strip
インストールライブラリ: libiberty.a, libbfd.{a,so}, libopcodes.{a,so}

概略説明

addr2line

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

ar

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

as

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

c++filt

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

gprof

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

ld

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

nm

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

objcopy

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

objdump

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

ranlib

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

readelf

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

size

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

strings

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

strip

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

libiberty

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

libbfd

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

libopcodes

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