GDB/GDBserverによるクロスターゲットのリモートデバッグPrograming Bible(2/3 ページ)

» 2007年11月30日 18時14分 公開
[Avi-Rozen,Open Tech Press]
SourceForge.JP Magazine

GDBのビルド

 以下の例ではターゲットプロセッサとして7450 PowerPCを使用する。

作業に入る前にGDBを動かすPCとターゲットプラットフォームの間の通信インタフェースを準備する必要がある。シリアルリンクでもよいが、できればイーサネットネットワークで接続するのが望ましい。クロスターゲットツールチェーンとしてGNU Cコンパイラも必要だ(加えて、Cランタイムライブラリと、binutils、すなわちバイナリユーティリティ群も)。これを開発ワークステーション上で動かしてターゲットプロセッサ用の実行可能プログラムを生成するわけだ。GDBのソースコードから次の2つのバイナリをビルドすることになる。

  • クロスターゲット――ホストは開発ワークステーション、ターゲットはターゲットプロセッサ
  • ネイティブ――ホストとターゲットはどちらもターゲットプロセッサ

 まず、GDBのソースコード圧縮アーカイブをダウンロードし、展開する。


mkdir -p ~/work/cross/gdb/downloads
cd ~/work/cross/gdb/downloads
wget http://ftp.gnu.org/gnu/gdb/gdb-6.7.1.tar.bz2
cd ..
tar xvjf downloads/gdb-6.7.1.tar.bz2

 GDBソースパッケージはGNUビルドシステムを使用しており、バイナリの生成は通常なら数個のコマンド(./configure ; make ; make install)で完了する。しかし、今回のケースは少し注意が必要だ。2種類のホストプロセッサについてのバイナリをビルドし、各バイナリを別の場所にインストールしたいからである。そのため、各バイナリをソースパッケージを展開したディレクトリ内ではなく、それぞれ独自のディレクトリ内でビルドすることにする。さらに、configureスクリプトのコマンドラインオプションでターゲットおよびホストのプロセッサと、インストールディレクトリプレフィックスも指定する。

 クロスターゲットのバイナリをビルドするには、--targetオプションでターゲットアーキテクチャを指定する。アーキテクチャ識別子(powerpc-7450-linux-gnu)が、すべてのクロスツールチェーンバイナリのプレフィックスとなる(クロスコンパイラのバイナリはpowerpc-7450-linux-gnu-gcc)。


mkdir -p ~/work/cross/gdb/build/host_x86
cd ~/work/cross/gdb/build/host_x86
../../gdb-6.7.1/configure --prefix=/opt/gdb/powerpc-7450-linux-gnu/cross --target=powerpc-7450-linux-gnu
make
make install

 ターゲットネイティブ・バイナリのビルドはもっとややこしい。1つにはホストアーキテクチャ(ターゲットアーキテクチャpowerpc-7450-linux-gnuと同じ)を指定する必要があるからだ。もう1つの問題は欠けているライブラリだ。一部のライブラリがクロスツールチェーンで使えない可能性があり、ターゲットネイティブGDBのビルドに取りかかる前にビルドしておく必要がある。次の例は、ターゲットネイティブtermcapライブラリが欠けていると分かったときの対処法を示している(クロスビルドには多少の違いがあるので、不確かなときは「./configure --help」で調べること)。


cd ~/work/cross/gdb/downloads
wget ftp://ftp.gnu.org/gnu/termcap/termcap-1.3.1.tar.gz
cd ..
tar xvzf downloads/termcap-1.3.1.tar.gz
mkdir -p ~/work/cross/gdb/build/termcap
cd ~/work/cross/gdb/build/termcap
export CC=powerpc-7450-linux-gnu-gcc
export RANLIB=powerpc-7450-linux-gnu-ranlib
../../termcap-1.3.1/configure --host=powerpc-7450-linux-gnu --prefix=$HOME/work/cross/termcap
make
make install

 検討すべき問題がもう1つある。バイナリを静的にリンクする必要があるかどうかだ。静的リンクが必要になるのは、GDBとGDBserverの運用に必要な共有ライブラリの一部が欠けている場合だが、それで生成される実行可能プログラムは動的リンクの場合よりもずっと大きくなる。静的リンクを指定するには、オプション-staticをLDFLAGS環境変数に追加し、その後にconfigureを実行する。追加ライブラリは、次のようにLDFLAGSとCPPFLAGSの両方で指定する必要がある。


export LDFLAGS="-static -L$HOME/work/cross/termcap/lib"
export CPPFLAGS="-I$HOME/work/cross/termcap/include"
../../gdb-6.7.1/configure --prefix=/opt/gdb/powerpc-7450-linux-gnu/native --host=powerpc-7450-linux-gnu --target=powerpc-7450-linux-gnu
make
make install

 ビルドプロセスの途中でGNUリンカから警告が出るはずだ。静的にリンクするアプリケーションで一部の関数(例えば、dlopen、 gethostbyname、その他幾つか)が使われているときは、実行時にリンク用としてGNU Cランタイムライブラリ版の共有ライブラリが必要になるからだ。それらのライブラリをターゲットプラットフォームにインストールしなければならないだろう。

 GDBserverの実行可能プログラムを生成したら、ターゲットプラットフォームにコピーする。powerpc-7450-linux-gnu-stripユーティリティでデバッグ情報を取り除いておけば、ストレージを節約できる。

 このビルド手続きを別の種類のターゲットプロセッサ用に書き換えるときは、アーキテクチャ識別子を変更するだけでよい。

関連キーワード

組み込み | Linux | コンソール


Copyright © 2010 OSDN Corporation, All Rights Reserved.

注目のテーマ