欢迎来到天天文库
浏览记录
ID:8820546
大小:38.50 KB
页数:5页
时间:2018-04-08
《linux下构建gcc交叉编译器全记录》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、Linux下构建GCC交叉编译器全记录2010-12-1521:18〇、缘起前不久做了个DamnSmallLinux启动U盘,感觉很实用。美中不足是根文件系统一直是初始RAM盘,不能按需修改;要把DSL安装到U盘又需要200M空间,我的U盘只有128M。一怒之下,决定自己做一个LFS(LinuxFromScratch),开源精神不是支持自己动手么。计划是构建一个兼容i586(Pentium,Celeron)以上架构的小型系统,完全包含在U盘里。我所用的机器是x86_64架构,因此LFS的第一步是构建一个到
2、i586的交叉编译器。Cross-CompileLinuxFromScratch是关于交叉编译Linux的详尽文档,开头包括了构建交叉编译器的详细介绍。但是所用的源代码版本有些已颇旧,而且步骤也略嫌繁琐,我决定用新版本的源代码自己探索一下。 一、准备编译环境构建过程运行在Fedora14Linux上,CPUIntelCore2Duo,内核版本2.6.35.9(x86_64)。要编译交叉编译器首先需要一个编译器,这里就是GCC(4.5.1)。另外,编译GCC还需要MPFR、GMP、MPC三个库,安装之。当然
3、一干构建工具如make、autoconf等是不可或缺的,就不赘述了。为了构建过程清晰,源代码和目标文件尽量分开放置,因此在用户目录下创建目录src放置源代码,cross-build放置目标代码。mkdir~/srcmkdir~/cross-build我准备把交叉编译器安装到/usr/local目录下,为简化配置命令,创建一个脚本~/cross-build/setenv设置环境变量,内容如下:PREFIX=/usr/localPATH=${PREFIX}/bin:/bin:/usr/binTOOLS=`pw
4、d`/toolsHOST=$MACHTYPETARGET=i586-linux如果构建工作中途停止,关机重启,或者其他干扰,继续之前先运行此脚本重设环境。cd~/cross-build.setenv 二、下载源代码需要下载Binutils、GCC、Glibc的源代码,源代码包位于GNU的FTP(ftp://ftp.gnu.org/)上。这里下载的是Binutils2.21、GCC4.5.1和Glibc2.11.3。因为我的目标平台是Linux,编译Glibc还需要Linux的源代码,可以从http://w
5、ww.kernel.org/获取。wgetftp://ftp.gnu.org/gnu/binutils/binutils-2.21.tar.bz2wgetftp://ftp.gnu.org/gnu/gcc/gcc-4.5.1/gcc-4.5.1.tar.bz2wgetftp://ftp.gnu.org/gnu/glibc/glibc-2.11.3.tar.bz2wgethttp://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.36.2.tar.bz2 三、
6、编译Binutils整个构建过程分四大步,依次为Binutils,静态GCC,Glibc,最终(带Glibc的)GCC,后面的工作依赖于前面的结果。Binutils包含交叉编译器必需的汇编器、链接器、archiver(打包器?)和其他各种工具。首先解压源代码到~/src。tarxjfbinutils-2.21.tar.bz2-C~/src在~/cross-build目录下为Binutils目标文件创建一个目录,然后切换到该目录。mkdir~/cross-build/binutilscd~/cross-bu
7、ild/binutils配置为交叉编译,--target指明编译出来的工具可以处理的体系结构,而不是它们将要运行在的体系结构。这里构建的是交叉编译器,编译器的运行环境(宿主host)和目标程序的运行环境(目标机target)是不同的,但是编译交叉编译器的工具的运行环境(build)和宿主是一样的(至少这里是)。~/src/binutils-2.21/configure--prefix=$PREFIX--target=$TARGET--disable-nlsmake-j22>&1
8、teemake.out-j
9、2选项使GNUmake并行编译,2>&1把错误输出重定向到标准输出,然后用tee存入文件make.out。sudomake-j2install四、编译静态GCC一个完整的交叉编译器必须带有标准C库,这里选择Glibc,而为了编译Glibc,又必须先有一个交叉编译器。解决的办法是先编译一个受限的、不带C库的交叉编译器,然后用它来编译Glibc,最后再携同Glibc一齐编译完整的交叉编译器。这一步就是编译一个受限的GCC,称为静态
此文档下载收益归作者所有