在 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 上启用 UART

BeagleBone Black教程之BeagleBone Black设备的连接

Beaglebone Black扩展板开发(零):缘起

使用设备树覆盖在 beaglebone black 上更改心跳

如何在 beaglebone black 上安装 lamp/xampp 服务器

使用 beaglebone Black SPI 在 DIP203-6 LCD 屏幕上显示字符