您的位置:首页 > 运维架构 > Linux

一步一步搭建mips-linux-gcc-4.4.0交叉编译工具

2011-10-03 15:29 411 查看
http://blog.sina.com.cn/circlewood2010

一步一步搭建mips-linux-gcc-4.4.0交叉编译工具

一、准备工作:

工作环境:宿主机:ubuntu10.04 linux-2.6.32-24-generic i686 gcc-4.4.3

目标机:mips32

软件包版本:binutils-2.19.1

gcc-4.4.0

glibc-2.9

linux-2.6.29.1

gmp-4.3.0

mpfr-2.4.2

glibc-2.9-libgcc_eh-1.patch

glibc-ports-2.9

工作目录:---home

|---crosstool

|---bin//存放最终的可执行文件和lib

|---headers

|---mips

|---4.4.0

|---bin

|---……

|---binutils//对binutils编译

|---build

|---binutils-2.19.1//源码

|---gcc

|---build

|---gcc-4.4.0

|---glibc

|---build

|---glibc-2.9

|---linux

|---linux-2.6.29.1

|---qemu//存放模拟器

二、编译步骤:

1、编译binutils

lsq$:cd /home/crosstool/binutils/build EOF

lsq$:../binutils-2.19.1/configure --target=mips-linux --prefix=/home/crosstool/bin/mips/4.4.0 --disable-nls --disable-werror --disable-multilib –enable-shared

EOF

lsq$:make all-gcc && make install-gcc EOF

lsq$:make all-target-libgcc && make install-target-libgcc EOF

Done!

结果:能够在目标文件夹查看到生成的可执行文件。如:mips-linux-as

注:各参数意义可查看binutils的INSTALL文件;

蓝色部分是必须的,不能仅仅用“make && make install”,否则会报找不到文件错误;

红色部分是必须的,不能省去,否则在编译glibc的时候会出现“找不到-lgcc”错误 .

具体原因还没研究清楚?

2、编译GCC--P1

首先将GMP和MPFR两个文件夹解压并重命名为gmp,mpfr后复制到GCC源文件夹中。

Lsq$:../gcc-4.4.0/configure --target=mips-linux --prefix=/home/crosstool/bin/mips/4.4.0/ --without-headers --with-newlib --with-float=soft --with-gnu-as --with-gnu-ld --disable-nls --disable-decimal-float --disable-libgomp --disable-multilib --disable-libssp
--disable-shared --disable-threads --disable-libmudflap --disable-libstdcxx-pch --disable-libffi enable-languages=c EOF

lsq$:make && make install EOF

Done!

结果:bin文件夹下会多了mips-linux-gcc等可执行程序

增加环境变量:export PATH=$PATH:/home/crosstool/bin/mips/4.4.0/bin 之后在终端输入mips-linux-gcc 会提示“没有输入文件”,否则则是没有安装成功或者环境变量没有设置成功。

3、编译linux内核--实际上只是复制linux内核头文件

这一步最好在第一次编译完GCC之后进行,否则会提示“mips-linux-gcc命令不存在”的错误--虽然对结果可能最终没什么影响

lsq$: make ARCH=mips CROSS_COMPILE=mips-linux- INSTALL_HDR_PATH=/home/crosstool/bin/headers headers_install

EOF

Done!

这一步只是复制了linux内核头文件,不过对于较低版本的linux(如2.24)则需要设置好参数后编译内核。

4、编译GLIBC--出问题最多的一步

将glibc-ports-2.9解压后重命名为ports并复制到Glibc的源文件夹中,该文件夹主要用于针对mips架构的一些移植等。

重要:对glibc加上glibc-2.9-libgcc_eh-1.patch补丁,否则会报“无法找到-lgcc_eh”错误,当然也可以按如下网址对相关配置文件进行修改:http://trac.cross-lfs.org/browser/patches/glibc-2.9-libgcc_eh-1.patch?rev=dbb2738d4c11387e45faceea1a42cc60fac752f1
关于lfs的一个补丁说明,不过手动修改挺麻烦的,还可能改错。

在编译根目录下建立config.cache文件,并加入以下内容:

libc_cv_forced_unwind=yes

libc_cv_c_cleanup=yes

libc_cv_mips_tls=yes

libc_cv_gnu99_inline=yes

以增加对NPTL的支持,当然也可以不加入该文件而在配置时加入相关的配置参数

lsq$:BUILD_CC=gcc CC=mips-linux-gcc AR=mips-linux-ar LD=mips-linux-ld RANLIB=mips-linux-ranlib ../glibc-2.9/configure --host=mips-linux target=mips-linux prefix="/home/crosstool/bin/mips/4.4.0/mips-linux" --with-headers=/home/crosstool/bin/headers/include
--with-binutils=/home/crosstool/bin/mips/4.4.0/bin --with-tls --with-__thread --enable-sim --enable-nptl --enable-add-ons --enable-kernel=2.6.29.1 --disable-profile --without-gd --without-cvs –cache-file=config.cache EOF

编译完成后将会在prefix目录下生成相关文件。

注:网络上说需要修改$prefix$/lib/libc.so文件,实际上目的只是让ld能查找到它需要的库,所以一般将路径中的文件夹前缀去掉,只留下文件名--即在当前文件所在文件夹查找;而由于我在编译时一直使用绝对路径,故这里就使用本来就有的绝对路径而不修改。

在编译math中fpu相关文件时会出现某个错误(错误描述居然没记下来……),此则可加上--without-fp而避免此错误,当然,可能编译器少了对浮点的支持。

这一步还可能出现各种错误。

5、编译GCC-P2--所需时间最长

只要前面没有出现错误或者出现错误后不是投机而让其蒙混编译通过的话这一步应该不会出现错误。

Lsq$:../gcc-4.4.0/configure --target=mips-linux --prefix=/home/crosstool/bin/mips/4.4.0/ --with-float=soft --enable-languages=c,c++ --enable-threads=posix --enable-c99 --enable-long-long --enable-shared --enable-__cxa_atexit --enable-nls --enable-static
–with-headers=/home/crosstool/bin/headers/include EOF

Done!

注:此步必须加上内核头文件参数(而不是像某些网络资料上那样没有加),否则会报文件找不到错误,如“……/linux/errno.h:找不到该文件”。

三、工作总结

四、参考资料

1、http://hi.baidu.com/mynana/blog/item/479eb25183ec2210377abee0.html
百度博客

2、《创建ARM Linux交叉编译环境实践》网络资料,作者:兰吉尔表计(珠海)公司
3、http://hi.baidu.com/i_know_all/blog/item/e53fb2dfb299491e632798f3.html
百度博客 《Ubuntu下建立ARM交叉编译工具链》

4、http://linux.chinaunix.net/bbs/thread-1044563-1-1.html
China-Uniux论坛 《编译arm-linux工具链》

5、http://womking.bokee.com/3365467.html
《编译crosstoolchain的详细记录》博客中国

6、http://trac.cross-lfs.org/browser/patches/glibc-2.9-libgcc_eh-1.patch?rev=dbb2738d4c11387e45faceea1a42cc60fac752f1
patch from “cross linux from scratch”

7、http://sourceware.org/ml/libc-ports/2007-06/msg00008.html
to solve a fp problem

8、http://home.srvee.com/space-2856-do-blog-id-455.html
《ARM Linux交叉编译环境工具》关于libc.so等
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: