在ubuntu中交叉编译arm并使用qemu和gdb调试运行

配置环境

安装必要的包:

sudo apt-get install gcc gcc-arm-linux-gnueabi binutils-arm-linux-gnueabi qemu-user gdb-multiarch

交叉编译

使用如下简单的小程序为例:

#include
int main(){
	int n;
	scanf("%d",&n);
	if(n>10){
		printf("Yes");
	}
	else
		printf("No");
}

编译为arm:

arm-linux-gnueabi-gcc -o simple-arm simple.c -static

使用静态编译是因为动态编译会找不到库文件。
查看编译后的文件类型:

$ file simple-arm 
simple-arm: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), statically linked, for GNU/Linux 3.2.0, BuildID[sha1]=19141ad019c491957afb20e02a04d3e82962e914, not stripped

使用qemu执行编译结果

qemu-arm ./simple-arm

可以成功执行。

一个小tip

如果不想每一次执行其他架构的程序的时候都在前面加上qemu-xxx,可以安装如下包,它可以自动分析文件格式然后使用特定的方式来执行:

sudo apt-get install 'binfmt*'

GDB调试

首先用qemu-arm运行arm文件,设置调试端口为12345,然后启动gdb,设置架构,大端序或者小端序,设置远程目标即可开始调试。

$ qemu-arm -g 12345 ./a.out &
$ gdb-multiarch ./a.out
(gdb) set arch arm
The target architecture is assumed to be mips
(gdb) set endian little
The target is assumed to be little endian
(gdb) target remote localhost:12345
Remote debugging using localhost:12345
0x00400280 in _ftext ()
(gdb) x/i $pc
  => 0x767cb880    move   $t9, $ra

如果使用peda插件并出现无法调试(segmentation fault)的问题,可以考虑禁用peda

你可能感兴趣的:(一些工具)