一、交叉工具链

  嵌入式Linux开发采用交叉开发,简单来说就是在宿主机(PC机)上面编译出能够在其他硬件平台上面运行的程序。在这个过程中,需要用到许多的交叉工具,这些交叉工具的集合就叫做交叉工具链。下面列举嵌入式开发中常用的交叉工具。

  1、交叉编译器    arm-linux-gcc

  交叉编译器的命名十分有特色,前面两个字符串表明了他们可以使用的平台。例如:arm-linux-gcc说明用来编译出用于ARM平台的程序。

  用法:arm-linux-gcc hello.c -o hello

  2、交叉链接器    arm-linux-ld

  用法:arm-linux-ld  -Tled.lds  -o  led.elf  led.o

  它可以将一个或者多个 .o 文件链接成一个 .eld 文件,其中 led.lds 是链接器脚本。

  应用:如果不用交叉编译器直接编译出.eld文件,用 arm-linux-gcc -g -c  + 文件名(参数 -c 的意思是只编译不链接)编译出来.o文件,这个时候交叉链接器就派上用场了。

  3、交叉elf文件工具    arm-linux-readelf

  用法:arm-linux-readelf  -a  led.elf      查看.elf文件

  如果交叉编译出来的文件不能在的硬件平台运行,检查两点。

  (1)用file +文件名查看文件运行的平台是否正确,例如:

  (2)查看大小端是否正确(大多数处理器是小端的处理器)

  用 arm-linux-readelf  -a  led.elf 也可以查看文件运行的平台,例如这里Machine:  ARM。参数 -a 的意思是all。

  4、交叉转换器    arm-linux-objcopy

  用法:arm-linux-objdump -O binary led.elf ledbin

  -O binary 表示输出的文件是2进制文件,led.elf 是输入文件,ledbin 是输出文件。

  在硬件平台上能直接执行的都是二进制文件,所以需要用交叉转换器进行文件格式转换。

  5、交叉反汇编器    arm-linux-objdump

  用法:arm-linux-objdump -D -S hello

  拓展:arm-linux-objdump -D -S hello >dump   将hello反汇编生成的代码生成一个文件dump,可以直接用 vi dump 查看。

  在用arm-linux-gcc编译的时候加上-g参数,arm-linux-gcc -g hello.c -o hello,这样反汇编的时候得到的代码简单些。

二、MakeFile工程管理

  1、为什么需要MakeFile?

  如下图,一个源文件led.S生成的一个可执行的led.bin需要进行交叉编译,交叉链接,交叉转换,采用MakeFile就是让这个过程更有效率的执行,使整个程序的编译,链接用一个命令完成。能起到一劳永逸的作用。

  2、Make 的工作主要依赖于一个叫Makefile的文件,Makefile文件描述了整个程序的编译,连接等规则。其中包括:工程中的哪些源文件需要编译以及如何编译,如何最后产生我们想要得可执行文件。

  3、MakeFile的构成

  两部分:规则和变量

  (1)规则

  MakeFile中最重要的组成部分就是规则,那什么是规则?

  打开一个MakeFile文件。如图,一个版块就是一个规则,MakeFile就是由一个或者多个规则构成的。

  

  一条规则格式:

  目标:依赖

  tab   命令

  伪目标:上图中,蓝色标注的目标 clean 只有命令,没有依赖,这样的目标称为伪目标。通常用一个关键字 .PHONY 标识出来。从上面可以看出,伪目标用来清除一些文件。

  最终目标:第一条规则中的目标

  (2)变量

  在MakeFile中,变量是没有类型的,不用去定义它,直接赋值就可以了。

  应用举例:  

  使用变量前:

 app1: app1.o func1.o func2.o
  gcc app1.o func1.o func2.o -o app1
  app2: app2.o func1.o func2.o
  gcc app2.o func1.o func2.o -o app2

  使用变量后:

 obj=func1.o func2.o
  app1: app1.o $(obj)
  gcc app1.o $(obj) -o app1
  app2: app2.o $(obj)
  gcc app2.o $(obj) -o app2

  注意:等号两边不能有空格!

  在makefile中,用户除了可以自己定义变量外,还可以使用系统已经定义好的默认变量。

  $^:代表所有的依赖文件
  $@:代表目标
  $<:代表第一个依赖文件

  使用前:

 led.o : led.S
arm-linux-gcc -g –o led.o -c led.S

  使用后:

 led.o : led.S
arm-linux-gcc -g –o $@ -c $^

  拓展:当一个makefile中有许多类似的规则时,可以将这些规则合并为一条通用规则。例如在一个makefile中,有如下规则;

 led.o : led.S
arm-linux-gcc -g –o $@ -c $^ main.o : main.S
arm-linux-gcc -g –o $@ -c $^ fun.o : fun.S
arm-linux-gcc -g –o $@ -c $^

  可以合并为一条:

 %.o : %.S
arm-linux-gcc -g –o $@ -c $^

4、MakeFile的使用规则

  如果用户没有指定执行某一条规则,make会默认执行makefile中的第1条规则,而这条规则中的目标称之为:最终目标。如果想单独执行某一条规则:make + 该条规则的目标名,例如:make led.bin

5、MakeFile的使用技巧

  (1)去回显

  在指令前面加一个@,例如: 

 hello: hello.c
@gcc hello.c –o hello

  Makefile中“#”字符后的内容被视作注释。

  PS:使用GNU Make 工具来管理程序是每个Linux工程师必须掌握的技能!

  (2)修改makefile名

  方法1:mv Makefile makefile,这样修改使用的时候可以直接make + 目标名;

  方法2:mv Makefile file,这样修改使用的时候不可以直接make + 目标;得用make -f file + 目标名。

  

ARM裸机开发之交叉工具链和MakeFile工程管理的更多相关文章

  1. 交叉工具链和makefile

    交叉工具链: arm-linux-gcc:交叉编译器 arm-linux-ld:交叉连接器 arm-linux-readelf:交叉ELF文件工具 arm-linux-objdump:交叉反汇编器 a ...

  2. 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)

    作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705  参考博客 : [嵌入式开发]嵌入式 开发环境 (远 ...

  3. Ubuntu16.04交叉工具链安装

    前言: 开发环境是64位的ubuntu16.04,交叉工具链是通过sudo apt-get install ....安装的,移植uboot2014.10,但是很奇怪,按照网上的介绍在start.s里面 ...

  4. linux driver ------ 交叉工具链(cross toolchain)

    在 ARM Linux 的开发中,人们趋向于使用 Linaro(http://www.linaro.org/)工具链团队维护的 ARM 工具链,它以每月一次的形式发布新的版本,编译好的可执行文件可以网 ...

  5. FriendlyARM交叉工具链以及编译第一个arm9应用

    不记录什么都会忘光!!!这两天又要用到开发板来做项目,可是好久没有碰了,最近一直在搞上层的东东,对rails和前端感兴趣,我这是不要毕业的节奏了吗?好吧,既然什么都忘光掉了,那就干脆来个痛快,重新装机 ...

  6. gcc 交叉工具链中工具使用(arm-linux-xxx)

    在Ubuntu系统中使用 gcc 系列工具是在PC机上使用 arm-linux-gcc 编译的目标 是在 arm CPU上使用 一.安装交叉编译工具链 1. 编译工具怎么获取 1)从官网 http:/ ...

  7. LFS(Linux From Scratch)构建过程全记录(五):交叉工具链的构建

    写在前面 本文将详细讲述如何构建工具链 前置知识 在LFS-BOOK中,我们需要学习一些关于"交叉编译"的内容,详见书本 安装Binutils-2.39 我们cd到sources文 ...

  8. X86上搭建交叉工具链,来给龙芯笔记本编译本地工具链(未完待续)

    故事的背景是,我买了一台龙芯2F的笔记本来装B. 为什么说是装B呢?因为不但操作系统是Linux,而且CPU还是龙芯的. 一般人有这么酷的装备吗?简直是装B大圣啊. 这里一定要申明一点,本人不是IT技 ...

  9. Linux交叉工具链安装

    这篇博文http://blog.csdn.net/u010957054/article/details/58056863 提到了一个好的百度网盘,里面有各个版本的交叉工具链. http://www.3 ...

随机推荐

  1. hdu5441 并查集 长春网赛

    对于每次询问的大的值,都是从小的值开始的,那就从小到大处理,省去很多时间,并且秩序遍历一遍m; 这题cin容易超时,scanf明显快很多很多.G++又比C++快; //这代码scanf400+,cin ...

  2. hdu1730 尼姆博弈

    抽象一下把距离当做石子个数.虽然在这里石子个数可以增加,但是不管怎么增加,不会影响结果,因为你增加了,必须会有减少的. 所以类似取石子,观察平衡状态,如果(x2-x1-1)^...==0,必输. wa ...

  3. postman 百度网盘下载 64位

    最近找了一下postman的下载资源,竟然发现有些用户的资源要用csdn的积分下载,很是不爽.所以才想到在这里贴出我的百度网盘的地址 下载地址: 链接:https://pan.baidu.com/s/ ...

  4. [转] android自定义布局中的平滑移动

    无意中搜索到这篇文章,大概扫了一眼,知道是篇好文,先转载记录下来学习! 文章主要讲的是自定义view的写法心得. 转自:http://www.apkbus.com/android-48445-1-1. ...

  5. 【NS2】学习点滴

    1 $ns duplex-link-op $n2 $n3 queuePos 0.5#此命令用于设置在NAM中显示的队列方向#经测试,发现: # queuePos 0.5表示包从上到下进入队列# que ...

  6. MAYA安装失败怎样卸载重新安装MAYA,解决MAYA安装失败的方法总结

    技术帖:MAYA没有按照正确方式卸载,导致MAYA安装失败.楼主也查过网上关于如何解决MAYA安装失败的一些文章,是说删除几个MAYA文件和MAYA软件注册表就可以解决MAYA安装失败的问题,实际的情 ...

  7. JAVA内存dump

    # 注意点: # 项目运行的用户 # 使用的jdk版本下的jstack去查看 /opt/jdk1..0_191/bin/jmap -dump:format=b,file=/webser/www/`da ...

  8. 2018-2-13-WPF-获得触笔悬停元素上

    title author date CreateTime categories WPF 获得触笔悬停元素上 lindexi 2018-2-13 17:23:3 +0800 2018-2-13 17:2 ...

  9. php统计近一周和近30天的用户数据

    https://blog.csdn.net/shenpengchao/article/details/59073589 先上一张效果图 这边用的是echarts插件http://echarts.bai ...

  10. js循环遍历数组(对象)

    1,for循环 对于循环应该是最常用的一种遍历方式了,通常用来遍历数组结构. let arr = [a,b,d];for (let i=0; i<arr.length; i++){ consol ...