みねっちょのマイコン関係ブログ

組込開発系フリーソフトやハードの情報発信ブログ

ARM シミュレータ内蔵 GDB のビルド手順

最終更新: 2021-06-06
GDB (The GNU Project Debugger) にはターゲット CPU 用の命令セット シミュレータが内蔵可能です。これを使用すると、ホスト上でクロスコンパイルしたバイナリ オブジェクトを GDB 単体で実行可能となります。本記事では、WSL の Ubuntu-20.04 上で GDB 10.2 を ARM CPU 用の内蔵シミュレータ付きでソースコードからビルドする手順を紹介します。 尚、本デバッガの使用方法は【こちらの別記事】で紹介しています。

目次:

本デバッガで出来ること:

本デバッガを使用すると、次の図の様に クロスコンパイルした C 言語等の高級言語ソースコードと、ARM のディスアセンブリ リストを同一のテキスト ターミナル画面上に表示して、ブレークポイントを設定したりシングルステップ実行したり出来ます。
f:id:minettyo:20210602180225j:plain
また、ARM CPU のレジスタの値をディスアセンブルリストを同時に表示して、ARM のアセンブリ言語上にブレークポイントを設定したりシングルステップ実行したりしながら、同時にレジスタの内容を確認出来ます。
f:id:minettyo:20210603152542j:plain



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 コマンドで Makefile 内から使用されます。
ロスコンパイラのパッケージ名は 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つの方法で確認可能です。

  1. gdb-10.2/gdb/README を参照する (直下ではなく、gdb の下の README です)
  2. 次の公式サイトを参照する https://sourceware.org/gdb/current/onlinedocs/gdb/Configure-Options.html
  3. 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 は、zlibreadline はビルドせずにホスト内の既存の物を使う為に指示します。これらのライブラリも標準パッケージが有り、/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 しますが、解析は大変なので諦めます。

  • 当初、この話かと思ったのですが、これは既に修正されていました。
    f:id:minettyo:20210602111708j:plain:w200
... 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


f:id:minettyo:20210531203737j:plain

インストール:

コンフィギュレーションで指定した /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 用シミュレータ内蔵のデバッガのビルドは完了です。本デバッガの使用方法は【こちらの別記事】で紹介しています。



【ARM 関係の目次へ戻る】   【WSL 関係の目次へ戻る】