在 BeagleBone Black 上构建 gcc 失败
Posted
技术标签:
【中文标题】在 BeagleBone Black 上构建 gcc 失败【英文标题】:Building gcc on BeagleBone Black fails 【发布时间】:2014-08-26 08:56:29 【问题描述】:问题
我正在尝试在 BeagleBone Black 上构建一个交叉编译器,以从 ARM 编译到 x86。这样做的目的是使用我手头上的低功耗 BeagleBone Black 作为构建服务器。它已经可以通过mingw-w64为windows编译,但我还需要它来编译Linux x86系统的代码。
但是,当我尝试在 BeagleBone Black 上编译 gcc 时,出现以下错误:
/bin/bash ./libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I../../gcc-4.6.3/gmp -D__GMP_WITHIN_GMP -g -O2 -c -o mpn/div_qr_1n_pi1.lo mpn/div_qr_1n_pi1.c
libtool: compile: gcc -DHAVE_CONFIG_H -I. -I../../gcc-4.6.3/gmp -D__GMP_WITHIN_GMP -g -O2 -c mpn/div_qr_1n_pi1.c -o mpn/div_qr_1n_pi1.o
/tmp/cckCXg2a.s: Assembler messages:
/tmp/cckCXg2a.s:194: Error: thumb conditional instruction should be in IT block -- `movcc r4,#0'
/tmp/cckCXg2a.s:195: Error: thumb conditional instruction should be in IT block -- `movcs r4,#-1'
/tmp/cckCXg2a.s:452: Error: thumb conditional instruction should be in IT block -- `movcc r4,#0'
/tmp/cckCXg2a.s:453: Error: thumb conditional instruction should be in IT block -- `movcs r4,#-1'
make[4]: *** [mpn/div_qr_1n_pi1.lo] Error 1
make[4]: Leaving directory `$HOME/builds/gcc/gmp'
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory `$HOME/builds/gcc/gmp'
make[2]: *** [all] Error 2
make[2]: Leaving directory `$HOME/builds/gcc/gmp'
make[1]: *** [all-gmp] Error 2
make[1]: Leaving directory `$HOME/builds/gcc'
make: *** [all] Error 2
我知道拇指与 ARM 有一些关系,但我大多不知道为什么这不起作用。我做错了什么?
以下是我尝试创建交叉编译器的步骤。这是我第一次尝试制作交叉编译器,因此大部分信息是从多个网页和手册中收集的。
采取的步骤
为了创建交叉编译器,我下载了以下包:
-
binutils-2.24
gmp-6.0.0a
mpfr-3.1.2
mpc-1.0.2
gcc-4.6.3
linux-3.15.3
glibc-2.19
这些都被解压到 $HOME 目录中。
从那里我设置了以下 bash 环境变量。
export PREFIX="$HOME/cross_compiler/x86_64"
export TARGET="x86_64-linux-gnu"
export PATH="$PREFIX/bin:$PATH"
然后我开始配置、构建和安装 binutils。
mkdir -p $HOME/builds/binutils
cd $HOME/builds/binutils
../../binutils-2.24/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --disable-werror
make
make install
Binutils 构建没有任何错误,所以我继续构建 gcc。首先,我将所有附加组件移到 gcc 目录中。
mv $HOME/gmp-6.0.0a $HOME/gcc-4.6.3/gmp
mv $HOME/mpfr-3.1.2 $HOME/gcc-4.6.3/mpfr
mv $HOME/mpc-1.0.2 $HOME/gcc-4.6.3/mpc
然后我进行了配置,没有任何错误,并尝试构建 gcc。
mkdir -p $HOME/builds/gcc
cd $HOME/builds/gcc
../../gcc-4.6.3/configure --target=$TARGET --prefix="$PREFIX" --disable-nls --enable-languages=c,c++ --enable-shared --with-multilib-list=m32,m64 --enable-threads=posix --enable-tls --without-headers
make
这产生了以下错误:
/bin/bash ./libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I../../gcc-4.6.3/gmp -D__GMP_WITHIN_GMP -g -O2 -c -o mpn/div_qr_1n_pi1.lo mpn/div_qr_1n_pi1.c
libtool: compile: gcc -DHAVE_CONFIG_H -I. -I../../gcc-4.6.3/gmp -D__GMP_WITHIN_GMP -g -O2 -c mpn/div_qr_1n_pi1.c -o mpn/div_qr_1n_pi1.o
/tmp/cckCXg2a.s: Assembler messages:
/tmp/cckCXg2a.s:194: Error: thumb conditional instruction should be in IT block -- `movcc r4,#0'
/tmp/cckCXg2a.s:195: Error: thumb conditional instruction should be in IT block -- `movcs r4,#-1'
/tmp/cckCXg2a.s:452: Error: thumb conditional instruction should be in IT block -- `movcc r4,#0'
/tmp/cckCXg2a.s:453: Error: thumb conditional instruction should be in IT block -- `movcs r4,#-1'
make[4]: *** [mpn/div_qr_1n_pi1.lo] Error 1
make[4]: Leaving directory `$HOME/builds/gcc/gmp'
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory `$HOME/builds/gcc/gmp'
make[2]: *** [all] Error 2
make[2]: Leaving directory `$HOME/builds/gcc/gmp'
make[1]: *** [all-gmp] Error 2
make[1]: Leaving directory `$HOME/builds/gcc'
make: *** [all] Error 2
BeagleBone Black
Linux version 3.14.1-bone2 (root@imx6q-wandboard-2gb-0) (gcc version 4.6.3 (Debian 4.6.3-14) ) #1 SMP Sun Apr 20 09:56:48 UTC 2014
“gcc -v”输出
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.6/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Debian 4.6.3-14' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-sjlj-exceptions --with-arch=armv7-a --with-fpu=vfpv3-d16 --with-float=hard --with-mode=thumb --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
Thread model: posix
gcc version 4.6.3 (Debian 4.6.3-14)
桌面
这是我试图让代码最终运行的计算机。
Linux version 3.2.0-65-generic (buildd@brownie) (gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5) ) #98-Ubuntu SMP Wed Jun 11 20:27:07 UTC 2014
“gcc -v”输出:
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
【问题讨论】:
看看您的原生 ARM 编译器是如何配置的 (gcc -v
)。您是否使用相同的--host
配置了交叉编译器?你能构建一个普通的(不是交叉的)编译器吗?
目标:arm-linux-gnueabihf 因为我是直接在 BeagleBone Black 单元上构建而不是通过加拿大交叉设置,所以构建不应该设置主机本身吗?
是的,上面的目标是“gcc -v”命令的打印输出。对于不清楚这一点,我深表歉意。我最终编译的目标是“x86_64-linux-gnu”
我想把命令的输出放在上面可能会更容易。所以我会在上面添加它。
这在 x86 机器上看起来像 gcc -v
。 ARM机器上会发生什么?此外,使用 build=x86_64-linux-gnu host=arm-whatever target=x86_64-linux-gnu 构建一种加拿大交叉编译器(crossback?)可能更简单。
【参考方案1】:
我建议不要尝试手动构建交叉编译器,而是使用现有的工具链生成框架之一:buildroot 或 crosstool-NG。您需要使用 apt-get 在 BBB 上安装一些依赖项,否则只需配置即可;制作。
【讨论】:
以上是关于在 BeagleBone Black 上构建 gcc 失败的主要内容,如果未能解决你的问题,请参考以下文章
BeagleBone Black教程之BeagleBone Black设备的连接
使用设备树覆盖在 beaglebone black 上更改心跳