用crosstool-ng建立Linux交叉编译环境(armv4t)
1.下载crosstool-ng http://crosstool-ng.org/
2.安装必要文件 sudo apt-get install libncurses5-dev bison flex texinfo automake libtool patch gcj cvs cvsd gawk cd /usr/bin sudo mv mawk mawkbak sudo ln -s gawk mawk
3.crosstool-ng的安装 cd ~/work mkdir crosstool-ng tar xvjf crosstool-ng-1.11.0.tar.bz2 cd crosstool-ng-1.11.0/ ./configure --prefix=/home/thinker/work/crosstool-ng cp ct-ng.comp ~/ #这句不能用(可能要重启?),改用下一句 echo "PATH=$PATH:/home/thinker/work/crosstool-ng/bin" >> ~/.bashrc source ~/.bashrc ct-ng -h #执行上一条之后出现一大堆帮助信息表明crosstool-ng安装成功
4.交叉工具链的配置 cd ~/work/crosstool-ng mkdir ~/src mkdir build_toolchain #先修补crosstool-ng的一个bug(注1) #编辑crosstool-ng安装目录下的lib/ct-ng-1.11.0/scripts/build/internals.sh #将 gcc_version=$( cat "${CT_SRC_DIR}/gcc-${CT_GCC_VERSION}/gcc/BASE-VER" ) #改为 gcc_version=$( cat "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/gcc/BASE-VER" )
ct-ng arm-unknown-linux-gnueabi #使用arm-unknown-linux-gnueabi
#出现提示:/bin/bash: /home/thinker/work/crosstool-ng/lib/ct-ng-1.11.0/samples/arm-unknown-linux-gnueabi/reported.by: 没有那个文件或目录 #这个不用管,因为的确不存在
ct-ng menuconfig #配置 #下面是我的配置结果(删除了一些带#的关于构架或者版本的行) [DEBUG] ================================================================= [DEBUG] Dumping user-supplied crosstool-NG configuration [DEBUG] ==> Executing: 'grep' '-E' '^(# |)CT_' '.config' [DEBUG] # CT_BACKEND is not set [DEBUG] CT_MODULES=y [DEBUG] # CT_OBSOLETE is not set [DEBUG] # CT_EXPERIMENTAL is not set [DEBUG] # CT_DEBUG_CT is not set [DEBUG] CT_LOCAL_TARBALLS_DIR="${HOME}/src" [DEBUG] CT_SAVE_TARBALLS=y [DEBUG] CT_WORK_DIR="${CT_TOP_DIR}/build_toolchain/" [DEBUG] CT_PREFIX_DIR="/home/thinker/work/gcc-4.4.5-glibc-2.9/" [DEBUG] CT_INSTALL_DIR="${CT_PREFIX_DIR}" [DEBUG] CT_RM_RF_PREFIX_DIR=y [DEBUG] # CT_REMOVE_DOCS is not set [DEBUG] CT_INSTALL_DIR_RO=y [DEBUG] CT_STRIP_ALL_TOOLCHAIN_EXECUTABLES=y [DEBUG] # CT_FORBID_DOWNLOAD is not set [DEBUG] # CT_FORCE_DOWNLOAD is not set [DEBUG] CT_USE_MIRROR=y [DEBUG] # CT_PREFER_MIRROR is not set [DEBUG] CT_MIRROR_BASE_URL="http://ymorin.is-a-geek.org/mirrors/" [DEBUG] CT_CONNECT_TIMEOUT=10 [DEBUG] # CT_ONLY_DOWNLOAD is not set [DEBUG] # CT_FORCE_EXTRACT is not set [DEBUG] CT_OVERIDE_CONFIG_GUESS_SUB=y [DEBUG] # CT_ONLY_EXTRACT is not set [DEBUG] CT_PATCH_BUNDLED=y [DEBUG] # CT_PATCH_LOCAL is not set [DEBUG] # CT_PATCH_BUNDLED_LOCAL is not set [DEBUG] # CT_PATCH_LOCAL_BUNDLED is not set [DEBUG] # CT_PATCH_BUNDLED_FALLBACK_LOCAL is not set [DEBUG] # CT_PATCH_LOCAL_FALLBACK_BUNDLED is not set [DEBUG] # CT_PATCH_NONE is not set [DEBUG] CT_PATCH_ORDER="bundled" [DEBUG] # CT_PATCH_SINGLE is not set [DEBUG] # CT_PATCH_USE_LOCAL is not set [DEBUG] CT_PARALLEL_JOBS=4 [DEBUG] CT_LOAD=0 [DEBUG] CT_USE_PIPES=y [DEBUG] # CT_CONFIG_SHELL_SH is not set [DEBUG] # CT_CONFIG_SHELL_ASH is not set [DEBUG] CT_CONFIG_SHELL_BASH=y [DEBUG] # CT_CONFIG_SHELL_CUSTOM is not set [DEBUG] CT_CONFIG_SHELL="bash" [DEBUG] # CT_LOG_ERROR is not set [DEBUG] # CT_LOG_WARN is not set [DEBUG] # CT_LOG_INFO is not set [DEBUG] CT_LOG_EXTRA=y [DEBUG] # CT_LOG_ALL is not set [DEBUG] # CT_LOG_DEBUG is not set [DEBUG] CT_LOG_LEVEL_MAX="EXTRA" [DEBUG] # CT_LOG_SEE_TOOLS_WARN is not set [DEBUG] CT_LOG_PROGRESS_BAR=y [DEBUG] CT_LOG_TO_FILE=y [DEBUG] CT_LOG_FILE_COMPRESS=y [DEBUG] CT_ARCH="arm" [DEBUG] CT_ARCH_SUPPORTS_BOTH_MMU=y [DEBUG] CT_ARCH_SUPPORTS_BOTH_ENDIAN=y [DEBUG] CT_ARCH_SUPPORTS_32=y [DEBUG] # CT_ARCH_SUPPORTS_64 is not set [DEBUG] CT_ARCH_SUPPORT_ARCH=y [DEBUG] # CT_ARCH_SUPPORT_ABI is not set [DEBUG] CT_ARCH_SUPPORT_CPU=y [DEBUG] CT_ARCH_SUPPORT_TUNE=y [DEBUG] CT_ARCH_SUPPORT_FPU=y [DEBUG] CT_ARCH_DEFAULT_HAS_MMU=y [DEBUG] # CT_ARCH_DEFAULT_BE is not set [DEBUG] CT_ARCH_DEFAULT_LE=y [DEBUG] CT_ARCH_DEFAULT_32=y [DEBUG] # CT_ARCH_DEFAULT_64 is not set [DEBUG] CT_ARCH_ARCH="armv4t" [DEBUG] CT_ARCH_CPU="arm9tdmi" [DEBUG] CT_ARCH_TUNE="arm920t" [DEBUG] CT_ARCH_FPU="" [DEBUG] # CT_ARCH_BE is not set [DEBUG] CT_ARCH_LE=y [DEBUG] CT_ARCH_32=y [DEBUG] # CT_ARCH_64 is not set [DEBUG] CT_ARCH_BITNESS=32 [DEBUG] # CT_ARCH_FLOAT_HW is not set [DEBUG] CT_ARCH_FLOAT_SW=y [DEBUG] CT_TARGET_CFLAGS="" [DEBUG] CT_TARGET_LDFLAGS="" [DEBUG] # CT_ARCH_alpha is not set [DEBUG] CT_ARCH_arm=y
[DEBUG] CT_ARCH_alpha_AVAILABLE=y [DEBUG] CT_ARCH_arm_AVAILABLE=y [DEBUG] CT_ARCH_avr32_AVAILABLE=y [DEBUG] CT_ARCH_blackfin_AVAILABLE=y [DEBUG] CT_ARCH_m68k_AVAILABLE=y [DEBUG] CT_ARCH_mips_AVAILABLE=y [DEBUG] CT_ARCH_powerpc_AVAILABLE=y [DEBUG] CT_ARCH_s390_AVAILABLE=y [DEBUG] CT_ARCH_sh_AVAILABLE=y [DEBUG] CT_ARCH_sparc_AVAILABLE=y [DEBUG] CT_ARCH_x86_AVAILABLE=y [DEBUG] CT_ARCH_USE_MMU=y [DEBUG] CT_ARCH_ARM_MODE="arm" [DEBUG] CT_ARCH_ARM_MODE_ARM=y [DEBUG] # CT_ARCH_ARM_MODE_THUMB is not set [DEBUG] CT_ARCH_ARM_EABI=y [DEBUG] CT_FORCE_SYSROOT=y [DEBUG] CT_USE_SYSROOT=y [DEBUG] CT_SYSROOT_NAME="sysroot" [DEBUG] CT_SYSROOT_DIR_PREFIX="" [DEBUG] CT_TARGET_VENDOR="unknown" [DEBUG] CT_TARGET_ALIAS_SED_EXPR="" [DEBUG] CT_TARGET_ALIAS="" [DEBUG] # CT_NATIVE is not set [DEBUG] CT_CROSS=y [DEBUG] # CT_CROSS_NATIVE is not set [DEBUG] # CT_CANADIAN is not set [DEBUG] CT_TOOLCHAIN_TYPE="cross" [DEBUG] CT_BUILD="" [DEBUG] CT_BUILD_PREFIX="" [DEBUG] CT_BUILD_SUFFIX="" [DEBUG] # CT_BARE_METAL is not set [DEBUG] # CT_MINGW32 is not set [DEBUG] CT_KERNEL_SUPPORTS_SHARED_LIBS=y [DEBUG] CT_KERNEL="linux" [DEBUG] CT_KERNEL_VERSION="2.6.32.39" [DEBUG] # CT_KERNEL_bare_metal is not set [DEBUG] CT_KERNEL_linux=y [DEBUG] # CT_KERNEL_mingw32 is not set [DEBUG] CT_KERNEL_bare_metal_AVAILABLE=y [DEBUG] CT_KERNEL_linux_AVAILABLE=y [DEBUG] CT_KERNEL_mingw32_AVAILABLE=y [DEBUG] CT_SHARED_LIBS=y [DEBUG] CT_KERNEL_LINUX_INSTALL=y
[DEBUG] CT_KERNEL_V_2_6_32_39=y
[DEBUG] CT_KERNEL_LINUX_VERBOSITY_0=y [DEBUG] # CT_KERNEL_LINUX_VERBOSITY_1 is not set [DEBUG] # CT_KERNEL_LINUX_VERBOSITY_2 is not set [DEBUG] CT_KERNEL_LINUX_VERBOSE_LEVEL=0 [DEBUG] CT_KERNEL_LINUX_INSTALL_CHECK=y [DEBUG] CT_ARCH_BINFMT_ELF=y [DEBUG] # CT_ARCH_BINFMT_FLAT is not set [DEBUG] # CT_ARCH_BINFMT_FDPIC is not set
[DEBUG] CT_BINUTILS_V_2_20=y
[DEBUG] CT_BINUTILS_VERSION="2.20" [DEBUG] CT_BINUTILS_GOLD_SUPPORTS_ARCH=y [DEBUG] CT_BINUTILS_FORCE_LD_BFD=y [DEBUG] CT_BINUTILS_LINKER_LD=y [DEBUG] # CT_BINUTILS_LINKER_GOLD is not set [DEBUG] # CT_BINUTILS_LINKER_LD_GOLD is not set [DEBUG] # CT_BINUTILS_LINKER_GOLD_LD is not set [DEBUG] CT_BINUTILS_LINKERS_LIST="ld" [DEBUG] CT_BINUTILS_LINKER_DEFAULT="bfd" [DEBUG] CT_BINUTILS_EXTRA_CONFIG="" [DEBUG] CT_BINUTILS_FOR_TARGET=y [DEBUG] CT_BINUTILS_FOR_TARGET_IBERTY=y [DEBUG] CT_BINUTILS_FOR_TARGET_BFD=y [DEBUG] CT_CC="gcc" [DEBUG] CT_CC_VERSION="4.4.5" [DEBUG] CT_CC_gcc=y
[DEBUG] CT_CC_V_4_4_5=y
[DEBUG] # CT_CC_GCC_4_2 is not set [DEBUG] CT_CC_GCC_4_2_or_later=y [DEBUG] # CT_CC_GCC_4_3 is not set [DEBUG] CT_CC_GCC_4_3_or_later=y [DEBUG] CT_CC_GCC_4_4=y [DEBUG] CT_CC_GCC_4_4_or_later=y
[DEBUG] CT_CC_GCC_HAS_GRAPHITE=y [DEBUG] # CT_CC_GCC_HAS_LTO is not set [DEBUG] CT_CC_GCC_USE_GMP_MPFR=y [DEBUG] CT_CC_GCC_USE_PPL_CLOOG=y [DEBUG] # CT_CC_GCC_USE_MPC is not set [DEBUG] # CT_CC_GCC_USE_LIBELF is not set [DEBUG] CT_CC_LANG_JAVA_USE_ECJ=y [DEBUG] CT_CC_SUPPORT_CXX=y [DEBUG] CT_CC_SUPPORT_FORTRAN=y [DEBUG] CT_CC_SUPPORT_JAVA=y [DEBUG] CT_CC_SUPPORT_ADA=y [DEBUG] CT_CC_SUPPORT_OBJC=y [DEBUG] CT_CC_SUPPORT_OBJCXX=y [DEBUG] CT_CC_LANG_CXX=y [DEBUG] CT_CC_LANG_FORTRAN=y [DEBUG] CT_CC_LANG_JAVA=y [DEBUG] CT_CC_PKGVERSION="crosstool-NG-${CT_VERSION}" [DEBUG] CT_CC_BUGURL="" [DEBUG] CT_CC_ENABLE_CXX_FLAGS="" [DEBUG] CT_CC_CORE_EXTRA_CONFIG="" [DEBUG] CT_CC_EXTRA_CONFIG="" [DEBUG] CT_CC_STATIC_LIBSTDCXX=y [DEBUG] CT_CC_GCC_USE_GRAPHITE=y [DEBUG] CT_CC_GCC_ENABLE_TARGET_OPTSPACE=y [DEBUG] # CT_CC_GCC_LIBMUDFLAP is not set [DEBUG] CT_CC_GCC_LIBGOMP=y [DEBUG] # CT_CC_GCC_LIBSSP is not set [DEBUG] CT_CC_CXA_ATEXIT=y [DEBUG] # CT_CC_GCC_DISABLE_PCH is not set [DEBUG] CT_CC_GCC_SJLJ_EXCEPTIONS=m [DEBUG] CT_CC_GCC_LDBL_128=m [DEBUG] CT_LIBC="glibc" [DEBUG] CT_LIBC_VERSION="2.9" [DEBUG] # CT_LIBC_eglibc is not set [DEBUG] CT_LIBC_glibc=y [DEBUG] # CT_LIBC_mingw is not set [DEBUG] # CT_LIBC_newlib is not set [DEBUG] # CT_LIBC_none is not set [DEBUG] # CT_LIBC_uClibc is not set [DEBUG] CT_LIBC_eglibc_AVAILABLE=y [DEBUG] CT_LIBC_glibc_AVAILABLE=y [DEBUG] CT_LIBC_GLIBC_TARBALL=y
[DEBUG] # CT_LIBC_GLIBC_V_2_10_1 is not set [DEBUG] CT_LIBC_GLIBC_V_2_9=y
[DEBUG] CT_LIBC_mingw_AVAILABLE=y [DEBUG] CT_LIBC_newlib_AVAILABLE=y [DEBUG] CT_LIBC_none_AVAILABLE=y [DEBUG] CT_LIBC_uClibc_AVAILABLE=y [DEBUG] CT_LIBC_glibc_familly=y [DEBUG] CT_LIBC_GLIBC_EXTRA_CONFIG="" [DEBUG] CT_LIBC_GLIBC_CONFIGPARMS="" [DEBUG] CT_LIBC_GLIBC_EXTRA_CFLAGS="" [DEBUG] CT_LIBC_EXTRA_CC_ARGS="" [DEBUG] # CT_LIBC_DISABLE_VERSIONING is not set [DEBUG] CT_LIBC_OLDEST_ABI="" [DEBUG] # CT_LIBC_GLIBC_FORCE_UNWIND is not set [DEBUG] CT_LIBC_GLIBC_USE_PORTS=y [DEBUG] CT_LIBC_ADDONS_LIST="" [DEBUG] # CT_LIBC_GLIBC_KERNEL_VERSION_NONE is not set [DEBUG] CT_LIBC_GLIBC_KERNEL_VERSION_AS_HEADERS=y [DEBUG] # CT_LIBC_GLIBC_KERNEL_VERSION_CHOSEN is not set [DEBUG] CT_LIBC_GLIBC_MIN_KERNEL="2.6.32.39" [DEBUG] CT_LIBC_SUPPORT_THREADS_ANY=y [DEBUG] CT_LIBC_SUPPORT_NPTL=y [DEBUG] # CT_LIBC_SUPPORT_LINUXTHREADS is not set [DEBUG] # CT_LIBC_SUPPORT_WIN32THREADS is not set [DEBUG] # CT_LIBC_SUPPORT_THREADS_NONE is not set [DEBUG] CT_THREADS="nptl" [DEBUG] CT_THREADS_NPTL=y [DEBUG] # CT_THREADS_LINUXTHREADS is not set [DEBUG] # CT_THREADS_WIN32THREADS is not set [DEBUG] # CT_THREADS_NONE is not set [DEBUG] CT_LIBC_XLDD=y [DEBUG] CT_DEBUG_dmalloc=y [DEBUG] CT_DMALLOC_V_5_5_2=y [DEBUG] CT_DMALLOC_VERSION="5.5.2" [DEBUG] CT_DEBUG_duma=y [DEBUG] CT_DUMA_A=y [DEBUG] CT_DUMA_SO=y [DEBUG] CT_DUMA_V_2_5_15=y [DEBUG] # CT_DUMA_V_2_5_14 is not set
[DEBUG] CT_DUMA_VERSION="2_5_15" [DEBUG] CT_DEBUG_gdb=y [DEBUG] CT_GDB_CROSS=y [DEBUG] # CT_GDB_CROSS_STATIC is not set [DEBUG] CT_GDB_NATIVE=y [DEBUG] # CT_GDB_NATIVE_NO_STATIC is not set [DEBUG] # CT_GDB_NATIVE_STATIC is not set [DEBUG] CT_GDB_GDBSERVER=y [DEBUG] CT_GDB_GDBSERVER_STATIC=y [DEBUG] # CT_GDB_V_linaro_7_2_2011_04_0 is not set
[DEBUG] CT_GDB_V_6_8=y [DEBUG] CT_GDB_VERSION="6.8" [DEBUG] CT_DEBUG_ltrace=y [DEBUG] CT_LTRACE_V_0_5_3=y [DEBUG] # CT_LTRACE_V_0_5_2 is not set
[DEBUG] CT_LTRACE_VERSION="0.5.3" [DEBUG] CT_LTRACE_0_5_3_or_later=y [DEBUG] CT_DEBUG_strace=y [DEBUG] # CT_STRACE_V_4_5_20 is not set [DEBUG] CT_STRACE_V_4_5_19=y
[DEBUG] CT_STRACE_VERSION="4.5.19" [DEBUG] CT_COMPLIBS_NEEDED=y [DEBUG] CT_GMP_NEEDED=y [DEBUG] CT_MPFR_NEEDED=y [DEBUG] CT_PPL_NEEDED=y [DEBUG] CT_CLOOG_NEEDED=y [DEBUG] # CT_MPC_NEEDED is not set [DEBUG] # CT_LIBELF_NEEDED is not set [DEBUG] CT_COMPLIBS=y [DEBUG] CT_GMP=y [DEBUG] CT_MPFR=y [DEBUG] CT_PPL=y [DEBUG] CT_CLOOG=y [DEBUG] CT_LIBELF_TARGET=y [DEBUG] # CT_GMP_V_5_0_1 is not set [DEBUG] CT_GMP_V_4_3_2=y
[DEBUG] CT_GMP_VERSION="4.3.2" [DEBUG] # CT_MPFR_V_3_0_0 is not set [DEBUG] CT_MPFR_V_2_4_2=y
[DEBUG] CT_MPFR_VERSION="2.4.2"
[DEBUG] # CT_PPL_V_0_11 is not set [DEBUG] CT_PPL_V_0_10_2=y [DEBUG] CT_PPL_VERSION="0.10.2"
[DEBUG] CT_CLOOG_V_0_15_10=y [DEBUG] # CT_CLOOG_V_0_15_9 is not set
[DEBUG] CT_CLOOG_VERSION="0.15.10" [DEBUG] CT_LIBELF_V_0_8_13=y [DEBUG] # CT_LIBELF_V_0_8_12 is not set [DEBUG] CT_LIBELF_VERSION="0.8.13" [DEBUG] # CT_COMPLIBS_CHECK is not set [DEBUG] Dumping user-supplied crosstool-NG configuration: done in 0.11s (at 00:01)
5.编译工具链 ./bin/ct-ng build
#在build的过程中会在~/src目录下存放下载的源码(可以事先手动下载对应版本的源码) #下面是我的源码 binutils-2.20.tar.bz2 gcc-4.4.5.tar.bz2 linux-2.6.32.39.tar.bz2 cloog-ppl-0.15.10.tar.gz gdb-6.8.tar.bz2 ltrace_0.5.3.orig.tar.gz dmalloc-5.5.2.tgz glibc-2.9.tar.bz2 mpfr-2.4.2.tar.bz2 duma_2_5_15.tar.gz glibc-ports-2.9.tar.bz2 ncurses-5.7.tar.gz ecj-latest.jar gmp-4.3.2.tar.bz2 ppl-0.10.2.tar.bz2 expat-2.0.1.tar.gz libelf-0.8.13.tar.gz strace-4.5.19.tar.bz2 #下载的过程用了53分钟 #编译的时间用了90分钟(不带上下载时间,因为前两次编译出错了)
cd ~/work/gcc-4.4.5-glibc-2.9/bin ./arm-unknown-linux-gnueabi-gcc -v #出现一大堆信息说明工具链制作成功,备份一下这个工具链,防止下次使用相同配置制作工具链会把这个给删除
##参考链接: http://blog.chinaunix.net/space.php?uid=20543672&do=blog&id=94369 http://hi.baidu.com/caicry/blog/item/f306db639c4281680c33fa1b.html #其实crosstool-ng里面的说明文档有详尽的介绍,会一点英语的最好看看
##注1: #没有修改这个bug的话,会出现以下这样的内容: [INFO ] ================================================================= [INFO ] Cleaning-up the toolchain's directory [INFO ] Stripping all toolchain executables [221:05] / cat: /home/thinker/work/crosstool-ng/.build/src/gcc-/gcc/BASE-VER: No such file or directory [ERROR] [ERROR] >> Build failed in step 'Cleaning-up the toolchain's directory' [ERROR] >> [ERROR] >> Error happened in: do_finish[scripts/build/internals.sh] [ERROR] >> called from: main[scripts/crosstool-NG.sh@582] [ERROR] >> [ERROR] >> For more info on this error, look at the file: 'build.log' [ERROR] >> There is a list of known issues, some with workarounds, in: [ERROR] >> 'share/doc/ct-ng-1.11.0/B - Known issues.txt' [ERROR] [ERROR] Build failed in step 'Cleaning-up the toolchain's directory' [ERROR] [ERROR] (elapsed: 221:04.99) [221:05] / make: *** [build] 错误 1 #解决办法原址:http://permalink.gmane.org/gmane.comp.gcc.cross-compiling/13652 #原址内容: [PATCH] fix toolchain stripping Stripping is broken in 1.11.0 [12:41] / cat: /home/max/work/gen-toolchain/trunk/targets/src/gcc-/gcc/BASE-VER: No such file or directory Small typo (I think) introduced by 055e505f28be
--- ./scripts/build/internals.sh.old 2011-05-02 17:11:53.728977899 +0200 +++ ./scripts/build/internals.sh 2011-05-02 17:11:11.468204063 +0200 @@ -22,7 +22,7 @@ esac CT_DoLog INFO "Stripping all toolchain executables" CT_Pushd "${CT_PREFIX_DIR}" - gcc_version=$( cat "${CT_SRC_DIR}/gcc-${CT_GCC_VERSION}/gcc/BASE-VER" ) + gcc_version=$( cat "${CT_SRC_DIR}/gcc-${CT_CC_VERSION}/gcc/BASE-VER" ) for _t in "bin/${CT_TARGET}-"* \ "${CT_TARGET}/bin/"* \ "libexec/gcc/${CT_TARGET}/${gcc_version}/"* \
--
|