linux搭建交叉编译器,⼿把⼿教你⼀步⼀步搭建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
linux下gcc编译的四个步骤|---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架构的⼀些移植等。
在编译根⽬录下建⽴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:不到该⽂件”。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论