如何使用linux交叉编译

如何使用linux交叉编译,第1张

采用交叉编译的主要原因在于,多数嵌入式目标系统不能提供足够的资源供编译过程使用,因而只好将编译工程转移到高性能的主机中进行。linux下的交叉编译环境重要包括以下几个部分:1.对目标系统的编译器gcc2.对目标系统的二进制工具binutils3.目标系统的标准c库glibc4.目标系统的linux内核头文件交叉编译环境的建立步骤一、下载源代码 下载包括binutils、gcc、glibc及linux内核的源代码(需要注意的是,glibc和内核源代码的版本必须与目标机上实际使用的版本保持一致),并设定shell变量PREFIX指定可执行程序的安装路径。二、编译binutils 首先运行configure文件,并使用--prefix=$PREFIX参数指定安装路径,使用--target=arm-linux参数指定目标机类型,然后执行make install。三、配置linux内核头文件首先执行make mrproper进行清理工作,然后执行make config ARCH=arm(或make menuconfig/xconfig ARCH=arm)进行配置(注意,一定要在命令行中使用ARCH=arm指定cpu架构,因为缺省架构为主机的cpu架构),这一步需要根据目标机的实际情况进行详细的配置,笔者进行的实验中目标机为HP的ipaq-hp3630 PDA,因而设置system type为SA11X0,SA11X0 Implementations中选择Compaq iPAQ H3600/H3700。配置完成之后,需要将内核头文件拷贝到安装目录: cp -dR include/asm-arm $PREFIX/arm-linux/include/asm cp -dR include/linux $PREFIX/arm-linux/include/linux四、第一次编译gcc首先运行configure文件,使用--prefix=$PREFIX参数指定安装路径,使用--target=arm-linux参数指定目标机类型,并使用--disable-threads、--disable-shared、--enable-languages=c参数,然后执行make install。这一步将生成一个最简的gcc。由于编译整个gcc是需要目标机的glibc库的,它现在还不存在,因此需要首先生成一个最简的gcc,它只需要具备编译目标机glibc库的能力即可。五、交叉编译glibc这一步骤生成的代码是针对目标机cpu的,因此它属于一个交叉编译过程。该过程要用到linux内核头文件,默认路径为$PREFIX/arm-linux/sys-linux,因而需要在$PREFIX/arm-linux中建立一个名为sys-linux的软连接,使其内核头文件所在的include目录;或者,也可以在接下来要执行的configure命令中使用--with-headers参数指定linux内核头文件的实际路径。configure的运行参数设置如下(因为是交叉编译,所以要将编译器变量CC设为arm-linux-gcc): CC=arm-linux-gcc ./configure --prefix=$PREFIX/arm-linux --host=arm-linux --enable-add-ons 最后,按以上配置执行configure和make install,glibc的交叉编译过程就算完成了,这里需要指出的是,glibc的安装路径设置为$PREFIXARCH=arm/arm-linux,如果此处设置不当,第二次编译gcc时可能找不到glibc的头文件和库。六、第二次编译gcc运行configure,参数设置为--prefix=$PREFIX --target=arm-linux --enable-languages=c,c++。运行make install。到此为止整个交叉编译环境就完全生成了。几点注意事项第一点、在第一次编译gcc的时候可能会出现找不到stdio.h的错误,解决办法是修改gcc/config/arm/t-linux文件,在TARGET_LIBGCC2_CFLAGS变量的设定中增加-Dinhibit_libc和-D__gthr_posix_h。

编译工具链一般最简化的为

binutils

+

gcc

+

glibc

+

kernel-header

组合的环境。

GCC

就是编译器,他的输出每次安装只能有针对一个架构的指令输出。如果要多个架构输出,那就要装多个

GCC

,所以编译工具链里面会有一个

GCC

交叉编译就是跨架构编译,编译出来的程序不能在本机执行(当然有例外情况)。所以这个时候就需要交叉编译工具链。

工具链光有

GCC

是不行的,还需要一个

binutils

的二进制连接器,以及一个最基本的目标架构的

C

库,C

库还需要一个目标架构的内核源代码才能完全工作(当然不是必须的,但编译有的时候需要)

又因为

GCC

、binutils

不能实现单软件同时多架构输出,所以需要单独另装,又加上

C

库和内核头文件需要目标架构的东西而不能用本机本地架构的数据。

所以一个交叉编译工具链就是针对目标架构准备的单独安装单独使用的

binutils

+

gcc

+

glibc

+

kernel-header

的集合了。

PS:这个

kernel-header

并不一定就是

Linux

,他还可以是别的系统核心开发库,比如

FreeBSD

一、下载源文件

源代码文件及其版本:

binutils-2.19.tar.bz2, gcc-core-4.4.4.tar.bz2gcc-g++-4.4.4.tar.bz2 Glibc-2.7.tar.bz2 Glibc-ports-2.7.tar.bz2 Gmp-4.2.tar.bz2 mpfr-2.4.0.tar.bz2mpc-1.0.1.tar.gz Linux-2.6.25.tar.bz2 (由于我在编译出错的过程中,根据出错的信息修改了相关的C代码,故而没有下载相应的补丁)

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

二、建立工作目录

编译所用主机型号 fc14.i686,虚拟机选的是VM7.0,Linux发行版选的是Fedora9,

第一次编译时用的是root用户(第二次用一般用户yyz), 所有的工作目录都在/home/yyz/cross下面建立完成,首先在/home/yyz目录下建立cross目录,然后进入工作目录,查看当前目录。命令如下:

创建工具链文件夹:

[root@localhost cross]# mkdir 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] #ls

build-dir doc kernel program setup-dir src-dir tool-chain

[root@localhost embedded- toolchains] #cd setup-dir

拷贝源文件:

这里我们采用直接拷贝源文件的方法,首先应该修改setup-dir的权限

[root@localhost embedded- toolchains] #chmod 777 setup-dir

然后直接拷贝/home/yyz目录下的源文件到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/yyz/cross/embedded-toolchains

export TARGET=arm-linux

export PREFIX=$PRJROOT/tool-chain

export TARGET_PREFIX=$PREFIX/$TARGET

export PATH=$PREFIX/bin:$PATH

截图如下:

执行如下语句使环境变量生效:

[root@localhost scripts]# source ./environment-variables

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

下面将分步介绍安装binutils-2.19.1的过程。

[root@localhost script] # cd $PRJROOT/src-dir

[root@localhost src-dir] # tar jxvf ../setup-dir/binutils-2.19.1.tar.bz2

[root@localhost src-dir] # cd $PRJROOT/build-dir/build-binutils

创建Makefile:

[root@localhost build-binutils] #../../src-dir/binutils-2.19.1/configure --target=$TARGET --prefix=$PREFIX

在build-binutils目录下面生成Makefile文件,然后执行make,make install,此过程比较缓慢,大约需要一个15分钟左右。完成后可以在$PREFIX/bin下面看到我们的新的binutil。

输入如下命令

[root@localhost build-binutils]#ls $PREFIX/bin


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/7409123.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-05
下一篇 2023-04-05

发表评论

登录后才能评论

评论列表(0条)

保存