加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

Linux下ARM程序的编译运行及调试

(2013-01-14 11:17:34)
标签:

it

一、交叉编译环境的安装

1. 首先下载linux平台下的arm toolchain

这里使用从googlecode下载的4.3.2版本的toolchain,地址如下:

http://code.google.com/p/princess-alist/downloads/detail?name=arm-linux-gcc-4.3.2.tgz&can=2&q=

2. 安装该toolchain

首先激昂下载的arm-linux-gcc-4.3.2.tgz任意解压到一个位置。解压后得到的低一级文件夹名为usr,接着第二级和第三级文件夹分别为localarm,这里我们需要将整个arm文件夹拷贝到路径/usr/local(绝对地址)下。指令如下:http://s11/mw690/a5ba8b0ftd337202bb2aa&690

       这里参数-r是表示复制目录以及目录下的所有项,参数-v表示赋值的过程中显示详细步骤。

3. 修改环境变量

       在第二步后,交叉编译的工具集都在路径/usr/local/arm/4.3.2/bin下了,现在需要将该路径添加到环境变量中以方便使用。

       如果直接使用指令export PATH=$PATH:/usr/local/arm/4.3.2/bin,则仅在当前终端(terminal)中有效,重新打开的终端以及重启后都需要重新使用该指令,因此这里修改/etc目录下的profile文件:

http://s10/mw690/a5ba8b0ftd337249e09b9&690

http://s11/mw690/a5ba8b0ftd33724d2b80a&690

 

 

/etc/profile文件的最下一行加入export所示的那句指令并保存。这里需要重新启动系统或者注销系统后再登陆才可生效。生效后我们使用echo $PATH指令可以看到环境变量中已经将之前的路径添加进去:

http://s9/mw690/a5ba8b0ftd33730938208&690

 

而且当我们在终端中输入“arm-”后连按两次tab键,可以看到arm toolchain中的所有工具的列表:http://s4/mw690/a5ba8b0ftd33730eb7463&690

 

       至此,arm工具集安装完成,我们可以利用这些工具进行交叉编译,编译出arm平台下可以执行的程序。

4. 编译Hello World程序,测试交叉工具链

写下下面的Hello World程序,保存为 hello.c

#include

int main()

{

printf("Hello World!/n");

return 0;

}

现在利用arm工具集中的arm-linux-gcc对其进行编译http://s13/mw690/a5ba8b0ftd337313788bc&690

 

       可以看到,这里编译没有错误,但是无法执行,因为这里编译生成的是arm平台上的可执行文件,因此需要放在arm目标板或者arm模拟器中运行。

二、qemu的安装

       这里,我们利用qemu模拟arm平台以运行利用上面的交叉编译编译出来的arm程序。

       qemu的安装可以直接使用sudo apt-get install指令进行安装,要使用qemuarm平台的模拟功能,需要安装qemuqemu-arm-staticqemu-kvm-extras,如下:http://s15/mw690/a5ba8b0ftd337315a4dde&690

 

安装完成之后,在终端中输入“qemu”后连续点按两次tab键,可以看到qemu所有的工具集:http://s11/mw690/a5ba8b0ftd33731d4893a&690

 

       下面,我们使用qemu-arm来尝试运行之前编译的hello-arm程序,结果如下:http://s3/mw690/a5ba8b0ftd33731fa1b42&690

 

可以看到,提示在/lib文件夹下缺少ld-linux.so.3这个文件,由于这里运行的是arm程序,因此可以考虑去交叉编译所在目录中寻找该文件,最终,在路径/usr/local/arm/4.3.2/arm-none-gnueabi/libc/lib文件夹中找到该文件,这个一个指向ld-2.8.so链接文件。因此,我们将该文件拷贝到lib文件夹下面:http://s10/mw690/a5ba8b0ftd3373221e159&690

 

       此时,再次尝试用qemu-arm运行hello-arm程序,结果如下:http://s13/mw690/a5ba8b0ftd3373245dcdc&690

 

       这里,无法打开,libc.so.6这个文件,我们发现在/lib文件下有该文件,但是该文件的指向的是该目录下的libc-2.11.1.sohttp://s10/mw690/a5ba8b0ftd337325dd1c9&690

 

       arm程序运行时所需的库文件为/usr/local/arm/4.3.2/arm-none-gnueabi

/libc/lib路径下的libc-2.8.so文件,因此我们将/lib路径下的libc.so.6删除,并重新创建指向/usr/local/arm/4.3.2/arm-none-gnueabi/libc/lib/libc-2.8.so文件的libc.so.6文件:http://s16/mw690/a5ba8b0ftd337328ccedf&690

 

       此时,我们可以看到程序可以正常运行。(改变之后,gcc在进行程序编译的时候将出错,如果要想正常使用gcc,需要做一次相反的操作。)

三、arm程序的调试

这里利用gdbqemu-arm运行的程序进行远程gdb调试,首先是在终端中输入如下指令等待调试:http://s8/mw690/a5ba8b0ftd33732b51b67&690

 

       这时,再打开另外一个终端,并在其中利用arm-linux-gdb进入调试器,并通过端口1234连接到qemu-arm等待调试的程序:http://s15/mw690/a5ba8b0ftd3373320e29e&690

 

       (这里在进入调试器的时候,一定要在后面加入被调试程序的源程序,不然在调试中会出现无法加载符号表的问题。)这里可以看到程序成功利用1234端口开始对qemu-arm的加载的程序进行调试了,并停止在程序_start位置(该位置并非main函数的入口点)。后面的调试过程与使用常规的gdb调试器对程序进行调试的步骤一样,不再详述。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有