交叉编译和交叉调试环境搭建及使用

简介: 交叉编译和交叉调试环境搭建及使用 1. 交叉编译器 1.1 交叉编译器介绍 在一种计算机环境中运行的编译程序,能编译出在另外一种环境下运行的代码,我们就称这种编译器支持交叉编译。这个编译过程就叫交叉编译。

交叉编译和交叉调试环境搭建及使用



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)下载源码:

可以从http://www.gnu.org/software/gdb/download/获取到最新的GDB版本。

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.2.tar.gz

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.   2
  3.   3 int main(void)
  4.   4 {
  5.   5 int a, b, i;
  6.   6 a = 3;
  7.   7 b = 4;
  8.   8 i = a + b;
  9.   9 printf("i = %d\n", i);
  10.  10 return 0;
  11.  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将读取些文件的调试讯息,如f a.exe;

   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

相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
目录
相关文章
|
Linux 开发者
交叉编译工具链的下载与安装
交叉编译工具链的下载与安装
2093 1
|
安全 网络协议 Shell
渗透测试工具用法技巧入门到进阶
零基础网盘 百度网盘-19****394的分享 新手入门过程 看完 后面有进阶过程 简单工具
337 0
|
Linux Shell 网络安全
Debian10.7 自动化安装镜像制作
Debian10.7 自动化安装镜像制作
1490 0
Debian10.7 自动化安装镜像制作
|
Kubernetes 关系型数据库 MySQL
制品库 Jfrog Artifactory 搭建私服
JFrog Artifactory 功能最强大的二进制制品仓库。在 Google、Apple、思科、甲骨文、华为、腾讯等众多世界500强公司中都有大规模使用,在二进制软件制品管理领域处于绝对领先地位。与其他服务不同,JJFrog Artifactory 在版本发行上分类较多且杂。
1623 0
制品库 Jfrog Artifactory 搭建私服
|
网络架构 网络协议
如何查看路由器的mac和计算机的mac
如何查看路由器的mac和计算机的mac 一、查看路由器的mac     方法一: 直接看路由器的背面,如下图,即可看到MAC地址   打开命令提示符窗口,输入ipconfig,找到网关地址,如192.168.1.1 3 再在命令提示符窗口中输入 arp -a 找到对应的ip地址 192.168.1.1 后的地址即为无线路由MAC地址     二、查看计算机的mac       cmd命令窗口中输入ipconfig/all命令即可查看。
3498 0
|
Ubuntu Windows
Ubuntu Remmina 远程桌面提示 “无法连接到RDP服务器”
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.
3877 2
|
Ubuntu 计算机视觉 C++
Ubuntu 20.04 编译 Opencv 4.11,详细步骤(带图)及报错解决,我的踩坑之旅~
Ubuntu 20.04 编译 Opencv 4.11,详细步骤(带图)及报错解决,我的踩坑之旅~
8694 0
|
Shell Linux 开发工具
Linux中Ctrl+C,Ctrl+Z,Ctrl+D说明
Ctrl+C:送SIGINT信号,默认进程会结束,但是进程自己可以重定义收到这个信号的行为。 Ctrl+Z:送SIGSTOP信号,进程只是被停止,再送SIGCONT信号,进程继续运行。
4288 0
|
存储 弹性计算 安全
OSS的网盘之路,最小化实现网盘分享
其实很多用户都知道OSS是非常适合用于作为网盘、附件系统的底层设施的,但是很多企业用户在沟通的过程中,其实没有很好的系统来支持OSS作为一个网盘去分发一些文件,例如企业像将介绍视频通过微信发布给有购买记录的客户,但是视频比较大也不方便直接通过微信发送视频,也不方便放到B站、优酷等视频平台中。 那么本文就介绍利用最小化资源实现OSS的网盘分享,让 ECS + OSS = 网盘。
1529 1
OSS的网盘之路,最小化实现网盘分享