交叉编译工具
阅读数:136 评论数:0
跳转到新版页面分类
硬件/嵌入式
正文
一、CPU的设计规范
设计一款CPU,要遵循CPU设计规范,也就是指令集。目前的指令集主要有两种,一种是x86架构,一种是ARM架构,当然非主流的还有MIPS指令集、RISC-V指令集,二者基于RISC精简指令集。
Intel和AMD采用的都是X86的指令集架构,而手机、平板采用的是ARM的指令架构。ARM主要是RISC精简指令集,X86主要是复杂指令集CISC。
二、微架构
指的是芯片的电路结构,相同的指令集可能有不同的微架构。
三、交叉编译
同一个应用程序,不可能在多个平台上运行,如果想运行,必须用这个应用程序的源代码,使用特定平台的编译器,编译后才可以在此平台上运行。
1、为什么不在嵌入式设备上编译
因为编译对机器性能要求比较高,编译过程中会产生大量的中间文件,占用磁盘,而嵌入式设备一般CPU处理速度比较慢、内存小,所以一般都是在服务器上编译,在开发板上运行。
2、gcc编译阶段
(1)预处理阶段
完成宏定义和include文件展开等工作。
(2)根据编译参数进行不同程序的优化,编译成汇编代码
(3)用汇编器把汇编代码进一步生成目标代码
(4)用连接器把生成的目标代码和系统用户提供的库连接起来,生成可执行文件。
3、gcc/g++使用的工具
(1)预处理器cpp,不生成文件
(2)编译器egcs,将预处理后的文件转换成汇编语言,生成.s的文件。
(3)汇编器as,由汇编变为目标代码(机器代码),生成.o的文件
(4)链接器ld,连接目标代码,生成可执行程序。
4、交叉编译链的命名规则
交叉编译链就是为了编译跨平台体系结构的程序代码而形成的由多个子工具构成的一套完整的工具集。
使用时我们常常会看到这样的名字:
arm-none-linux-gnueabi-gcc
arm-cortex_a8-linux-gnueabi-gcc
mips-malta-linux-gnu-gcc
这些交叉编译链的命名有一定的规则:
arch-core-kernel-system
(1)arch
用于哪个平台。
(2)core
使用的是哪个cpu core,如Cortex A8,但是这一组命名比较灵活,在其它厂家提供的交叉编译链中,有以厂家命名的,也有以开发板命名的,或者直接是none或cross。
(3)kernel
所运行的OS,常见的Linux、uclinux、bare(无OS)
(4)system
交叉编译链所选择的库函数和目标映像的规范,如gnu、gnueabi等。其中gnu等价于glibc+oabi,gnueabi等价于glibc+eabi。
四、工具
1、BinUtils
BinUtils是GNU工具之一,它包括链接器、汇编器和其它用于目标文件和档案的工具,它是二进制代码的处理维护工具。
包含的常用子程序:
(1)ld , GNU链接器
(2)as , GNU汇编器
(3)addr2line, 把地址转换成文件名和所在的行数
(4)ar, A utility for creating,modifying and extracting from archives
(5)另外还有c++ filt,dlltool, gold, gprof, nlmconv,nm,objcopy, objdump,ranlib,readelf,size,strings,strip等 。
https://sourceware.org/binutils/
2、glibc
linux上通常使用的c函数库为glibc几乎其它任何运行库都会依赖于glibc。
因为嵌入式环境的资源比较紧张,所以除了glibc,还有uclibc和eglibc可以选择。
五、如何得到交叉编译链
1、下载已经做好的交叉编译链
常见的交叉编译链下载地址:
(1)http://ftp.arm.linux.org.uk/pub/armlinux/toolchain/
(2)http://www.denx.de/en/Software/WebHome
(3)https://launchpad.net/gcc-arm-embedded
(4)一些制作交叉编译链的工具中,包含了已经制作好的交叉编译链,可以直接拿来使用,如crosstool-NG
(5)如果购买了某个芯片或开发板,一般厂商会提供对应的整套开发软件,其中就包含了交叉编译链。这种方式往往是最可靠的工具来源。
(6)arm公司和Linaro联盟均有提供预编译好的ARM交叉编译工具链。
2、使用工具定制交叉编译链
我们只需要了解有哪些工具可以实现,并选择合适的工具,搞懂它的操作步骤即可。
(1)crosstool-NG
(2)buildroot
(3)embedded linux development kit(ELDK)
3、从零开始构建