8.18. Binutils-2.41

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

概算ビルド時間: 2.2 SBU
必要ディスク容量: 2.7 GB

8.18.1. Binutils のインストール

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

mkdir -v build
cd       build

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

../configure --prefix=/usr       \
             --sysconfdir=/etc   \
             --enable-gold       \
             --enable-ld=default \
             --enable-plugins    \
             --enable-shared     \
             --disable-werror    \
             --enable-64-bit-bfd \
             --with-system-zlib

configure パラメーターの意味

--enable-gold

ゴールドリンカー (gold linker) をビルドし ld.gold としてインストールします。

--enable-ld=default

オリジナルの bfd リンカーをビルドし ld (デフォルトリンカー) と ld.bfd としてインストールします。

--enable-plugins

リンカーに対してプラグインサポートを有効にします。

--enable-64-bit-bfd

64 ビットサポート(ホスト上でのワードサイズの縮小)を有効にします。 64 ビットシステムでも不要な場合がありますが、指定しておいて支障はありません。

--with-system-zlib

本パッケージに含まれる zlib をビルドするのではなく、既にインストール済の zlib を用いるようにします。

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

make tooldir=/usr

make パラメーターの意味

tooldir=/usr

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

[重要]

重要

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

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

make -k check

失敗したテストの一覧は、以下を実行すれば得られます。

grep '^FAIL:' $(find -name '*.log')

GCC に対して --enable-default-pie--enable-default-ssp の両オプションを指定した場合には、gold テストスイートにおいて 12 個のテストが失敗します。

grpofng スイートの中にある 3 つのテストが失敗します。

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

make tooldir=/usr install

不要なスタティックライブラリを削除します。

rm -fv /usr/lib/lib{bfd,ctf,ctf-nobfd,gprofng,opcodes,sframe}.a

8.18.2. Binutils の構成

インストールプログラム: addr2line, ar, as, c++filt, dwp, elfedit, gprof, gprofng, ld, ld.bfd, ld.gold, nm, objcopy, objdump, ranlib, readelf, size, strings, strip
インストールライブラリ: libbfd.so, libctf.so, libctf-nobfd.so, libgprofng.so, libopcodes.so, libsframe.so
インストールディレクトリ: /usr/lib/ldscripts

概略説明

addr2line

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

ar

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

as

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

c++filt

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

dwp

DWARF パッケージユーティリティー。

elfedit

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

gprof

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

gprofng

性能データの収集と解析を行います。

ld

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

ld.gold

elf オブジェクト向けファイルフォーマットのサポートにのみ特化した ld の限定バージョン。

ld.bfd

ld へのハードリンク。

nm

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

objcopy

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

objdump

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

ranlib

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

readelf

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

size

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

strings

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

strip

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

libbfd

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

libctf

Compat ANSI-C Type フォーマットタイプデバッギングサポートライブラリ。

libctf-nobfd

libbfd の機能を利用しない libctf の互換ライブラリ。

libgprofng

gprofng によって利用される処理ルーチンをほぼ含むライブラリ。

libopcodes

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

libsframe

simple unwinder を使って、オンラインバックトレースをサポートするライブラリ。