交叉编译工具链详解
● 了解交叉编译工具链
● 明白得分步构建交叉编译工具链的方式
● 学会利用Crosstool工具构建交叉编译工具链
交叉编译工具链介绍
读者可能会有疑问,什么缘故要用交叉编译器?交叉编译通俗地讲确实是在一种平台上编译出能运行在体系结构不同的另一种平台上的程序,比如在PC平台(X86 CPU)上编译出能运行在以ARM为内核的CPU平台上的程序,编译取得的程序在X86 CPU平台上是不能运行的,必需放到ARM CPU平台上才能运行,尽管两个平台用的都是Linux系统。这种方式在异平台移植和嵌入式开发时超级有效。相对与交叉编译,平常做的编译叫本地编译,也确实是在当前平台编译,编译取得的程序也是在本地执行。用来编译这种跨平台程序的编译器就叫交叉编译器,相对来讲,用来做本地编译的工具就叫本地编译器。因此要生成在目标机上运行的程序,必需要用交叉编译工具链来完成。在裁减和定制Linux内核用于嵌入式系统之前,由于一样嵌入式开发系统存储大小有限,通常都要在性能优越的PC上成立一个用于目标机的交叉编译工具链,用该交叉编译工具链在PC上编译目标机上要运行的程序。交叉编译工具链是一个由编译
器、连接器和说明器组成的综合开发环境,交叉编译工具链要紧由binutils、gcc和glibc 3个部份组成。有时出于减小 libc 库大小的考虑,也能够用别的 c 库来代替 glibc,例如 u Clibc、dietlibc 和 newlib。成立交叉编译工具链是一个相当复杂的进程,若是不想自己经历复杂繁琐的编译进程,网上有一些编译好的可用的交叉编译工具链能够下载,但就以学习为目的来讲读者有必要学习自己制作一个交叉编译工具链。本章通过具体的实例讲述基于ARM的嵌入式Linux交叉编译工具链的制作进程。
构建ARM Linux交叉编译工具链
构建交叉编译器的第一个步骤确实是确信目标平台。在GNU系统中,每一个目标平台都有一个明确的格式,这些信息用于在构建进程中识别要利用的不同工具的正确版本。因此,当在一个特定目标机下运行GCC时,GCC便在目录途径中查包括该目标标准的应用程序途径。GNU的目标标准格式为CPU-PLATFORM-OS。例如x86/i386 目标机名为i686-pc-linux-gnu。本章的目的是讲述成立基于AR M平台的交叉工具链,因此目标平台名为arm-linux-gnu。
通常构建交叉工具链有3种方式。
方式一分步编译和安装交叉编译工具链所需要的库和源代码,最终生成交叉编译工具链。该方式相对照较困难,适合想深切学习构建交叉工具链的读者。若是只是想利用交叉工具链,建议利用方式二或方式三构建交叉工具链。
方式二通过Crosstool脚本工具来实现一次编译生成交叉编译工具链,该方式相关于方式一要简单许多,而且犯错的机遇也超级少,建议大多数情形下利用该方式构建交叉编译工具链。
该步骤的目的是为了方便重复输入途径,因为重复操作每件相同的情形总会让人感觉很麻烦,若是读者不适应利用环境变量就能够够略过该步,直接输入绝对途径就能够够。声明以下环境变量的目的是在以后编译工具库的时候会用到,很方便输入,尤其是能够降低输错途径的风险。
# export PRJROOT=/home/mike/armlinux
# export TARGET=arm-linux
# export PREFIX=$PRJROOT/tools
# export TARGET_PREFIX=$PREFIX/$TARGET
# export PATH=$PREFIX/bin:$PATH
注意,用export声明的变量是临时的变量,也确实是当注销或改换了操纵台,这些环境变量就消失了,若是还需要利用这些环境变量就必需重复export 操作,因此有时会很麻烦。值得庆幸的是,环境变量也能够概念在bashrc文件中,如此当注销或改换操纵台时,这些变量就一直有效,就不用老是export这些变量了。
3.编译、安装Binutils
Binutils是GNU工具之一,它包括连接器、汇编器和其他用于目标文件和档案的工具,它是二进制代码的处置保护工具。安装Binutils工具包括的程序有addr2line、ar、as、c++filt、gprof、ld、nm、objcopy、objdump、ranlib、r eadelf、size、strings、strip、libiberty、libbfd和libopcodes。对这些程序的简单说明如下。
● addr2line把程序地址转换为文件名和行号。在命令行中给它一个地址和一个可执行文件名,它就会利用那个可执行文件的调试信息指出在给出的地址上是哪个文件和行号。
● ar成立、修改、提取归档文件。归档文件是包括多个文件内容的一个大文件,其结构保证了能够恢恢复始文件内容。
● as要紧用来编译GNU C编译器gcc输出的汇编文件,产生的目标文件由连接器ld连接。
● c++filt连接器利用它来过滤C++ 和Java 符号,避免重载函数冲突。
● gprof显示程序挪用段的各类数据。
● ld是连接器,它把一些目标和归档文件结合在一路,重定位数据,并连接符号引用。通常,成立一个新编译程序的最后一步确实是挪用ld。
● nm列出目标文件中的符号。
● objcopy 把一种目标文件中的内容复制到另一种类型的目标文件中。
● objdump显示一个或更多目标文件的信息。利用选项来操纵其显示的信息,它所显示的信息通常只有编写编译工具的人材感爱好。
● ranlib产生归档文件索引,并将其保留到那个归档文件中。在索引中列出了归档文件各成员所概念的可重分派目标文件。
● readelf显示elf格式可执行文件的信息。
● size列出目标文件每一段的大小和整体的大小。默许情形下,关于每一个目标文件或一个归档文件中的每一个模块只产生一行输出。
● strings打印某个文件的可打印字符串,这些字符串最少4个字符长,也能够利用选项-n设置字符串的最小长度。默许情形下,它只打印目标文件初始化和可加载段中的可打印字符;关于其他类型的文件它打印整个文件的可打印字符。那个程序关于了解非文本文件的内容很有帮忙。
● strip抛弃目标文件中的全数或特定符号。
● libiberty包括许多GNU程序都会用到的函数,这些程序有getopt、obstack、strerror、strtol和strtoul。
● libbfd二进制文件描述库。
● libopcode用来处置opcodes的库,在生成一些应用程序的时候也会用到它。
Binutils工具安装依托于Bash、Coreutils、Diffutils、GCC、Gettext、G libc、Grep、Make、Perl、Sed、Texinfo等工具。
介绍完Binutils工具后,下面将分步介绍安装的进程。
第一解压包,命令如下:
# cd $PRJROOT/build-tools
# tar –xjvf 接着配置Binutils工具,建议成立一个新的目录用来寄存配置和编译文件,如此能够使源文件和编译文件独立开,具体操作如下:
# cd $PRJROOT/build-tools
# mkdir build-binutils
# cd build-binutils
# ../ configure --target=$TARGET --prefix=$PREFIX
其当选项–target的意思是制定生成的是 arm-linux 的工具,--prefix 是指出可执行文件安装的位置。执行上述操作会显现很多check信息,最后产生 Makefile 文件。接下来执行make和安装操作,命令如下:
# make
# make install
该编译进程较慢,需要数十分钟,安装完成后查看/home/mike/armlinux/to ols/bin目录下的文件,若是查看结果如下,说明现在Binutils工具已经安装终止。
# ls $PREFIX/bin
arm-linux-addr2line arm-linux-ld arm-linux-ranlib arm-linux-strip
arm-linux-ar arm-linux-nm arm-linux-readelf
arm-linux-as arm-linux-objcopy arm-linux-size
gnu编译器arm-linux-c++filt arm-linux-objdump arm-linux-strings
4.取得内核头文件
编译器需要通过系统内核的头文件来取得目标平台所支持的系统函数挪用
所需要的信息。关于Linux内核,最好的方式是下载一个适合的内核,然后复制取得头文件。需要对内核做一个大体的配置来生成正确的头文件;只是,不需要编译内核。关于本例中的目标arm-linux,需要以下步骤。
(1)在kernel目录下解压内核包,执行命令如下:
# cd $PRJROOT/kernel
# tar –xvzf (2)接下来配置编译内核使其生成正确的头文件,执行命令如下:# cd linux-
# make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
其中ARCH=arm表示是以arm为体系结构,CROSS_COMPILE=arm-linux-表示是以arm-linux-为前缀的交叉编译器。也能够用config和xconfig来代替men uconfig,推荐用make menuconfig,这也是内核
开发人员用的最多的配置方式。注意在配置时必然要选择处置器的类型,那个地址选择三星的S3C2410(System Type->ARM System Type->/Samsung S3C2410),如下图。配置完退出并保留,检查一下内核目录中的include/linux/和include/linux/文件是不是生成了,这是编译glibc时要用到的,若是和文件存在,说明生成了正确的头文件。
图Linux 内核配置界面
复制头文件到交叉编译工具链的目录,第一需要在/home/mike/armlinux/to ols/arm-linux目录下成立工具的头文件目录inlcude,然后复制内核头文件到此目录下,具体操作如下:
# mkdir –p $TARGET_PREFIX/include
# cp –r $PRJROOT/kernel/linux-/include/linux $TARGET_PREFIX/include
# cp –r $PRJROOT/kernel/linux-/include/asm-arm $TARGET_PREFIX/include/asm
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论