当前位置: 首页 > 编程日记 > 正文

2.交叉工具链

2.交叉工具链

一、交叉工具链:

交叉工具链,其实他有两个含义,一个就是交叉工具,所谓的交叉工具就是运行的环境和编译的环境不是在一体的。就像我们现在,编译裸机程序是在pc机上面执行的。可我们运行程序是在开发板。链,就是很多的意思,就是一个工具的集合。在我们前面配置arm-linux-gcc的工具中。在/usr/local/arm/4.3.2/bin的目录下有很多编译工具。例如图1-1:

图1.-1 交叉工具链

下面我们来写一个简单的程序,用这些工具编译。

Hello.c:

#include <stdio.h>

void main(){

printf("hello fish!\n");

}

这是一个简单的hello程序。首先我们先用我们熟悉的gcc编译并执行。图1-2:

图1-2

我们看到程序正常运行。输出了内容。

接下来我们用刚安装的交叉工具来编译运行。图1-3:

图1-3

我们看见程序出错了。提示的信息是不能运行的二进制文件。这就奇怪了。这是为啥呢?其实呢。我在前面已经提过了,arm-linux-*工具,编译的程序是在开发板运行的。其实我们可以通过:file 文件名.来查看该应用程序运行的平台。图1-4:

图1-4

可以看到信息,hello是gcc编译生成的是运行在x86架构的,hello1是arm-linux-gcc编译生成的是运行在ARM架构的。

接下来我们把hello1拷贝到开发板运行看看。

我已在开发板烧写好了linux系统,通过u盘,把hello1拷贝到开发板。然后插入开发板的usb口。在终端可以看见提示信息,这是因为我们的linux带有usb驱动,当我们的usb插进去的时候,它检测到了usb,加载好了驱动。现在我们进入u盘,运行hello1程序。图1-5.这时仍然提示错误。如下:

这是为啥呢?这是我们的开发板缺少程序运行时需要的动态库,因为我刚才编译的时候没有加-static属性。加上-static属性重新编译。图1-6:

图1-6

可以看到,这次加入了-static条件,编译生成的hello2程序比hello1大了许多,就是因为把运行需要的库文件都静态链接进来了。同样拷贝到u盘,可以看到顺利运行。图1-7:

图1-7

二、交叉工具链的详述:

1.arm-linux-gcc编译器:

前面,可以看到gcc和arm-linux-gcc工具的编译条件都是一样的。可为什么编译出来的应用程序会运行在不同的平台呢?这是因为,他们两个在编译的时候引用的头文件不同。传统的gcc是默认去/usr/include寻找它需要的头文件。图1-8:

图1-8头文件

而arm-linux-gcc寻找的头文件的目录不同。首先使用arm-linux-gcc –help查看它的使用:图1-9:

图1-9

注意到参数-print-search-dirs就是显示寻找头文件的参数目录。加上该参数得到一下信息图1-10:

图1-10

从上面的显示看到arm-linux-gcc默认是到我们安装arm-linux-gcc的目录去找头文件的。

2.arm-linux-ld:

arm-linux-ld是链接器,下面介绍它的使用。

首先先用arm-linux-gcc生成中间文件.o文件。图2-1:

arm-linux-gcc -g -c led.S

图2-1

在上面的参数中-g表示可以用gdb来调试信息,-c是只编译不链接。最后生成led.o中间文件。接下来就是使用arm-linux-ld把该文件链接成elf文件:图2-2:

arm-linux-ld -Tled.lds -o led.elf led.o

图2-2

上面语句的意思是利用arm-linux-ld链接器,按照-T指定的链接器脚本,把生成的led.o(如果有多个.o文件,在后面继续加上),链接成led.elf文件。

3.arm-linux-readelf:

利用该工具可以查看生成的.elf文件的内容:

执行:arm-linux-readelf -a led.elf。-a参数是all的意思,表示查看所有信息:图2-3:

图2-3

从上面看到elf文件有一个固定的头:ELF Header:然后:

Data: 2's complement, little endian

是表示他是运行在小端处理器的。

Machine: ARM

是表示他是运行在ARM平台的。

所以当运行一个程序出错的时候,当检查完语法没问题,仍然不能运行的时候,就应该用readelf查看一下这些信息是否符合。如果上面的两种检查完了之后还是不能运行。接下来就是查看需要的库是否存在。使用的命令:

arm-linux-readelf -d hello

运行结果:图2-4:

图2-4

上面显示了该hello应用程序需要的库是libc.so.6.如果没有该库,该程序运行不了。

4.arm-linux-objdump:

ARM反汇编器。

上面已经使用arm-linux-gcc编译产生了可执行文件hello2.现在对它进行反汇编。命令:

arm-linux-objdump -D -S hello2 >mydump

该命令的意思是将hello2可执行程序反汇编,输出到mydump文件。执行之后会在该目录下产生一个mydump文件:图2-5:

打开可以看到对应的汇编代码:

但是,都是汇编代码,看起来还是非常困难。可以在编译的时候加上-g调试信息的参数,这样反汇编之后会有部分的c代码存在。这样可以让我们更加容易看懂程序。

图2-5

可以看到加上-g编译,反汇编后,在汇编代码里居然有c代码出现。在上面的代码中printf("hello fish!\n");的汇编实现就是它下面两行。源代码:

5.最后一个是文件格式转换工具:arm-linux-objcopy:

从上面的操作知道,汇编代码通过arm-linux-gcc -g -c led.S,把一个汇编文件转化为一个led.o文件,接着使用:arm-linux-ld -Tled.lds -o led.elf led.o,把led.o利用led.lds脚本,链接成一个led.elf文件。但是elf文件无法在板子运行,必须转化为.bin格式的二进制文件。这就是arm-linux-objcopy的功能:

arm-linux-objcopy -O binary led.elf led.bin

图2-6:

图2-6

转载于:https://www.cnblogs.com/FORFISH/p/5188679.html

相关文章:

Windows内存管理和linux内存管理

windows内存管理 windows 内存管理方式主要分为&#xff1a;页式管理&#xff0c;段式管理&#xff0c;段页式管理。 页式管理的基本原理是将各进程的虚拟空间划分为若干个长度相等的页&#xff1b;页式管理把内存空间按照页的大小划分成片或者页面&#xff0c;然后把页式虚拟地…

UltraEdit 21激活

无需断网 UE v21.00.0.1033激活UE v21.00.0.1033激活UE v21.00.0.1033激活UE v21.00.0.1033激活UE v21.00.0.1033激活 UE v21.00.0.1056激活UE v21.00.0.1056激活UE v21.00.0.1056激活UE v21.00.0.1056激活UE v21.00.0.1056激活 点击我去下载激活器 如果激活遇到“ultraEdit …

Unity创建使用操纵杆飞行动画教程

Unity 3d移动超级英雄使用操纵杆飞行 MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:20节课(5h 16m) |大小解压后:3.37 GB 含 COURSE FOLDER FIL…

Redis初学:7(Set类型)

Set集合类型 简介 Redis里面的Set类型跟Java里面的Set一样&#xff0c;都是带有自动除重的&#xff0c;它里面不会出现重复的数据。 特点&#xff1a;自动除重 底层数据结构 Redis中的Set是一个String类型的无序集合&#xff0c;它的底层其实是一个value值为null的hash表&a…

GitHub上README.md教程

http://blog.csdn.net/kaitiren/article/details/38513715 最近对它的README.md文件颇为感兴趣。便写下这贴&#xff0c;帮助更多的还不会编写README文件的同学们。 README文件后缀名为md。md是markdown的缩写&#xff0c;markdown是一种编辑博客的语言。用惯了可视化的博客编辑…

SolidWorks大师班:从基础到专业学习教程

流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;|大小解压后:2.4 GB 含课程文件 |时长:3h 11m 从基础开始学习SolidWorks&#xff0c;借助本课程达到极致。…

Delphi 之Copyrect的使用

http://cqujsjcyj.iteye.com/blog/380970 Copyrect的使用&#xff08;图片复制、放大、以及做图片放大镜等&#xff09;一、从一个选取一个区域中的图象到另一个图象组件中的固定区域procedure TForm1.Button1Click(Sender: TObject);var rtDest, rtSource: TRect; rtIndex: …

Redis初学:8(Hash类型)

Hash&#xff08;哈希&#xff09;类型 简介 Redis中的hash是一个键值对集合。它是一个String类型的field和value的映射表&#xff0c;所以它特别适合用来存储对象。 如下图&#xff1a; Redis中的hash类似于Java中的Map<String,Object>。 底层数据结构 Hash类型对…

在JLabel上显示图片,并且图片自适应JLabel的大小

本文转载地址&#xff1a; http://blog.csdn.net/xiaoliangmeiny/article/details/7060250 在写《Core Java》上的示例代码时&#xff0c;其中有一个FileChooserTest是打开一张图片&#xff0c;并在Label上显示出来&#xff0c;但是这个示例程序有缺点&#xff0c;由于窗口的大…

适合编程的字体

编程字体从美观和易辩上来说&#xff0c;Deja Vu 是我最喜欢的免费字体家族之一&#xff0c;基于Vera字体家族。 非常容易辨别小写字母L&#xff0c;小写字母I和数字1&#xff1b;字母o&#xff0c;O和数字0. 还有几款比较受欢迎的字体&#xff0c;列在下面&#xff0c;挑选…

Blender和Substance Painter复古相机创作学习教程

时长2h 30m 1280X720 MP4 大小解压后&#xff1a;2G 含课程文件 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; Blender 3D和Substance Painter中的复古相机创作 课程获取&#xff1a;Blender和Substance Painter复古相机创作学习教程-云…

20160203.CCPP体系详解(0013天)

程序片段(01):数组.c02.数组初始化语法.c 内容概要:数组 ///01.数组.c #include <stdio.h> #include <stdlib.h>//01.采用容器结构存储数据的要点: // 1.必须为每个数据分配独立的存储空间 // 2.必须为每个数据分配独立的标识符(变量名称) //02.C语言之C99语法的…

Redis初学:9(Zset类型)

Zset&#xff08;有序集合&#xff09;类型 简介 Redis里面的有序集合Zset和集合Set非常相似&#xff0c;都是一个没有重复元素的字符串集合。 不同之处是有序集合Zset里面的每个成员都关联了一个评分&#xff08;score&#xff09;&#xff0c;这个score被用来按照从最低分到…

QQ和新浪微博登陆第三方的简单实现

一、微博登陆第三方 0、去开发平台完成开发者认证&#xff1a;http://open.weibo.com/developers/basicinfo 创建一个示例应用&#xff0c;获取APPKey 1、登陆有两种方式&#xff1a;jshtml和WBML部署。以jshtml为例&#xff0c;申请到APPKey之后&#xff0c;引入js,要替换掉ap…

matlab 取消figure显示时在屏幕最前

matlab 取消figure显示时在屏幕最前 matlab 取消figure显示时在屏幕最上层。 matlab运行代码或调试代码时&#xff0c;如果要显示图片figure或者画plot等&#xff0c;如果用的代码不合适&#xff0c; 会使得figure获取屏幕焦点&#xff0c;跑到屏幕最上方。如果跑代码的同时…

使用Blender Houdini轻松学习FX特效

大小&#xff1a;1G 含课程文件 时长1h 1280X720 MP4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 使用Blender & Houdini学习轻松的FX 信息: 使用Houdini和Blender轻松制作逼真的外汇模拟 Learn Easy FX with Blender & Houdin…

angular初步认识一

最近比较流行MVC前端框架开发&#xff0c;最近研究了一个框架AngularJS框架 不说那么多&#xff0c;先上例子&#xff0c;我是个代码控 <!DOCTYPE html> <html lang"en" ng-app"myApp"> <head><meta charset"UTF-8"><…

Redis初学:11(Redis的配置文件)

Redis的配置文件 Units单位 配置大小单位,开头定义了一些基本的度量单位&#xff0c;只支持bytes&#xff0c;不支持bit。 大小写不敏感&#xff0c;可以用大写也可以用小写。 Includes包含 类似jsp中的include&#xff0c;多实例的情况可以把公用的配置文件提取出来。 Ne…

目标跟踪之卡尔曼滤波---理解Kalman滤波的使用

http://www.cnblogs.com/jcchen1987/p/4371439.html转载于:https://www.cnblogs.com/pengkunfan/p/4372647.html

为什么对高斯分布的方差的极大似然估计是有偏的?

本文要证明为什么对高斯分布的方差的极大似然估计是有偏的。同时&#xff0c;也说明为什么求样本方差时&#xff0c;分母是N-1而不是N。 首先&#xff0c;明白两点&#xff0c;&#xff08;1&#xff09;极大似然法得到的高斯方差是什么形式&#xff08;2&#xff09;什么是有…

使用Blender中的几何节点创建程序对象

大小解压后&#xff1a;2.4G 持续时间3h 30m 1280X720 MP4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 使用Blender中的几何节点按程序创建对象 信息: 使用Blender中的几何节点按程序创建对象 开始在Blender中使用非破坏性技术和几何节…

Redis初学:14(Redis中的事务)

Redis中的事务 Redis的事务定义 Redis事务是一个单独的隔离操作&#xff1a;事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中&#xff0c;不会被其他客户端发送来的命令请求所打断。 Redis事务的主要作用就是串联多个命令防止别的命令插队。 Redis中的事务操…

接口两种实现方式

以前在用到接口时&#xff0c;从来没注意到接口分为隐式实现与显示实现。昨天在浏览博客时看到相关内容&#xff0c;现在根据自己的理解记录一下&#xff0c;方便日后碰到的时候温习温习。 通俗的来讲&#xff0c;“显示接口实现”就是使用接口名称作为方法名的前缀;而传统的实…

Android程序如何在代码中改变图片原有的颜色

最近一边找工作一边完善之前的项目。之前安卓初中级的项目是模仿酷狗音乐播放器的。下载一个apk文件&#xff0c;改后缀&#xff0c;解压&#xff0c;然后根据官方应用的布局&#xff0c;用得到的图片照着做出来。记得酷狗首页有好几种主要图标&#xff0c;解压后得到的白色加透…

“error : unknown filesystem”的解决办法

解决方法如下&#xff1a;1:首先使用ls命令显示出ubuntu分区的安装信息&#xff1a; 1 grub rescue>ls 一般会罗列出所有磁盘的分区信息&#xff0c;比如&#xff08;hd0,msdos1&#xff09;&#xff08;hd0,msdos2&#xff09;&#xff08;hd0,msdos4&#xff09;&#xff…

Blender创建三维教室场景学习教程 3D Classroom Environment Creation in Blender

流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;48.0 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;|大小解压后:3.73 GB 含课程文件 |时长:4h 1m 从头到尾在Blender中创建一个完整的3D教室环境&#xff0c;在…

Redis初学16:主从复制

主从复制 简介 主机数据更新后根据配置和策略&#xff0c; 自动同步到备机的master/slaver机制&#xff0c;Master以写为主&#xff0c;Slave以读为主&#xff0c;如下图&#xff1a; 好处&#xff1a; 1.读写分离&#xff0c;性能扩展 2.容灾快速恢复 搭建 我这里准备了三…

UITableView数据的添加、删除、移动

数据的添加、删除4个步骤&#xff1a;1、现在导航视图上面添加一个按钮&#xff0c;可以是系统自带的编辑按钮editButtonItem2、实现方法让将要执行删除添加操作的表视图处于编辑状态3、指定表视图中哪些行可以处于编辑状态&#xff0c;默认所有行都可以进行编辑4、指定编辑样式…

Saltstack 用户管理

最近测试组来了一大波&#xff0c;最为公司测试那必须要有qa环境&#xff0c;测试组老大跟我关系很好&#xff0c;他们组不少人对Linux也很了解&#xff0c;平时弄个东西啥的也能自己搞定&#xff0c;软磨硬泡加上最近真的很忙给他们配置了jenkins和开了qa环境用户权限&#xf…

ubuntu 14.04 双显卡安装NVIDIA GPU驱动+CUDA+编译配置caffe

******************************** 安装ubuntu************************* 1.在bios里设置使用集成显卡 2.安装ubuntu 14.04&#xff0c;不要联网安装&#xff0c;否则很慢 *********************************安装 GPU驱动********************** 3.去NVIDIA官网下载run格式…