交叉编译和交叉调试环境搭建及使⽤
1. 交叉编译器
1.1 交叉编译器介绍
在⼀种计算机环境中运⾏的编译程序,能编译出在另外⼀种环境下运⾏的代码,我们就称这种编译器⽀持交叉编译。这个编译过程就叫交叉编译。简单地说,就是在⼀个平台上⽣成另⼀个平台上的可执⾏代码,⽽这种⼯具就是交叉编译器(cross compiler)。
1.2 搭建交叉编译环境
1.2.1 实验环境
交叉编译⼯具:arm-linux- 4.2.2
编译平台:ubuntu10.10
开发板类型:UT-S3C6410
1.2.2 搭建步骤
1) 在/usr/local/下建⽴交叉编译器的安装⽬录arm:
sudo mkdir /usr/local/arm
2)将下载的交叉编译器包解压到/usr/local/arm⽬录下:
sudo tar jxvf cross-4.2.2-eabi.tar.bz2 -C /usr/local/arm/
3)解压成功后,修改PATH环境变量:
sudo vim /etc/profile
在⽂件为加⼊交叉编译器arm-linux-所在的路径:
export PATH=$PATH:/usr/local/arm/4.2.2-eabi/usr/bin
然后退出vim。
4) 更新⼀下配置⽂件/etc/profile:
source /etc/profile
5)检测是否安装成功:齐豫和齐秦的身世
现在就可以使⽤交叉编译器了,写⼀个测试程序helloworld,交叉编译下,看是否能在开发板上运⾏。
i. 交叉编译测试程序
arm-linux-gcc helloworld.c -o helloworld
ii.把⽣成的可执⾏⽂件helloworld复制到NFS的挂载⽬录下:
sudo cp ./helloworld /nfsboot
企业财务注意:本实验中开发板使⽤NFS挂载rootfs,nfsboot是NFS的挂载⽬录。
iii.在超级终端上运⾏:
./helloworld
执⾏结果:
2. 交叉调试GDB的介绍和使⽤
2.1 GDB是什么?
GDB(GNU symbolic debugger) 简单的说是UNIX和LINUX下的⼀个调试⼯具。非主流个性签名图片
2.2 GDB的主要特性
像所有的调试器⼀样,GDB可以让你调试⼀个程序,包括让程序在你希望的地⽅停下,此时你可以查看变量,寄存器,内存及堆栈。更进⼀步你可以修改变量及内存值。GDB是⼀个功能很强⼤的调试器,它可以调试多种语⾔。在此我们仅涉及C和C++的调试,⽽不包括其它语⾔。还有⼀点要说明的是,GDB是⼀个调试器,⽽不像VC⼀样是⼀集成环境。你可以使⽤⼀些前端⼯具如XXGDB,DDD等。他们都有图形化界⾯,因此⽤更⽅便,但它们仅是GDB的⼀层外壳。因此,你仍应熟悉GDB命令。事实上,当你使⽤这些图形化界⾯时间较长时,你才会发现熟悉GDB命令的重要性。
2.3 GDB的安装
1)下载源码:
2)先做⼀些准备⼯作:
a)Sudo mkdir –p /usr/local/arm-gdb
b)Sudo chown –R cjok /usr/local/arm-gdb
c)cd Download
3)然后开始编译arm-linux-gdb
a)解压gdb包:
tar zxvf gdb-7.
b) 配置configure⽂件:
cd gdb-7.2/
./configure --target=arm-linux --prefix=/usr/local/arm-gdb
c)编译和安装
make
sudo make install
d)cd到/usr/local/arm-gdb/⽬录下会看到
cd /usr/local/arm-gdb
ls
e)然后把arm-linux-gdb所在的路径添加到PATH环境变量中:
sudo vim /etc/profile
在⽂件为加⼊export PATH=$PATH:/usr/local/arm-gdb/bin
source /etc/profile
查看⼀下:
4)编译gdbserver
a)配置configure⽂件
cd gdb-7.2/gdb/gdbserver/
./configure --target=arm-linux --host=arm-linux
b)编译
创意礼物推荐make CC=arm-linux-gcc
c)把刚刚⽣成的gdbserver拷贝到NFS共享⽬录下,因为gdbserver最终是在⽬标机上运⾏:
sudo cp gdbserver /nfsboot/
5) 测试gdbserver
a)编译⼀个简单的程序helloworld.c
arm-linux-gcc –g helloworld.c –o helloworld
cp helloworld /nfsboot
*记得编译时,加-g选项
b)库问题
需要注意的是运⾏gdbserver还需要libthread_db库,如果你做的⽂件系统⾥没有相应的库,需要从交叉编译器内拷贝⼀个过去。cp –avf /usr/local/arm/4.2.2-eabi/lib/libthread_db* /nfsboot/lib
注意:若不知道少了什么库,可以根据运⾏时错误提⽰拷贝。
c)到超级终端上启动gdbserver
./gdbserver 192.168.1.10:2345 helloworld
注意:我⽤的HOST IP是192.168.1.10,2345是监听端⼝,可以随便设定
然后会出现:
d)然后在主机上启动gdb:
cd /nfsboot
arm-linux-gdb helloworld
会出现:
链接到开发板上:
target remote 192.168.1.128:2345
注意:192.168.1.128是开发板的IP,2345是监听端⼝,要与上⾯设置的相同
这是超级终端会出现:
e)设置⼀下gdb环境变量
show solib-absolute-prefix
set solib-absolute-prefix /usr/local/arm/4.2.2-eabi/lib/
usr/local/arm/4.2.2-eabi/lib/ 是交叉编译器的库路径
show solib-search-path
set solib-search-path /nfsboot/lib/
/nfsboot/lib是⽂件系统的库路径
注:红⾊部分为执⾏的指令。
到此环境已经搭建好,现在可以像在Linux下⽤GDB调试程序了。
2.4 GDB的使⽤
OK,现在就可以开始交叉调试了。
a) 把之前的helloworld修改⼀下:
1. 1 #include <stdio.h>
2.
3. 2
4.
5. 3 int main(void)
6.
7. 4 {
8.
9. 5 int a, b, i;
10.
11. 6 a = 3;
12.
13. 7 b = 4;
14.
15. 8 i = a + b;
16.
17. 9 printf("i = %d\n", i);
18.
19. 10 return 0;
20.
21. 11 }
b)交叉编译⽣成可执⾏⽂件之后,放到NFS的挂载⽬录下
i.在超级终端上执⾏:
./gdbserver 192.168.1.10:2345 helloworld
ii.在HOST上执⾏:
arm-linux-gdb helloworld
target remote 192.168.1.128:2345
开始对程序进⾏调试:
2.5 GDB的常⽤指令
load:装⼊⼀个程序;
symbol-file:装⼊符号库⽂件,可以是⽤-g参数编译的可执⾏⽂件;
f(ile):指定⼀个可执⾏⽂件进⾏调试,gdb将读取些⽂件的调试讯息,如;
l(ist):列程序出源⽂件;
r(un) :装载完要调试的可执⾏⽂件后,可以⽤run命令运⾏可执⾏⽂件;
b(reak):设置断点(break point),如b 25,则在源程序的第25⾏设置⼀个断点,当程序执⾏到第25⾏时,就会产⽣中断;也可以使⽤b funcname,funcname为函数的名称;
当程序运⾏到断点停下来时:
c(ontinue):c命令可以另中断的程序继续执⾏,直到下⼀个中断点或程序结束;
p(rint):输⼊某个变量的值,如程序定义了⼀个int a的就是,p a就会输出aa的当前值;
n(ext):程序执⾏到断点时中断执⾏,可以⽤n指令进⾏单步执⾏;
s(tep):程序执⾏到断点时中断执⾏,可以⽤s指令进⾏单步执⾏进某⼀函数;
q(uit):退出GDB
发布评论