製做mipsel 交叉工具鏈

 

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

 print?在CODE上查看代碼片派生到個人代碼片sass

  1. ../../src/gcc-4.6.4/configure  --target=mipsel-linux --prefix=/home/charles/code/cross-compile/embedded-toolchain/tool-chain --without-headers --enable-languages=c,c++ --disable-shared --disable-threads --disable-decimal-float --disable-libmudflap --disable-lipssp --with-float=soft  
../../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測試

 print?在CODE上查看代碼片派生到個人代碼片

  1. CC=mipsel-linux-gcc AR=mipsel-linux-ar RANLIB=mipsel-linux-ranlib  ../../src/glibc-2.18/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/mipsel-linux/include --with-fp=no  
# 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

 print?在CODE上查看代碼片派生到個人代碼片

  1. ../../src/gcc-4.6.4/configure --target=mipsel-linux --prefix=/home/charles/code/cross-compile/embedded-toolchain/tool-chain --disable-multilib --disable-libssp  --disable-nls --disable-libstdcxx-pch --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  
# 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

 print?在CODE上查看代碼片派生到個人代碼片

  1. $ mipsel-linux-gcc -v  
  2. Using built-in specs.  
  3. COLLECT_GCC=./mipsel-linux-gcc  
  4. COLLECT_LTO_WRAPPER=/home/charles/code/cross-compile/embedded-toolchain/tool-chain/libexec/gcc/mipsel-linux/4.6.4/lto-wrapper  
  5. Target: mipsel-linux  
  6. Configured with: ../../src/gcc-4.6.4/configure --target=mipsel-linux --prefix=/home/charles/code/cross-compile/embedded-toolchain/tool-chain --without-headers --enable-languages=c,c++ --disable-shared --disable-threads --disable-decimal-float --disable-libmudflap --disable-lipssp --with-float=soft : (reconfigured) ../../src/gcc-4.6.4/configure --target=mipsel-linux --prefix=/home/charles/code/cross-compile/embedded-toolchain/tool-chain --disable-multilib --disable-libssp --disable-nls --disable-libstdcxx-pch --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  
  7. Thread model: posix  
  8. gcc version 4.6.4 (GCC)   


7.編譯  gdb

 

這個比較簡單,下載代碼gdb-7.6.2.tar.bz2, 解壓後,配置以下:

 

[plain] view plain copy

 print?在CODE上查看代碼片派生到個人代碼片

  1. ../../src/gdb-7.6.2/configure --build=i686-pc-linux-gnu  --target=mipsel-linux --prefix=/home/charles/code/cross-compile/embedded-toolchain/tool-chain  

而後執行  make, make install 既能夠了。

 

最後,能夠用一個mips的鏡像測試一下:

 

[plain] view plain copy

 print?在CODE上查看代碼片派生到個人代碼片

  1. ./mipsel-linux-gcc -g test.c -o test  
  2. charles@taotao :~/code/cross-compile/embedded-toolchain/tool-chain/bin$ file test  
  3. test: ELF 32-bit LSB executable, MIPS, MIPS32 rel2 version 1, dynamically linked (uses shared libs), for GNU/Linux 2.6.16, with unknown capability 0xf41 = 0x756e6700, with unknown capability 0x70100 = 0x3040000, not stripped  
  4. charles@taotao :~/code/cross-compile/embedded-toolchain/tool-chain/bin$ ./mipsel-linux-gdb   
  5. GNU gdb (GDB) 7.6.2  
  6. Copyright (C) 2013 Free Software Foundation, Inc.  
  7. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>  
  8. This is free software: you are free to change and redistribute it.  
  9. There is NO WARRANTY, to the extent permitted by law.  Type "show copying"  
  10. and "show warranty" for details.  
  11. This GDB was configured as "--host=i686-pc-linux-gnu --target=mipsel-linux".  
  12. For bug reporting instructions, please see:  
  13. <http://www.gnu.org/software/gdb/bugs/>.  
  14. (gdb) file test  
  15. Reading symbols from /home/charles/code/cross-compile/embedded-toolchain/tool-chain/bin/test...done.  
  16. (gdb) dis  
  17. disable      disassemble  disconnect   display        
  18. (gdb) disassemble   
  19. No frame selected.  
  20. (gdb) disassemble main  
  21. Dump of assembler code for function main:  
  22.    0x00400700 <+0>:   addiu   sp,sp,-32  
  23.    0x00400704 <+4>:   sw  ra,28(sp)  
  24.    0x00400708 <+8>:   sw  s8,24(sp)  
  25.    0x0040070c <+12>:  move    s8,sp  
  26.    0x00400710 <+16>:  lui v0,0x40  
  27.    0x00400714 <+20>:  addiu   a0,v0,2288  
  28.    0x00400718 <+24>:  jal 0x400940 <puts@plt>  
  29.    0x0040071c <+28>:  nop  
  30.    0x00400720 <+32>:  move    sp,s8  
  31.    0x00400724 <+36>:  lw  ra,28(sp)  
  32.    0x00400728 <+40>:  lw  s8,24(sp)  
  33.    0x0040072c <+44>:  addiu   sp,sp,32  
  34.    0x00400730 <+48>:  jr  ra  
  35.    0x00400734 <+52>:  nop  

 

[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

相關文章
相關標籤/搜索