最近在学习arm汇编的知识,就想着可不可以在树莓派搭建一个arm汇编的调试环境,可以实现arm汇编程序的单步调试之类的功能。我选择的使用的是gdb+gdbserver+qemu的方式。
我的实验环境如下:
Ubuntu12.04LTS (安装在VMware-workstation-full-9里)
树莓派
下面是我安装的详细配置
1. 编译安装gdb-7.5=========================================
首先到http://www.gnu.org/software/gdb/ 下载gdb-7.5.tar.gz。
a) 下载后解压:输入
tar zxvf gdb-7.5.tar.gz
b) 修改/ gdb-7.5/gdb/remote.c
屏蔽process_g_packet函数中的下列两行:
if (buf_len > 2 * rsa->sizeof_g_packet)
error (_(“Remote ‘g’ packet reply is too long: %s”), rs->buf);
在其后面加上以下代码:
if (buf_len > 2 * rsa->sizeof_g_packet) { rsa->sizeof_g_packet = buf_len ; for (i = 0; i < gdbarch_num_regs (gdbarch); i++) { if (rsa->regs[i].pnum == -1) continue; if (rsa->regs[i].offset >= rsa->sizeof_g_packet) rsa->regs[i].in_g_packet = 0; else rsa->regs[i].in_g_packet = 1; } } |
注意:这个修改只是针对7.x的版本,对于久版本不清楚。这是为了修正gdb-7.5远程调试中的Remote ‘g’ packet reply is too long错误。
c) 编译gdb
这里先要安装一个程序包,之后需要它的支持
sudo apt-get install libncurses5-dev
进到gdb7.5/目录下(注意不要进错目录),设置安装的目录和一些参数。输入
./configure --target=arm-linux --prefix=/usr/local/arm-gdb
编译
make
安装
make install
如果都没有报错,就代表安装成功了。
接着修改/etc/bash.bashrc文件,把arm-linux-gdb加入到环境变量。在最后加上
if [ -d /usr/local/arm-gdb/bin ]; then
PATH=/usr/local/arm-gdb/bin:$PATH
fi
使修改生效:
source /etc/bash.bashrc
d) 编译gdbserver
#cd ./gdb/gdbserver
#./configure --target=arm-linux --host=arm-linux
#make CC=arm- linux –gcc
把编译好的gdbsever文件放到/armfs中去。这个可执行文件要被树莓派来使用。/armfs是我的ubuntu和树莓派的共享文件夹。
2. 测试====================================================
编写一个小程序测试test.c。代码如下:
#include
int main(){
int a, b, c ;
a=0;
b=0;
c=a+b;
return 0;
}
输入:arm-linux-gcc -o test.exe -g test.c
把test.exe放到ubuntu的nfs共享目录中去。我的目录为/armfs。关于怎么搭建nfs共享目录,前面关于树莓派交叉编译环境的搭建的博文里面有。
把/armfs mount 到树莓派上。在树莓派的终端中输入:
mount –t nfs –o nolock 169.254.8.175:/armfs /mnt
如果是复制粘贴命令的话,注意树莓派里的”–”要短些。这里最后自己输入。169.254.8.175是我的ubuntu的ip。
在树莓派的/mnt目录下,输入
./gdbserver 169.254.8.175:6666 test.exe
这里指明监听的端口是6666,169.254.8.175是我的ubuntu的ip。调试将在ubuntu上进行。
接着在ubutu的终端里输入arm-linux-gdb test.exe
再输入target remote 169.254.8.100:6666,告诉gdb运行的程序在169.254.8.100:6666上。这时候树莓派上会有回显:
在ubutu里输入l可以查看原代码,
输入b 8 在第8行插入一个断点,输入c继续执行,到第八行时会停下。
3. 调试汇编程序
写一个小小的汇编程序test.s:
.text .align 2 .global _start _start: mov r1,#1 mov r2,r1,r1,lsl #2 add r2,r2,r1 mov r0, #0 swi #0x900001 .align 2 |
在树莓派上输入:
arm-linux-as test.s -o test.o
arm-linux-ld test.o -o tests
把tests拷贝到/armfs下,
在树莓派下输入:
./gdbserver 169.254.8.175:6666 tests
在ubuntu下输入arm-linux-gdb tests
(gdb) target remote 169.254.8.100:6666
这时程序停在第一行的位置。可以输入si,使程序运行一步,再输入info register查看寄存器内容。程序最后的寄存器状态如下: