嵌⼊式系统移植中的交叉编译器详解
交叉编译器简介
⾸先和⼤家分享的是嵌⼊式系统移植中交叉编译⼯具集,具体如下图:
如图,第⼀个问题是为什么要有交叉编译?
众所周知我们的CPU它⼯作⽅式⾮常简单,就是根据不同的⾼低电平去⼲不同的事情。如下图:
如图,⽐如说CPU要做加法,那么很显然x86可以这样认为“add 1010”如果说看到这样⼀个组合我就认为CPU要做加法了。那么⾃然⽽然我们程序员只要写成⾼低的⼀个标⽰给CPU,CPU基本就能做加法。所以这个跟我们前⾯学习汇编的思想很像,但是我们现在不⼀样了因为我们的PC⼀般来说是x86的,但是如果说我们现在的CPU换⼀款换成ARM同样后⾯是1010,那么1010对于ARM来说因为它是两家不同的公司,那么它对这样的指定级的编码和译码的时候是不是会有不同的结果。⽐如说在arm中的1010就可能不是加法了⽽可能是mov这⼀数据的搬移指令。那么⼤家就可以发现如果我们在x86上编译的⼀个⼆进制集合包或者是⼆进制程序集合,我们不做任何的修改直接放到arm板⼦上运⾏那么就⼀定会出现⼀个新的问题,就是我们的arm是不认识这样的集合的,也就是说跟你本⾝想做加法的逻辑是不⼀致的。
所以这样我们就迫切想要去在x86上去编译⼀个arm也能理解的逻辑。也就是这个情况就变成了如下图:
如图,我们x86下也就是我们的主机和⽬标机,就是我们原来最开始学习应⽤开发的时候我们的主机就是x86,然后我们的⽬标机也是x86,因为我们运⾏也是在x86上运⾏起来进程或⽹络编程的概念。但是我们现在嵌⼊式开发不⼀样,我们的主机没有变还是x86但是我们的⽬标机现在已经变成了ARM CPU。
所以这样来看,我们原本正常情况下主机跟⽬标机是统⼀品牌的。但是到现在我们就变成了主机是⼀个平台⽬标机是另外⼀个平台,那这种情况我们就称为交叉。
也就是说,这种情况下我们就需要⼀个交叉编译器来完成从⼀个结构编译另外⼀个结构的编译器。如果⽬标机跟主机是同⼀平台的我们就称为同⼀
编译器,⽐如说我们最典型的gcc,以上就是我们第⼀个为什么要有交叉编译器的概念,那么在这个概念中我们要引⼊⼀个命令叫file命令,通过这个命令我们来加深⼀下为什么我们在以后编译开发过程中可能遇到的新的问题,也就是我们都知道Linux系统中⼀个可执⾏程序并没有后缀名,也就是我们不会像Windows⼀样写成ese或者.xx让⼤家来区分,很有可能我们最终可执⾏程序都叫build,那么这种情
况下就会经常出现如果我不⼩⼼在实际开发中把x86下编译的build烧写到了arm板上,结果跑了半天都跑不出来,甚⾄整个程序运⾏的逻辑都是混乱的。
这个原有就在于有时候我们粗⼼马虎把x86的程序放在了arm板上了,那么我们应该怎么去避免这样⼀个情况了?
如图我们还是⽤⼀个1.c⽤⼀个⾮常简单的hello world做⼀个例⼦,然后我们⽤gcc -o build 1.c⽣成⼀个build程序,然后点击ls查看会发现这个build⼀没有后缀名⼆没有其他的标识,我怎么知道它是在x86下运⾏还是在arm下运⾏,或者换句话来说把这个程序放到我的板⼦上能不能运⾏起来呢?然后我们就来看第⼀个命令叫做file build,然后点击回车键⼤家就可以发现它上⾯有⼀堆东西,这⼀堆东西⼀般情况下我们不⽤全部关⼼但是我们唯⼀需要关⼼的就是“x86-64”因为我这个机器是64位的,所以说你会发现看build真正属性的第⼆个选项中它会告诉我们build⼯作的平台是x86认识的,这就是从file中去读它⽂件头的⼀个信息。
以上就是file⾮常重要的⼀个概念。
交叉编译结果
下⾯我们来看如果有了交叉编译器后,交叉编译的结果⼜会变成什么样⼦。在之前我们讲交叉编译器也说过⼀般有两种⽅法:第⼀就是直接⽤编译好的,第⼆就是⾃⼰⼿动编译。我们今天还是采⽤芯⽚⼚商已经编译好的。
在Linux系统安装软件其实⽐较简单,不是双击的形式,其实就是个解包的过程,它主要是把⼯具集解压到⼀个⽬录上然后我们直接使⽤它就可以。
linux下gcc编译的四个步骤然后我们来看看安装交叉编译器的⽅法:
安装交叉编译器其实⾮常简单就是⼀个解压缩的过程。解压缩的过程,解压到linux标准⽬录,在安装过程中我们就直接在Windows⽬录下把交叉编译器拷到你们的共享⽬录就可以了。
如图,安装命令就是“tar-zxvf arm-linux-qcc-4. ”注意在上⾯的那⾏命令中的tgz,它实际上是个缩写,所以使⽤的就是zcvf,然后记住千万不⽤把这个包解完就直接回车了,因为我们知道这个包是默认Windows的共享⽬录,所以⼀旦回车就可能导致编译器中有些⼯具是⽤不了的,最典型的⼯具就是软链接因为在Windows⾥是没有软链接的概念的,所以说如果这个包⾥⾯有软链接的⽂件那很有可能就是解压出来它就⽀持不了,最后就可能报错或者占⽤的数据量⽐较⼤。所以我们建议⼤家尽量不要安装在Windows的共享⽬录尽量安装在Linux本⾝的虚拟机的硬盘⽬录。所以我们在切换到另⼀个⽬录需要“-C”⼀般来说交叉编译器在制作的时候就把整个⽬录都给你打包好了,所以有写时候我们就习惯直接解压的根(/)上,通过根就相当于把解压的权限直接交给交叉编译器,然后点击回车键:
如图,⼤家会发现这个地⽅出现了⼀些问题,“⽂件已存在”这个原因是因为我刚才在敲命令的时候没有使⽤超级⽤户,所以我们要早命令“tar-zxvf arm-linux-qcc-4. -C /”前加上⼀个sudo在去输⼊就没有错了。然后我们把它进⾏解压,在解压过程中,⼀般来说是没有太⼤问题的,⼤家可以⼩⼼点看它有没有报什么错误,如果没有报错误就可以了。
解压完成后:
如图,我们进⼊opt⽬录后,因为opt中本⾝就有个⽬录,但是我们可以⼀级⼀级的进去。最后进⼊4.5.1⽬录后会发现这个⽬录下的选项其实就是交叉编译器中总括的安装包,其中有写⽬录对我们来说是有帮助的。
⽐如说“bin”这个⽬录就相当于交叉编译器中的命令集合,也就是说我们的命令基本上应该在bin⾥去。⽽“lib”它有两种形式,第⼀种形式就是我们交叉编译器在运⾏的时候它有⼀个库。第⼆种就是我们最终要交叉编译器虽然在x86中运⾏但是最终要编译成arm,所以说我们在编译过程中就涉及到两种库,⼀种是x86的库⼀种就是arm的库。
也就是说我们交叉编译器本⾝是个软件,它在运⾏需要x86的⼀个平台,所以这个时候它肯定是要有⼀个x86的库为它运⾏时准备的,但是它最终⽣成的⽬标要依赖arm体系。所以它链接的时候需要arm库的提供。
如图,我们先进⼊bin⾥⾯看⼀下,这个地⽅⼤家会发现⽂件⽐较多,当然⽂件虽多⼤家可以发现都有⼀个统⼀的规则。当然这个地⽅先来提成⼀个思想也就是说我们安装的叫交叉编译集合或者叫交叉编译链⼀个整块,也就是说我们不仅仅要⽤到它叫gcc的东西,同时还可以看到gcc的外⾯还有很多其他的命令,这些命令其实就是我们在后⾯会给⼤家介绍叫做⼯具集的功能,所以说我们实际上安装交叉编译器就是安装⼀套⼯具,不光是gcc。然后输⼊如图上命令,它其实就是个l⽂件,l⽂件软链接到本地⽬录下的⽂件,所以这个命名规则跟我们之前讲的交叉编译器的规则也很像“arm-none-linux-gnueab
i-gcc”也就是在Linux下新的标准接⼝的⼀个gcc⼯具。⼀般来说这个名字太长懒得去写,我们就可以⽤软链接的⽅式去把它链在这⾥,直接敲“arm-linux-gcc”就可以了,所以这就是我们⽐较常⽤的⽅式。
那么我们安装的⼀般步骤来说第⼀步就是把它解压,⼀般来说要把它解压到linux标准⽬录下⼀步就是我们的两种使⽤⽅法。
使⽤
1.使⽤简单⽅法(就是我直接在shear中敲)
#arm-linux-gcc -o build 1.c(这样就可以直接⽤它了,跟我们的gcc命令⼀样,只是调⽤命令不在调⽤gcc了⽽是“arm-linux”这个命令)
简单⽅法的优缺点:敲很少的字符就可以⼯作了,但是它的缺点也很多,就⽐如说你的系统不仅仅开发的这⼀个品牌,还有其他别的品牌,那在这种情况下就很可能不知道⽤这种快捷⽅式是的哪⼀个,所以很有可能导致我们在编译中出现⼀些稀奇古怪的问题。因为你编译器⽤错了,很有可能你新编译器不知道或者⽼编译器⼜不⽀持,所以这种⽅法使⽤起来⼀定要⼩⼼,也就是你系统⾥不能有多个编译器。
2.使⽤绝对路径⽅法(最好的办法)
#/opt/FriendlyARM/toolschain/4.5.1/bin/arm-linux-gcc -o build 1.c
绝对路径的优缺点:它的缺点就是跟简单路径相反太复杂,但是我个⼈还是⽐较喜欢⽤绝对路径虽然⿇烦点但是它不⽤每次都输⼊,⽽且这种⽅法绝对能保证你⽤的编译器是正确的。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论