建立交叉编译器 联系客服

发布时间 : 星期二 文章建立交叉编译器更新完毕开始阅读

一、下载源文件

源代码文件及其版本与下载地址: Binutils-2.19.tar.bz2

http://ftp.gnu.org/gnu/binutils/ gcc-4.4.4.tar.bz2

http://mirrors.kernel.org/gnu/gcc/gcc-4.4.4/ Glibc-2.11.2.tar.bz2 Glibc-ports-2.11.tar.bz2 http://ftp.gnu.org/gnu/glibc/ glibc-2.11.2-gcc_fix-1.patch glibc-2.11.2-makefile_fix-1.patch

http://www.linuxfromscratch.org/patches/downloads/glibc/ Gmp-4.2.tar.bz2

http://ftp.gnu.org/gnu/gmp/ Mpfr-2.4.0.tar.bz2

http://ftp.gnu.org/gnu/mpfr/ Linux-2.6.29.tar.bz2 Patch-2.6.29.bz2

http://www.kernel.org/pub/linux/kernel/v2.6/

一般一个完整的交叉编译器涉及到多个软件,主要包括binutils、gcc、glibc等。其中,binutils主要生成一些辅助工具;gcc是用来生成交叉编译器,主要生成arm-linux-gcc交叉编译工具,而glibc主要提供用户程序所需要的一些基本函数库。 二、建立工作目录

编译所用主机型号 FC12.i686,根据目标板CPU选择

所有的工作目录都在/home/Karen/cross下面建立完成,首先在/home/karen目录下建立cross目录

[root@localhost karen] mkdir cross 进入工作目录:

[root@localhost root]#cd /home/karen/cross 查看当前目录:

[root@localhost cross ]# pwd

/home/karen/cross 创建工具链文件夹:

[root@localhost cross]# mkdir embedded-toolchains

在建立了顶层文件夹embedded- toolchains,下面在此文件夹下建立如下几个目录: ? setup-dir存放下载的压缩包;

? src-dir存放binutils、gcc、glibc解压之后的源文件;

? kernel存放内核文件,对内核的配置和编译工作也在此完成;

? build-dir编译src-dir下面的源文件,这是GNU推荐的源文件目录与编译目录分离的做法; ? tool-chain交叉编译工具链的安装位; ? program存放编写程序; ? doc说明文档和脚本文件; 下面建立目录,并拷贝源文件。

[root@localhost cross] #cd embedded- toolchains

[root@localhost embedded- toolchains] #mkdir setup-dir src-dir kernel build-dir tool-chain program doc

[root@localhost embedded- toolchains] #cd setup-dir 拷贝源文件:

直接拷贝源文件到setup-dir目录中 建立编译目录:

[root@localhost setup-dir] #cd ../build-dir

[root@localhost build -dir] #mkdir build-binutils build-gcc build-glibc 三、输出环境变量

输出如下的环境变量方便我们编译。

为简化操作过程。下面就建立shell命令脚本environment-variables: [root@localhost build -dir] #cd ../doc [root@localhost doc] #mkdir scripts [root@localhost doc] #cd scripts

用编辑器vi编辑环境变量脚本envionment-variables: [root@localhost scripts] #vi envionment-variables

export PRJROOT=/home/mxl/diliuzhang/embedded- toolchains export TARGET=arm-linux

export PREFIX=$PRJROOT/tool-chain export TARGET_PREFIX=$PREFIX/$TARGET export PATH=$PREFIX/bin:$PATH

Q:为什么用了source ./environment-variables才正常执行,去掉source就没有执行? 如果用source 执行,不需要脚本有执行权限,权限为664也可以,执行命令如下: [root@localhost scripts] #Source environment-variables 说明:

TARGET变量用来定义目标板的类型,以后会根据此目标板的类型来建立工具链。参 看表6-1所示。目标板的定义与主机的类型是没有关系的,但是如果更改TARGET的值, GNU工具链必须重新建立一次。

PREFIX变量提供了指针,指向目标板工具程序将被安装的目录。

TARGET_PREFIX变量指向与目标板相关的头文件和链接库将被安装的目录。 PATH变量指向二进制文件(可执行文件)将被安装的目录。

如果不惯用环境变量的,可以直接用绝对或相对路径。如果不用环境变量,一般都用绝对路径,相对路径有时会失败。环境变量也可以定义在.bashrc文件中,这样就不用老是export这些变量了。

体系结构和TAEGET变量的对应如下表6-1所示: 表6-1 体系结构和TAEGET变量的对应 体系结构 TARGET变量的值 PowerPC ARM

Powerpc-linux arm-linux mips-linux mipsel-linux mips64-linux sh3-linux sh4-linux i386-linux ia64-linux m68k-linux m88k-linux

MIPS(big endian) MIPS(little endian) MIPS64 SuperH3 SuperH4 I386 Ia64 M68k M88k

Alpha Sparc

alpha-linux sparc-linux sparc64-linux

Sparc64

四、建立二进制工具(binutils)

Binutils是GNU工具之一,它包括连接器、汇编器和其他用于目标文件和档案的工具,它是二进制代码的处理维护工具。安装Binutils工具包含的程序有addr2line、ar、as、c++filt、gprof、ld、nm、objcopy、objdump、ranlib、readelf、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 丢弃目标文件中的全部或者特定符号。