Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / ARM平台交叉编译器的制作

ARM平台交叉编译器的制作
主机环境:
  1. Ubuntu 12.04.1 64bit 
  2. gcc version 4.6.3 
ubuntu 12.04.1 64bit gcc version 4.6.3 
1. 下载最新源码包
  1. binutils-2.22.tar.gz 
  2.  
  3. gcc-4.7.2.tar.bz2 
  4. gmp-5.0.5.tar.xz 
  5. mpfr-3.1.1.tar.xz 
  6. mpc-1.0.1.tar.gz 
  7.  
  8. glibc-2.16.0.tar.xz 
  9. glibc-linuxthreads-2.5.tar.bz2 
  10. glibc-ports-2.16.0.tar.xz 
  11.  
  12. linux-3.5.4.tar.bz2 
binutils-2.22.tar.gz gcc-4.7.2.tar.bz2 gmp-5.0.5.tar.xz mpfr-3.1.1.tar.xz mpc-1.0.1.tar.gz glibc-2.16.0.tar.xz glibc-linuxthreads-2.5.tar.bz2 glibc-ports-2.16.0.tar.xz linux-3.5.4.tar.bz2   将以上源码包放入~/src目录中

1. 配置编译环境
  1. cd ~/src 
  2. vim armenv 
  3. # 将以下内容写入armenv文件中保存退出 
  4. TARGET=arm-linux-gnueabi 
  5. PREFIX=/opt/cross/gcc-4.7.2/$TARGET 
  6. PATH=$PREFIX/bin:$PATH 
  7.  
  8. export TARGET PREFIX PATH 
  9.  
  10. # 配置编译环境 
  11. . armenv 
cd ~/srcvim armenv# 将以下内容写入armenv文件中保存退出TARGET=arm-linux-gnueabiPREFIX=/opt/cross/gcc-4.7.2/$TARGETPATH=$PREFIX/bin:$PATHexport TARGET PREFIX PATH# 配置编译环境. armenv2. 编译binutils
  1. tar -xzf binutils-2.22.tar.gz 
  2. mkdir binutils-build 
  3. cd binutils-build 
  4. ../binutils-2.22/configure --target=$TARGET --prefix=$PREFIX 
  5. make -j2 
  6. sudo make install 
  7. cd .. 
tar -xzf binutils-2.22.tar.gzmkdir binutils-buildcd binutils-build../binutils-2.22/configure --target=$TARGET --prefix=$PREFIXmake -j2sudo make installcd ..3. 第一次编译gcc
  1. tar -xjf gcc-4.7.2.tar.bz2 
  2. mkdir gcc-bootstrap-build 
  3. tar -xf gmp-5.0.5.tar.xz 
  4. tar -xf mpfr-3.1.1.tar.xz 
  5. tar -xf mpc-1.0.1.tar.gz 
  6. cd gcc-4.7.2 
  7. mv -v gmp-5.0.5 gmp 
  8. mv -v mpfr-3.1.1 mpfr 
  9. mv -v mpc-1.0.1 mpc 
  10. cd ../gcc-bootstrap-build 
  11.  
  12. ../gcc-4.7.2/configure  
  13.   --target=$TARGET --host=x86_64-linux-gnu --build=x86_64-linux-gnu  
  14.   --enable-targets=all --prefix=$PREFIX  
  15.   --enable-languages=c --with-newlib --without-headers --disable-nls  
  16.   --disable-threads --disable-shared --disable-libmudflap --disable-libssp  
  17.   --disable-libgomp --disable-decimal-float --enable-checking=release  
  18.   --disable-bootstrap --disable-libquadmath  
  19.   --with-mpfr-include=$(pwd)/../gcc-4.7.2/mpfr/src  
  20.   --with-mpfr-lib=$(pwd)/mpfr/src/.libs 
  21. make -j2 all-gcc   
  22. make -j2 all-target-libgcc 
  23. sudo make install-gcc 
  24. sudo make install-target-gcc 
  25. sudo cp -v libiberty/libiberty.a $PREFIX/lib 
  26. # 以下添加libgcc_eh.a,libgcc_s.a到libgcc.a的软链接,防止编译C库时出错 
  27. sudo ln -vs libgcc.a `arm-linux-gnueabi-gcc -print-libgcc-file-name | sed "s/libgcc/&_eh/"` 
  28. sudo ln -vs libgcc.a `arm-linux-gnueabi-gcc -print-libgcc-file-name | sed "s/libgcc/&_s/"` 
  29. cd .. 
tar -xjf gcc-4.7.2.tar.bz2mkdir gcc-bootstrap-buildtar -xf gmp-5.0.5.tar.xztar -xf mpfr-3.1.1.tar.xztar -xf mpc-1.0.1.tar.gzcd gcc-4.7.2mv -v gmp-5.0.5 gmpmv -v mpfr-3.1.1 mpfrmv -v mpc-1.0.1 mpccd ../gcc-bootstrap-build../gcc-4.7.2/configure --target=$TARGET --host=x86_64-linux-gnu --build=x86_64-linux-gnu --enable-targets=all --prefix=$PREFIX --enable-languages=c --with-newlib --without-headers --disable-nls --disable-threads --disable-shared --disable-libmudflap --disable-libssp --disable-libgomp --disable-decimal-float --enable-checking=release --disable-bootstrap --disable-libquadmath --with-mpfr-include=$(pwd)/../gcc-4.7.2/mpfr/src --with-mpfr-lib=$(pwd)/mpfr/src/.libsmake -j2 all-gcc make -j2 all-target-libgccsudo make install-gccsudo make install-target-gccsudo cp -v libiberty/libiberty.a $PREFIX/lib# 以下添加libgcc_eh.a,libgcc_s.a到libgcc.a的软链接,防止编译C库时出错sudo ln -vs libgcc.a `arm-linux-gnueabi-gcc -print-libgcc-file-name | sed "s/libgcc/&_eh/"`sudo ln -vs libgcc.a `arm-linux-gnueabi-gcc -print-libgcc-file-name | sed "s/libgcc/&_s/"`cd .. 4. 安装内核头文件
  1. tar -xjf linux-3.5.4.tar.bz2 
  2. cd linux-3.5.4 
  3. make ARCH=arm headers_check 
  4. make ARCH=arm INSTALL_HDR_PATH=dest headers_install 
  5. sudo cp -rv dest/include/* $PREFIX/$TARGET/include 
  6. 注意:内核头文件的安装位置是$PREFIX/$TARGET/include,而不是$PREFIX 
  7. cd .. 
tar -xjf linux-3.5.4.tar.bz2cd linux-3.5.4make ARCH=arm headers_checkmake ARCH=arm INSTALL_HDR_PATH=dest headers_installsudo cp -rv dest/include/* $PREFIX/$TARGET/include注意:内核头文件的安装位置是$PREFIX/$TARGET/include,而不是$PREFIXcd ..5. 编译C库
  1. tar -xf glibc-2.16.0.tar.xz 
  2. tar -xjf glibc-linuxthreads-2.5.tar.bz2 -C glibc-2.16.0 
  3. tar -xf glibc-ports-2.16.0.tar.xz 
  4. mv glibc-ports-2.16.0 glibc-2.16.0/ports 
  5. mkdir glibc-build 
  6. cd glibc-build 
  7.  
  8. CC=$TARGET-gcc  
  9. AR=$TARGET-ar  
  10. RANLIB=$TARGET-ranlib  
  11. ../glibc-2.16.0/configure  
  12.   --host=$TARGET  
  13.   --prefix=$PREFIX/$TARGET  
  14.   --with-tls --disable-profile  
  15.   --enable-add-ons --with-headers=$PREFIX/$TARGET/include  
  16.   libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes libc_cv_arm_tls=yes 
  17. 注意:C库的安装位置是$PREFIX/$TARGET,编译完整的gcc时链接使用 
  18. sudo make -j2 
  19. sudo -s 
  20. . ../armenv 
  21. make install 
  22. exit 
  23. cd .. 
tar -xf glibc-2.16.0.tar.xztar -xjf glibc-linuxthreads-2.5.tar.bz2 -C glibc-2.16.0tar -xf glibc-ports-2.16.0.tar.xzmv glibc-ports-2.16.0 glibc-2.16.0/portsmkdir glibc-buildcd glibc-buildCC=$TARGET-gcc AR=$TARGET-ar RANLIB=$TARGET-ranlib ../glibc-2.16.0/configure --host=$TARGET --prefix=$PREFIX/$TARGET --with-tls --disable-profile --enable-add-ons --with-headers=$PREFIX/$TARGET/include libc_cv_forced_unwind=yes libc_cv_c_cleanup=yes libc_cv_arm_tls=yes注意:C库的安装位置是$PREFIX/$TARGET,编译完整的gcc时链接使用sudo make -j2sudo -s. ../armenvmake installexitcd ..6. 编译完整的gcc
  1. tar -xf gmp-5.0.5.tar.xz 
  2. cd gmp-5.0.5 
  3. ./configure --prefix=/usr 
  4. make -j2 
  5. sudo make install 
  6. cd .. 
  7.  
  8. tar -xf mpfr-3.1.1.tar.xz 
  9. cd mpfr-3.1.1 
  10. ./configure --prefix=/usr 
  11. make -j2 
  12. sudo make install 
  13. cd .. 
  14.  
  15. tar -xf mpc-1.0.1.tar.gz 
  16. cd mpc-1.0.1 
  17. ./configure --prefix=/usr 
  18. make -j2 
  19. sudo make install 
  20. cd .. 
  21. # 若系统中安装gmp,mpfr,mpc且版本满足要求,可不用编译安装。 
  22. # 构建期间,将三者安装到其他位置,并添加了链接搜索路径,试了几次都没有成功。 
  23. # 有时间再做尝试,估计是哪里配置不正确。 
  24.  
  25. ../gcc-4.7.2/configure --target=$TARGET  
  26.   --host=x86_64-linux-gnu --build=x86_64-linux-gnu  
  27.   --prefix=$PREFIX  
  28.   --enable-languages=c,c++ --enable-shared 
  29. make -j2 
  30. sudo make install 
  31. cd .. 
tar -xf gmp-5.0.5.tar.xzcd gmp-5.0.5./configure --prefix=/usrmake -j2sudo make installcd ..tar -xf mpfr-3.1.1.tar.xzcd mpfr-3.1.1./configure --prefix=/usrmake -j2sudo make installcd ..tar -xf mpc-1.0.1.tar.gzcd mpc-1.0.1./configure --prefix=/usrmake -j2sudo make installcd ..# 若系统中安装gmp,mpfr,mpc且版本满足要求,可不用编译安装。# 构建期间,将三者安装到其他位置,并添加了链接搜索路径,试了几次都没有成功。# 有时间再做尝试,估计是哪里配置不正确。../gcc-4.7.2/configure --target=$TARGET --host=x86_64-linux-gnu --build=x86_64-linux-gnu --prefix=$PREFIX --enable-languages=c,c++ --enable-sharedmake -j2sudo make installcd ..
7. 测试
(1) 动态编译
  1. arm-linux-gnueabi-gcc -o hello hello.c 
  2. arm-linux-gnu-eabi-strip hello 
  3. file hello 
  4. hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, stripped 
arm-linux-gnueabi-gcc -o hello hello.carm-linux-gnu-eabi-strip hellofile hellohello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.16, stripped(2) 静态编译
  1. arm-linux-gnueabi-gcc -o hello hello.c -static 
  2. arm-linux-gnu-eabi-strip hello 
  3. hello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, stripped 
arm-linux-gnueabi-gcc -o hello hello.c -staticarm-linux-gnu-eabi-strip hellohello: ELF 32-bit LSB executable, ARM, version 1 (SYSV), statically linked, for GNU/Linux 2.6.16, stripped实际还未放入开发板中进行测试,待开发板环境搭好,测试过再做更新。