分类: LINUX
2011-12-02 16:25:10
一、准备工作:
工作环境:宿主机: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”错误,当然也可以按如下网址对相关
配置文件进行修改:
关于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 libc_cv_forced_unwind=yes -–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:找不到该文件”。
3、http://hi.baidu.com/i_know_all/blog/item/e53fb2dfb299491e632798f3.html
百度博客 《Ubuntu下建立ARM交叉编译工具链》
4、
China-Uniux论坛 《编译arm-linux工具链
》
5、
《编译crosstoolchain的详细记录》博客中国
6、
patch from “cross linux from
scratch”
7、
to solve a fp problem
8、http://home.srvee.com/space-2856-do-blog-id-455.html
《ARM
Linux交叉编译环境工具》关于libc.so等
9