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

From: http://blog.chinaunix.net/uid-25119314-id-226230.html

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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404412.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

struts2文件上传中,如何限制上传的文件类型

这个在struts2的doc中已经有所说明&#xff0c;但是说得并不详细,而且他给的例子是有错误的&#xff0c;下面我将列出文件上传并限制类型的具体步骤struts2版本是2.1.6struts2是根据contentType来限制的&#xff0c;并不是文件的扩展名比如我想仅上传image/png,image/gif,image…

CGContextRef CIImageRef详解

第一种 先用UIImage对象加载一张图片 然后转化成CGImageRef放到CGContext中去编辑 第二种 用CGImageCreate函数创建CGImageRef 然后把CGImageRef放到CGContext中去编辑 第三种 用CGImageCreateCopy 或者 CGImageCreateCopyWithColorSpace 函数拷贝 CGImageRef CGImageCreate ( …

[react] react怎么拿到组件对应的DOM元素?

[react] react怎么拿到组件对应的DOM元素&#xff1f; 在Class组件中 import React from react; class CComponent extends React.Component {refDiv React.createRef();componentDidMount () {console.log(this.refDiv.current)}render () {return <div><div class…

linux缩小lv发生文件系统错误

众所周知&#xff0c;linux lvm 扩大lv是先扩大lv&#xff0c;然后再扩大文件系统&#xff0c;所以有的人就认为缩小lv也是先缩小lv,再缩小文件系统&#xff0c;当然博主刚开始也那么认为&#xff0c;导致lvresize 以后&#xff0c;lv的大小小于文件系统大小而无法挂载&#xf…

Fedora12上编译安装gdb-7.2

在Fedora12上编译安装gdb-7.2&#xff1a;编译安装gdb和gdbserver 1. 下载gdb7.2: ftp://sourceware.org/pub/gdb/releases/gdb-7.2a.tar.bz2 2. 编译安装gdb 2.1 解压&#xff1a; [zcm~ #1]$cd /mnt/hgfs/opensource/ [zcmopensource #2]$ls a52dec ffmpeg-1.2…

[react-router] react的路由和普通路由有什么区别?

[react-router] react的路由和普通路由有什么区别&#xff1f; React路由是前端的路由&#xff0c;普通路由指的是后端的路由React路由不管是hash还是browser的模式&#xff0c;都是在响应了hash/browser的change之后&#xff0c;再变更页面的DOM结构&#xff0c;由于是单页应…

UITableView 性能优化

网络图片异步加载&#xff0c;SDWebImage。文字直接 drawInRect/drawAtPoint 绘制&#xff0c;参考 ABTableViewCell&#xff0c;AdvancedTableViewCells。本地图片也可以直接绘制&#xff0c;或者用 CALayer 来添加显示。cell 重用机制。cell 内容尽量避免透明效果。如非必要&…

Hello Views之Spinner(yaozq翻译,仅供参考)

Spinner是一种类似于下拉列表的widget。 在这个教程中&#xff0c;你将创建一个简单的用于展示星球列表的spinner组件。当选择列表中的一项时&#xff0c;将会弹出一个表示所选项的toast信息。下面是具体步骤&#xff1a; 1&#xff0c;新建一个名为HelloSpinner的项目。 2&…

error PRJ0003 : 生成“cl.exe”时出错 解决方案

本人已经安装了VS2010&#xff0c;但是同事给的项目是用VC2008写的&#xff0c;用到几个lib文件&#xff0c;路径也都正确&#xff0c;但就是无法正确解析&#xff0c;所以我怀疑是lib库生成的环境问题。所以考虑装个VC2008。但是我又不敢直接安装VS2008&#xff0c;怕破坏VS20…

[react] 简要描述下你知道的react工作原理是什么?

[react] 简要描述下你知道的react工作原理是什么&#xff1f; 我理解的核心部分&#xff1a; 通过虚拟DOM表达真实DOM通过数据驱动更新虚拟DOM进而更新真实DOM&#xff08;MVVM&#xff09;有一套完整并且合理的 DOM Diff 算法&#xff08;现在 React 17 是基于 lane 架构来调…

Bitmap 之 getPixels() 的 stride

学习Graphics中遇到位图(Bitmap)中getPixels()方法&#xff0c;对该方法的用法大体理解&#xff0c;但对其中的stride参数却不明白具体的用法以及用意&#xff0c;现记述过程如下&#xff1a; getPixels()方法的用处为获取位图(Bitmap)中的像素值(颜色值)&#xff0c;存入类型为…

i++ 和 ++i 效率的分析以及自定义类型的自增/自减运算符重载实例

From: http://blog.csdn.net/leo115/article/details/8101541 我们通常在写for循环 的时候&#xff0c;要实现变量 i 的自增 1 &#xff1b;往往会在i 和i中随便挑一种写&#xff0c;对于i和i的理解&#xff0c;我们往往停留在返回的值的不同&#xff0c;其实i与i在实现效率上…

day②:字典的fromkeys方法

start##fromkeys方法本身就是把所有的key都指向同一个对象了>>> cdict.fromkeys(range(5),[]) >>> c{0: [], 1: [], 2: [], 3: [], 4: []}>>> c[0].append({"B":{123}})>>> c{0: [{B: set([123])}], 1: [{B: se…

[react-router] React-Router的实现原理是什么?

[react-router] React-Router的实现原理是什么&#xff1f; 1.react-router依赖基础 - history&#xff0c;是一个独立的第三方js库&#xff0c;可以用来兼容在不同浏览器、不同环境下对历史记录的管理&#xff0c;拥有统一的API。具体来说里面的history分为三类: HashRouter…

Linux Bash Shell入门教程

BASH 的基本语法 最简单的例子 —— Hello World! 关于输入、输出和错误输出 BASH 中对变量的规定&#xff08;与 C 语言的异同&#xff09; BASH 中的基本流程控制语法 函数的使用 2.1 最简单的例子 —— Hello World! 几乎所有的讲解编程的书给读者的第一个例子都是…

[react] 请描述下事件在react中的处理方式是什么?

[react] 请描述下事件在react中的处理方式是什么&#xff1f; 所有时间都挂载到 document 上&#xff0c;然后捕获对应的 dom。 类似事件委托 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录…

BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )

树链剖分完就成了一道主席树裸题了, 每次树链剖分找出相应区间然后用BIT(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. 时间复杂度O(N*log^3(N))------------------------------------------------------…

标准RTSP 消息的错误代码

From: http://blog.csdn.net/ameyume/article/details/7441060 标准RTSP消息的错误代码–在应答消息的第一行表示 ”100” ; Continue (all 100 range) “110”; Connect Timeout “200” ; OK ”201” ; Created ”250” ; Low on Storage Space ”300” ; Multiple Choic…

[react-router] React-Router怎么设置重定向?

[react-router] React-Router怎么设置重定向&#xff1f; 采用 Redirect 进行重定向 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

struts2遍历select

2019独角兽企业重金招聘Python工程师标准>>> <s:bean name"org.apache.struts2.util.Counter" id"counter"> <s:param name"first" value"1" /> <s:param name"last" value"pageCount"…