1. 在 ~/code 下創建目錄 cross-compile, 在 cross-compile 下創建setup, 保存下載的文件:
ls ~/code/cross-compile/setup/
binutils-2.24.tar.bz2 gcc-4.6.4.tar.bz2 glibc-2.18.tar.bz2 glibc-linuxthreads-2.5.tar.bz2 linux-3.2.tar.bz2
在 cross-compile 下創建 build目錄,在 build下面創建 編譯子目錄 binutils gcc glibc,用來編譯 binutils, gcc 和 glibc:
ls ~/code/cross-compile/build/
binutils gcc glibc
創建 src目錄,用來存放解壓的代碼
創建 kernel 目錄,保存 kernel 的代碼
創建embedded-toolchain/tool-chain/目錄,存放最後編譯出來的工具鏈。
ls ~/code/cross-compile/
build embedded-toolchain gmp-4.3.2.tar.bz2 mpc-0.8.1 mpfr-2.4.2 setup
doc gmp-4.3.2 kernel mpc-0.8.1.tar.gz mpfr-2.4.2.tar.bz2 src
html
#packages pathlinux
# ls -l /home/charles/code/cross-compile/setup/ total 191188 -rwxr--r-- 1 root root 26843686 Jun 6 19:15 binutils-2.22.tar.gz -rwxr--r-- 1 root root 82216668 Jun 6 19:16 gcc-4.4.7.tar.gz -rwxr--r-- 1 root root 21119201 Jun 6 19:14 glibc-2.12.1.tar.gz -rwxr--r-- 1 root root 242445 Jun 6 19:15 glibc-linuxthreads-2.5.tar.bz2 -rwxr--r-- 1 root root 912156 Jun 8 09:09 glibc-ports-2.12.1.tar.gz -rwxr--r-- 1 root root 64424138 Jun 6 19:15 linux-2.6.32.tar.bz2 drwxr-xr-x 5 1000 1000 4096 Oct 3 2006 linuxthreads
#prepare glibc pathc++
# cd /home/charles/code/cross-compile/src # tar -xf ../src/glibc-2.12.1.tar.xz # tar -xjf ../src/glibc-linuxthreads-2.5.tar.bz2 -C glibc-2.12.1 # tar -xf ../src/glibc-ports-2.12.1.tar.xz # mv glibc-ports-2.12.1 glibc-2.12.1/ports
2. 編譯 binutils:
cd src/
tar jxvf ../setup/binutils-2.24.tar.bz2
cd ..
cd build/binutils/
../../src/binutils-2.24/configure --target=mipsel-linux --prefix=/home/charles/code/cross-compile/embedded-toolchain/tool-chain
在 build/binutils下面生成makefile文件:
bfd binutils config.log config.status etc gas gprof intl ld libiberty Makefile opcodes serdep.tmp
執行 make, make install, 會安裝到embedded-toolchain/tool-chain裏。
ls embedded-toolchain/tool-chain/bin/
mipsel-linux-addr2line mipsel-linux-c++filt mipsel-linux-gcc mipsel-linux-ld mipsel-linux-objdump mipsel-linux-strings
mipsel-linux-ar mipsel-linux-cpp mipsel-linux-gcc-4.6.4 mipsel-linux-ld.bfd mipsel-linux-ranlib mipsel-linux-strip
mipsel-linux-as mipsel-linux-elfedit mipsel-linux-gcov mipsel-linux-nm mipsel-linux-readelf
mipsel-linux-c++ mipsel-linux-g++ mipsel-linux-gprof mipsel-linux-objcopy mipsel-linux-size
3. 設置內核頭文件
cd kernel/
tar jxvf ../setup/linux-3.2.tar.bz2
cd linux-3.2/
make ARCH=mips CROSS_COMPILE=mipsel-linux- menuconfig
make ARCH=mips CROSS_COMPILE=mipsel-linux-
在 make menuconfig 的時候, machine 選擇 MIPS malta board, CPU選擇 MIPS32 release 2, Endianess Selection 選擇 "little endian"
這一步確定出錯,但只要生成了version.h 和 autoconf.h就達到了目的。
下面拷貝頭文件:
先 cd 到 embedded-toolchain/tool-chain, 創建 include 目錄:
cp -r ../../kernel/linux-3.2/include/linux include/
cp -r ../../kernel/linux-3.2/include/asm-generic include/
cp -r ../../kernel/linux-3.2/arch/mips/include/asm include/
4. 創建初始編譯器(bootstrap gcc)redis
[plain] view plain copybootstrap
../../src/gcc-4.4.7/configure --target=mipsel-linux --prefix=/home/charles/code/cross-compile/embedded-toolchain/tool-chain --with-headers=/home/charles/code/cross-compile/embedded-toolchain/tool-chain/include --enable-languages=c,c++ --disable-shared --with-float=soft --with-gmp=/usr/local/gmp-4.3.2 --with-mpfr=/usr/local/mpfr-2.4.2 --with-mpc=/usr/local/mpc-0.8.1
make all-gcc -j10 -i -k
make install-gcc
make all-target-libgcc
make install-target-libgcc
ls ../../embedded-toolchain/tool-chain/bin/
mipsel-linux-addr2line mipsel-linux-c++filt mipsel-linux-gcc mipsel-linux-ld mipsel-linux-objdump mipsel-linux-strings
mipsel-linux-ar mipsel-linux-cpp mipsel-linux-gcc-4.6.4 mipsel-linux-ld.bfd mipsel-linux-ranlib mipsel-linux-strip
mipsel-linux-as mipsel-linux-elfedit mipsel-linux-gcov mipsel-linux-nm mipsel-linux-readelf
mipsel-linux-c++ mipsel-linux-g++ mipsel-linux-gprof mipsel-linux-objcopy mipsel-linux-sizebash
# 如下添加libgcc_eh.a,libgcc_s.a到libgcc.a的軟連接,防止編譯C庫時出錯 app
#better ln -vs libgcc.a `mipsel-linux-gcc -print-libgcc-file-name | sed 's/libgcc/&_eh/'` ln -vs libgcc.a `mipsel-linux-gcc -print-libgcc-file-name | sed 's/libgcc/&_s/'` #or ln -s /home/charles/code/cross-compile/embedded-toolchain/tool-chain/lib/gcc/mipsel-linux/4.4.7/libgcc.a /home/charles/code/cross-compile/embedded-toolchain/tool-chain/lib/gcc/mipsel-linux/4.4.7/libgcc_eh.a ln -s /home/charles/code/cross-compile/embedded-toolchain/tool-chain/lib/gcc/mipsel-linux/4.4.7/libgcc.a /home/charles/code/cross-compile/embedded-toolchain/tool-chain/lib/gcc/mipsel-linux/4.4.7/libgcc_s.a
5. 編譯 glibc
cd src/
tar ../setup/glibc-2.18.tar.bz2
tar jxvf ../setup/glibc-linuxthreads-2.5.tar.bz2 --directory=glibc-2.18
cd ..
cd build/
cd glibc工具
[plain] view plain copy測試
# export PATH=$PATH:/home/charles/code/cross-compile/embedded-toolchain/tool-chain/bin # export LD_LIBRARY_PATH=/usr/local/gmp-4.3.2/lib:/usr/local/mpfr-2.4.2/lib:/usr/local/mpc-0.8.1/lib # CC=mipsel-linux-gcc AR=mipsel-linux-ar RANLIB=mipsel-linux-ranlib ../../src/glibc-2.12.1/configure --host=mipsel-linux --prefix=/home/charles/code/cross-compile/embedded-toolchain/tool-chain/mipsel-linux --enable-add-ons --with-headers=/home/charles/code/cross-compile/embedded-toolchain/tool-chain/include --with-fp=no libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes
編譯的時候報錯
cannot compute suffix of object files: cannot compile
通過查看,發現是 mipsel-linux-gcc 沒有添加到 PATH所致,執行:
export PATH=$PATH:/home/charles/code/cross-compile/embedded-toolchain/tool-chain/bin
而後,從新執行上面的配置命令,能夠經過。
最後,執行 make, make install.
6. 編譯完整的gcc
[plain] view plain copy
# cd /home/charles/code/cross-compile/build/gcc-2 # ../../src/gcc-4.4.7/configure --target=mipsel-linux --prefix=/home/charles/code/cross-compile/embedded-toolchain/tool-chain --with-arch=mips32r2 --with-mips-plt --with-float=soft --with-ppl=/usr/local --disable-libgomp --enable-poison-system-directories --enable-symvers=gnu --enable-long-long --enable-threads --enable-languages=c,c++ --enable-shared --enable-lto --enable-__cxa_atexit --with-gnu-as --with-gnu-ld --with-gmp=/usr/local/gmp-4.3.2 --with-mpfr=/usr/local/mpfr-2.4.2 --with-mpc=/usr/local/mpc-0.8.1
而後 , 執行:
make all-gcc -j10 -i -k
make install-gcc
須要注意的問題:
1)最後一步編譯 gcc 的時候,若是直接執行 make 會報錯,正確的方法是 make all-gcc
2)由於 對gcc作了 配置 --with-float=soft, 在編譯 glibc的時候也要作相應的配置: with-fp=no(不使用hardware float),不然生成的gcc 編譯文件的時候,會報找不到文件gnu/stubs-o32_soft.h 的錯誤.
最後能夠查看一下 生成的 gcc信息:
[plain] view plain copy
7.編譯 gdb
這個比較簡單,下載代碼gdb-7.6.2.tar.bz2, 解壓後,配置以下:
[plain] view plain copy
而後執行 make, make install 既能夠了。
最後,能夠用一個mips的鏡像測試一下:
[plain] view plain copy
[Issue: The mipsel is not supported]
http://blog.csdn.net/fjhyy/article/details/18960899
[Issue: forced unwind support is required]
http://bbs.chinaunix.net/thread-3589766-1-1.html
[issue: many issues which install glibc]
http://blog.csdn.net/gubenpeiyuan/article/details/7891847