最終更新: 2021-06-06
GDB (The GNU Project Debugger) にはターゲット CPU 用の命令セット シミュレータが内蔵可能です。これを使用すると、ホスト上でクロスコンパイルしたバイナリ オブジェクトを GDB 単体で実行可能となります。本記事では、WSL の Ubuntu-20.04 上で GDB 10.2 を ARM CPU 用の内蔵シミュレータ付きでソースコードからビルドする手順を紹介します。
尚、本デバッガの使用方法は【こちらの別記事】で紹介しています。
目次:
- 本デバッガで出来ること:
- GDB Sim プロジェクトの Wiki ページ:
- ソースコードのダウンロード:
- ビルドに必用なパッケージのインストール:
- ソースコードの展開:
- コンフィギュレーション用スクリプトの作成:
- ビルドの実行:
- ビルド結果のチェック:
- ビルド後の起動の確認:
- インストール:
- インストール後の起動の確認:
本デバッガで出来ること:
本デバッガを使用すると、次の図の様に クロスコンパイルした C 言語等の高級言語ソースコードと、ARM のディスアセンブリ リストを同一のテキスト ターミナル画面上に表示して、ブレークポイントを設定したりシングルステップ実行したり出来ます。
また、ARM CPU のレジスタの値をディスアセンブルリストを同時に表示して、ARM のアセンブリ言語上にブレークポイントを設定したりシングルステップ実行したりしながら、同時にレジスタの内容を確認出来ます。
GDB Sim プロジェクトの Wiki ページ:
ソースコードのダウンロード:
GNU のミラーリストの中から、日本の https サイトを探します。
一覧の中から GDB をクリックし、最新の GDB をダウンロードします。2021年5月現在はバージョン10.2です。xz
形式で圧縮したファイルの方が gzip
形式よりも小さいので、xz 形式の次のファイルをダウンロードします。
gdb-10.2.tar.xz 2021-04-25 13:31 21M
gdb-10.2.tar.xz.sig 2021-04-25 13:31 95
WSL 上にファイルを移動して、シグネチャを検証します。
gpg --verify ./gdb-10.2.tar.xz.sig ./gdb-10.2.tar.xz
gpg --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys F40ADB902B24264AA42E50BF92EDB04BFF325CF3
gpg --verify ./gdb-10.2.tar.xz.sig ./gdb-10.2.tar.xz
次のサイトで、サインした人の氏名を確認します。 "Joel Brobecker <brobecker@adacore.com>" 氏が該当しますので、サインは妥当だと判断します。
ビルドに必用なパッケージのインストール:
ビルドに必用なパッケージをインストールします。下記リストは、過不足が有るかと思います。
sudo apt update
sudo apt upgrade
sudo apt install build-essential dejagnu gdb gdbserver zlib1g-dev libreadline-dev libncurses-dev python3 texinfo
sudo apt install libexpat1-dev liblzma-dev libxxhash-dev libsource-highlight-dev guile-2.2-dev libbabeltrace-dev
sudo apt install gnulib libiberty-dev libmpc-dev libmpfr-dev libgmp-dev libisl-dev
sudo apt autoremove
公式なドキュメントは次の通りです。
また、先にクロスコンパイラをインストールしておきます。このクロスコンパイラは、ビルド後の検証 make check
クロスコンパイラのパッケージ名は gcc-arm-none-eabi ですが、コマンドとしては、arm-none-eabi-gcc となります。
sudo apt install gcc-arm-none-eabi
arm-none-eabi-gcc --version
ソースコードの展開:
サーバから取得したファイルを展開します。
xzcat gdb-10.2.tar.xz | tar xf -
コンフィギュレーション用スクリプトの作成:
configure
用のシェルスクリプトを用意します。--target
で指定するターゲットの名称は、インストールしたクロスコンパイラやアセンブラのコマンド名に合わせ、
arm-none-eabi
make check
--enable-target
の部分には、対応する BFD フォーマットの形式を記述します。ターゲット名の指定のし方に関してはソースコード中の bfd/config.bfd
ファイルを見て調べます。 次のスクリプトでは「エンディアンのリトルとビッグ」および「ビット数の 32 と 64 」の ELF 形式の組み合わせの4通りを網羅して記載しています。
スクリプト内にて --enable-sim
を指定する事により、内蔵シミュレータが有効となります。
尚、コンフィギュレーション用オプションの詳細は、次の3つの方法で確認可能です。
- gdb-10.2/gdb/README を参照する (直下ではなく、gdb の下の README です)
- 次の公式サイトを参照する https://sourceware.org/gdb/current/onlinedocs/gdb/Configure-Options.html
- gdb-10.2/configure --help を参照する
cat から EOF までを ubuntu ターミナル上にコピー&ペーストすると、config_arm-none-eabi.sh
というファイルが出来ます。
cat << "EOF" > config_arm-none-eabi.sh
#!/bin/dash -x
../gdb-10.2/configure \
--target=arm-none-eabi \
--enable-targets=arm-elf,armeb-elf,aarch64-elf,aarch64_be-elf \
--enable-sim \
\
--enable-tui \
--enable-curses \
--enable-source-highlight \
--with-python \
--with-lzma \
--with-babeltrace \
--with-xxhash \
--with-guile \
--with-system-gdbinit=/etc/gdb/gdbinit \
\
--prefix=/usr/local \
--enable-gold=no \
--enable-ld=no \
--enable-host-shared \
--disable-install-libiberty \
--with-system-zlib \
--with-system-readline \
\
--with-mpc-include=/usr/include \
--with-mpfr-include=/usr/include \
--with-gmp-include=/usr/include \
--with-isl-include=/usr/include \
--with-mpc-lib=/usr/lib/x86_64-linux-gnu \
--with-mpfr-lib=/usr/lib/x86_64-linux-gnu \
--with-gmp-lib=/usr/lib/x86_64-linux-gnu \
--with-isl-lib=/usr/lib/x86_64-linux-gnu
EOF
--disable-install-libiberty
は、クロスツールを開発する時に指定する一般的な物です。Ubuntu では /usr/lib/x86_64-linux-gnu/libiberty.a
に標準パッケージがインストールされますので、そちらを優先します。
--with-system-zlib
と --with-system-readline
は、zlib
と readline
はビルドせずにホスト内の既存の物を使う為に指示します。これらのライブラリも標準パッケージが有り、/usr/lib/x86_64-linux-gnu
ディレクトリ下に libz.a
および libreadline.a
としてインストール可能です。必用パッケージのインストール時に zlib1g-dev
および libreadline-dev
として指定しています。
作成したシェルスクリプトには実行可能属性を付与します。
chmod u+x ./config_arm-none-eabi.sh
ビルドの実行:
mkdir build_arm-none-eabi
cd build_arm-none-eabi
../gdb-10.2/configure --help
作成したビルド用ディレクトリの中で configure と make を行います。 バックグラウンドで実行するので、シェルの notify オプションをオンにしておきます。
set -o notify
../config_arm-none-eabi.sh &> zzconfig.sh &
Done
の文字が出力され、コンフィギュレーションにエラーが無い事を確認します。
Exit
で終了した場合にはエラーが有りますので、原因を確認します。
エラーが無い場合には引き続き make
します。
make &> zzmake.log &
tail -f zzmake.log
Done
または Exit
が出たら Ctrl-c
を押して tail コマンドを終了します。
Exit
で終了した場合にはエラーが発生していますので、内容を確認します。
ビルド結果のチェック:
ビルドの結果をテストします。sim ディレクトリの下に降りて実行します。
cd sim
make check &> zzcheck.log &
次の様な結果が出ます。残念がなら1つのテストが FAIL しますが、解析は大変なので諦めます。
- 当初、この話かと思ったのですが、これは既に修正されていました。
... snip ...
=== sim tests ===
Schedule of variations:
unix
Running target unix
... snip ...
Running ../../../gdb-10.2/sim/testsuite/sim/arm/allinsn.exp ...
Running ../../../gdb-10.2/sim/testsuite/sim/arm/iwmmxt/iwmmxt.exp ...
Running ../../../gdb-10.2/sim/testsuite/sim/arm/misc.exp ...
FAIL: arm7tdmi movw-movt.ms (execution)
Running ../../../gdb-10.2/sim/testsuite/sim/arm/thumb/allthumb.exp ...
Running ../../../gdb-10.2/sim/testsuite/sim/arm/xscale/xscale.exp ...
... snip ...
=== sim Summary ===
# of expected passes 52
# of unexpected failures 1
0.5
make[1]: *** [Makefile:109: check-DEJAGNU] Error 1
... snip ...
ビルド後の起動の確認:
cd ..
gdb/gdb
GDB 10.2 が起動します。次のコマンドで、シミュレータ付きでビルドされている事を確認しておきます。target サブコマンドのリストの中に sim
が有れば大丈夫です。(gdb)
のプロンプトが出ている状態で次のコマンドを打ちます。
help target
show configuration
quit
インストール:
コンフィギュレーションで指定した /usr/local ディレクトリ下にプログラムをインスト―ルします。インストールは root 権限で行います。
sudo su
make install &> zzinstall.log
exit
インストール後の起動の確認:
env | grep PATH
コマンドにて、/usr/local/bin にパスが通って居る事を確認しておきます。
arm-none-eabi-gdb
GDB 10.2 が起動します。インストール前同様に起動を確認します。(gdb)
のプロンプトが出ている状態で次のコマンドを打ちます。
help target
quit
以上で ARM 用シミュレータ内蔵のデバッガのビルドは完了です。本デバッガの使用方法は【こちらの別記事】で紹介しています。