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

|---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:找不到该文件”。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值