開発ボードなしで、armプログラムをデバッグして実行する方法は?
この記事では主に、Ubuntuでアームクロスコンパイルおよび実行環境を構築する方法について説明します。
クロスコンパイルツールチェーンarm-linux-gnueabihf-gccをインストールします。
sudo apt-get install gcc-arm-linux-gnueabihf
インストール後、非常に多くのクロスコンパイルツールがシステムに追加されていることがわかります。
helloworld@ubuntu:~$ arm-linux-gnueabihf-
arm-linux-gnueabihf-addr2line arm-linux-gnueabihf-gcov-7
arm-linux-gnueabihf-ar arm-linux-gnueabihf-gcov-dump
arm-linux-gnueabihf-as arm-linux-gnueabihf-gcov-dump-7
arm-linux-gnueabihf-c++filt arm-linux-gnueabihf-gcov-tool
arm-linux-gnueabihf-cpp arm-linux-gnueabihf-gcov-tool-7
arm-linux-gnueabihf-cpp-7 arm-linux-gnueabihf-gprof
arm-linux-gnueabihf-dwp arm-linux-gnueabihf-ld
arm-linux-gnueabihf-elfedit arm-linux-gnueabihf-ld.bfd
arm-linux-gnueabihf-gcc arm-linux-gnueabihf-ld.gold
arm-linux-gnueabihf-gcc-7 arm-linux-gnueabihf-nm
arm-linux-gnueabihf-gcc-ar arm-linux-gnueabihf-objcopy
arm-linux-gnueabihf-gcc-ar-7 arm-linux-gnueabihf-objdump
arm-linux-gnueabihf-gcc-nm arm-linux-gnueabihf-ranlib
arm-linux-gnueabihf-gcc-nm-7 arm-linux-gnueabihf-readelf
arm-linux-gnueabihf-gcc-ranlib arm-linux-gnueabihf-size
arm-linux-gnueabihf-gcc-ranlib-7 arm-linux-gnueabihf-strings
arm-linux-gnueabihf-gcov arm-linux-gnueabihf-strip
次のコードを実行してソフトリンクを確立します。そうしないと、後で実行したときに動的ライブラリが見つからないというエラーが報告されます。
sudo ln -s /usr/arm-linux-gnueabihf/lib/libc.so.6/lib/libc.so.6
sudo ln -s /usr/arm-linux-gnueabihf/lib/ld-linux-armhf.so.3/lib/ld-linux-armhf.so.3
テストコード main.c
を書く:
# include <stdio.h>
int main(){printf("helloworld\n");return0;}
次のコマンドは、最初に main.c
をコンパイルして、armプラットフォームの下に実行可能ファイル a.out
を生成します。次に、 file
コマンドを使用すると、 a.out
がarmプラットフォームの下にあるelf実行可能ファイルであることがわかります。
helloworld@ubuntu:~$ arm-linux-gnueabihf-gcc main.c
helloworld@ubuntu:~$ file a.out
a.out: ELF 32-bit LSB shared object, ARM, EABI5 version 1(SYSV), dynamically linked, interpreter /lib/ld-,for GNU/Linux 3.2.0, BuildID[sha1]=7592a0494955ca8bb953948ea4cfbefc90b2e2e9, not stripped
アームエミュレータqemuをインストールします。
sudo apt-get install qemu
armプラットフォームの実行可能ファイル a.out
を実行します。ご覧のとおり、プログラムは正しい結果 helloworld
を出力します。
helloworld@ubuntu:~$ qemu-arm a.out
helloworld
gdbを使用してUbuntuでarmプログラムをデバッグする原理:qemu側は実行可能プログラムを開始するgdbサーバーとして機能し、もう一方の端はローカルおよびリモートデバッグのためにgdbサーバーに接続するgdbクライアントとして機能します。
まず、マルチプラットフォームgdbツールをインストールします。
sudo apt-get install gdb-multiarch
サンプルコード main.c
を再コンパイルします。今回は、パラメーター --static
が追加されていることに注意してください。このパラメーターを追加すると、生成された実行可能ファイルが静的にリンクされます。 **このパラメータを追加しないと、gdbのデバッグ時にシングルステップ機能が異常になり、シンボルテーブルが見つかりません。 ** arm-linux-gnueabihf-gcc --static -g main.c
次のコマンドを使用して実行可能プログラム a.out
を起動します。オプション -g
はgdbのリスニングポートを指定します。ここでは1234です。このコマンドが実行されると、現在のウィンドウがブロックされます。 qemu-arm -g 1234 a.out
新しいコマンドラインウィンドウを開き、gdbクライアントを起動し、gdbインタラクティブインターフェイスに入ります。gdb-multiarcha.out
サーバー側に接続するには、gdbインタラクティブインターフェイスに次のように入力します。targetremotelocalhost:1234
次に、gdbの関連機能を使用して、プログラムを正常にデバッグできます。(gdb)b main Breakpoint 1 at 0x102e8:file main.c、line 5(gdb)cContinuing。Breakpoint1、main()at main.c: 5 5 printf( "helloworld \ n");
Recommended Posts