交叉编译GCC for arm
2017-07-22 20:37
776 查看
之前被同学问了一个开发版上编译程序依赖的问题,对这方面不是很熟悉,回去之后又重新查了挺久,总之这是个如何用gcc编译交叉工具链的问题.
一般官方会提供好可以使用的整套编译工具链,但是如果需要编译交叉编译用的gcc,需要知道三个概念:
Build Platform: This is the platform on which the compilation tools are executed.
Host Platform: This is the platform on which the code will eventually run.
Target Platform: If this is a compiler, this is the platform that the compiler will generate code for.
Build Platform:简单来说就是编译gcc的系统
Host Platform: 执行gcc来编译生成跨平台程序的平台
Target Platform: 执行编译的程序的平台
总的来说gcc也是一个软件,也需要用编译工具编译生成,当然也是使用gcc编译的.(当然第一个gcc肯定不是.
那么进入正题开始编译,这次编译的target_arch是arm-none-linux-gnueabi.
这四个字段的意思是:
arch[-vendor]-os[-abi]
arch is for architecture: arm, mips, x86, i686…
vendor is tool chain supplier: apple,
os is for operating system: linux, none (bare metal)
abi is for application binary interface convention: eabi, gnueabi, gnueabihf
目标是得到交叉编译使用的gcc编译工具链以及对应的glibc库。
这里之前使用6.X和5.X版本的源码编译都失败了..最后用4.8版本通过 检查一下$INSTALL_DIR/bin目录下已经有了arm-none-linux-guneabi-{tool}一套东西.
加入到系统路径里并指定默认编译指令为刚编译出来的那一套东西
耗时超长一度以为自己编错了。。。
之后重置
–with-build-sysroot来制定头文件的位置
到此编译完成,工具链在INSTALLDIR/bin下,所需环境在SYSROOT_DIR下。
至于如何检查编译是否成功可以使用qemu来测试。
具体看使用 qemu模拟arm开发板
幸亏当初没脑子一热去学嵌入式…
一般官方会提供好可以使用的整套编译工具链,但是如果需要编译交叉编译用的gcc,需要知道三个概念:
Build Platform: This is the platform on which the compilation tools are executed.
Host Platform: This is the platform on which the code will eventually run.
Target Platform: If this is a compiler, this is the platform that the compiler will generate code for.
Build Platform:简单来说就是编译gcc的系统
Host Platform: 执行gcc来编译生成跨平台程序的平台
Target Platform: 执行编译的程序的平台
总的来说gcc也是一个软件,也需要用编译工具编译生成,当然也是使用gcc编译的.(当然第一个gcc肯定不是.
那么进入正题开始编译,这次编译的target_arch是arm-none-linux-gnueabi.
这四个字段的意思是:
arch[-vendor]-os[-abi]
arch is for architecture: arm, mips, x86, i686…
vendor is tool chain supplier: apple,
os is for operating system: linux, none (bare metal)
abi is for application binary interface convention: eabi, gnueabi, gnueabihf
目标是得到交叉编译使用的gcc编译工具链以及对应的glibc库。
1.指定环境
为了不扰乱现有的环境而不使用系统目录变量export SRC_DIR=/root/cross/src export BUILD_DIR=/root/cross/build export INSTALL_DIR=/root/cross/arm export SYSROOT_DIR=$INSTALL_DIR/sysroot export BINUTIL_SRC=$SRC_DIR/binutils-2.28 export KERNEL_SRC=$SRC_DIR/linux-4.12.2 export GCC_SRC=$SRC_DIR/gcc-5.4.0 export GLIBC_SRC=$SRC_DIR/glibc-2.25
export TARGET_MACH=arm-none-linux-gnueabi export BUILD_MACH=$(gcc -dumpmachine) export LINUX_ARCH=arm
2.Download
mkdir -p $SRC_DIR cd $SRC_DIR
3.编译binutil
cd $BINUTILS_SRC ./configure --prefix=$INSTALL_DIR --build=$BUILD_MACH --target=$TARGET_MACH --with-sysroot=$SYSROOT_DIR --disable-werror cd $BINUTIL_SRC make -j4 make install
3.编译linux头文件
cd $KERNEL_SRC make mrproper make ARCH=$LINUX_ARCH INSTALL_HDR_PATH=$SYSROOT_DIR/usr headers_install
4.第一次编译GCC
# eror Building GCC requires GMP 4.2+, MPFR 2.4.0+ and MPC 0.8.0+ # slove : yum install libmpc-devel # -disable-libmudflap --disable-libssp来禁止编译时对glibc的检查 sed -i -e '/k prot/agcc_cv_libc_provides_ssp=yes' $GCC_SRC/gcc/configure mkdir $BUILD_DIR/build-gcc cd $BUILD_DIR/build-gcc $GCC_SRC/configure --prefix=$INSTALL_DIR --build=$BUILD_MACH --host=$BUILD_MACH --target=$TARGET_MACH --without-headers --enable-boostrap --enable-languages='c' --disable-threads --enable-__cxa_atexit --disable-libmudflap --with-gnu-ld --with-gnu-as --disable-libssp --disable-libgomp --disable-nls --disable-shared make -j$(nproc) all-gcc make install-gcc make -j$(nproc) all-target-libgcc make install-target-libgcc
这里之前使用6.X和5.X版本的源码编译都失败了..最后用4.8版本通过 检查一下$INSTALL_DIR/bin目录下已经有了arm-none-linux-guneabi-{tool}一套东西.
5.编译glibc
mkdir $BUILD_DIR/build-libc cd $BUILD_DIR/build-libc echo 'libc_cv_forced_unwind=yes' > config.cache echo 'libc_cv_c_cleanup=yes' >> config.cache export PATH=$INSTALL_DIR/bin:$PATH export CC=${TARGET_MACH}-gcc export LD=${TARGET_MACH}-ld export AS=${TARGET_MACH}-as
加入到系统路径里并指定默认编译指令为刚编译出来的那一套东西
./configure --prefix=/usr --build=$BUILD_MACH --host=$TARGET_MACH --with-headers=$SYSROOT_DIR/usr/include --config-cache --enabl 4000 e-kernel=2.6.32 make -k install-headers cross_compiling=yes install_root=$SYSROOTDIR make -j$(nproc) make install_root=$SYSROOT_DIR install
耗时超长一度以为自己编错了。。。
之后重置
unset CC unset LD unset AS
6.第二次编译gcc
我们得到了glibc,需要对gcc重新进行编译mkdir $BUILD_DIR/build-gcc2 cd $BUILD_DIR/build-gcc2 echo 'libc_cv_forced_unwind=yes' > config.cache echo 'libc_cv_c_cleanup=yes' >> config.cache GCC_SRC/configure --prefix=$INSTALL_DIR --build=$BUILD_MACH --target=$TARGET_MACH --with-sysroot=$SYSROOT_DIR --with-build-sysroot=$SYSROOT_DIR --enable-languages='c,c++' --with-gnu-as --with-gnu-ld --disable-multilib --disable-nls --enable-threads=posix --enable-long-longx
–with-build-sysroot来制定头文件的位置
make -j$(nproc) all-gcc make install-gcc
安装gcc
mkdir $BUILD_DIR/build-gcc3 cd $BUILD_DIR/build-gcc3 echo 'libc_cv_forced_unwind=yes' > config.cache echo 'libc_cv_c_cleanup=yes' >> config.cache $GCC_SRC/configure --prefix=$INSTALL_DIR --build=$BUILD_MACH --target=$TARGET_MACH --with-sysroot=$SYSROOT_DIR --with-build-sysroot=$SYSROOT_DIR --enable-languages='c,c++' --with-gnu-as --with-gnu-ld --disable-multilib --disable-nls --enable-threads=posix --disable-libssp --enable-long-longx --with-shared make -j$(nproc) make install
到此编译完成,工具链在INSTALLDIR/bin下,所需环境在SYSROOT_DIR下。
至于如何检查编译是否成功可以使用qemu来测试。
具体看使用 qemu模拟arm开发板
幸亏当初没脑子一热去学嵌入式…
相关文章推荐
- 关于交叉编译器arm-linux-gcc-3.3.2.tar.bz2 建立交叉编译环境
- 安装交叉编译工具arm-none-linux-gnueabi-gcc——Linux上编译在android上运行的c程序
- Ubuntu 16.04[64bit]嵌入式交叉编译环境arm-linux-gcc搭建过程图解
- 安装交叉编译工具,执行arm-linux-gcc –v命令出现提示找不到该文件或目录?解决方法
- Fedora 9 安装交叉编译工具arm-linux-gcc-4.3.2【转】
- gcc交叉编译:error float.h values not known for cross-compiler
- ubuntu 10.04 建立交叉编译环境 arm-linux-gcc-4.3.2
- linux下编译arm-gcc的交叉编译总结
- Ubuntu 12.04嵌入式交叉编译环境arm-linux-gcc搭建过程图解
- ubuntu 12.10环境arm-linux-gcc-4.3.2.tgz交叉编译
- eldk arm-linux-gcc 交叉编译环境
- codeblocks交叉编译ARM-LINUX-GCC生成能够在ARM中运行的文件
- 交叉编译提示arm-linux-gcc no such filr or directory解决
- Ubuntu 14.04 LTS嵌入式交叉编译环境arm-linux-gcc搭建过程图解
- 建立交叉编译环境arm-linux-gcc
- 配置 arm-linux-gcc 交叉编译环境
- 在Ubuntu13.10上自己动手搭建交叉编译环境arm-linux-gcc-4.8.2
- 哪里有编译好的gcc 4.0 toolchain for ARM
- ubuntu下交叉编译环境构建(arm-linux-gcc-3.4.1.tar.bz2 )
- 使用uclibc的buildroot制作交叉编译工具链 ,arm-linux-gcc