首页 > 解决方案 > 从源代码编译 glibc 在 avx 标头中失败:“无法将 x 类型的值转换为具有不同大小的向量类型 y”

问题描述

我一直在尝试构建一个针对我的主机的 GNU 工具链(您可以将其称为交叉编译器或带有前缀的编译器)。我一直在遵循这些说明,但在我的一些配置选项和代码版本中与它们不同。我完成了第 6 步,我需要完整构建 glibc。在那里,我收到以下编译错误:

In file included from /usr/local/gnu-cross/lib/gcc/x86_64-linux-gnu/9.2.0/include/immintrin.h:55,
                 from /usr/local/gnu-cross/lib/gcc/x86_64-linux-gnu/9.2.0/include/x86intrin.h:32,
                 from ../sysdeps/unix/sysv/linux/x86/hle.h:5,
                 from ../sysdeps/unix/sysv/linux/x86/elision-lock.c:22:
/usr/local/gnu-cross/lib/gcc/x86_64-linux-gnu/9.2.0/include/avx512fintrin.h: In function '_mm_roundscale_round_ss':
/usr/local/gnu-cross/lib/gcc/x86_64-linux-gnu/9.2.0/include/avx512fintrin.h:9147:10: error: cannot convert a value of type 'int' to vector type '__vector(4) float' which has different size
 9147 |          (__v4sf) __B, __imm, __R);
      |          ^
/usr/local/gnu-cross/lib/gcc/x86_64-linux-gnu/9.2.0/include/avx512fintrin.h: In function '_mm_roundscale_round_sd':
/usr/local/gnu-cross/lib/gcc/x86_64-linux-gnu/9.2.0/include/avx512fintrin.h:9156:11: error: cannot convert a value of type 'int' to vector type '__vector(2) double' which has different size
 9156 |           (__v2df) __B, __imm, __R);
      |           ^
/usr/local/gnu-cross/lib/gcc/x86_64-linux-gnu/9.2.0/include/avx512fintrin.h: In function '_mm_roundscale_ss':
/usr/local/gnu-cross/lib/gcc/x86_64-linux-gnu/9.2.0/include/avx512fintrin.h:14789:10: error: cannot convert a value of type 'int' to vector type '__vector(4) float' which has different size
14789 |          _MM_FROUND_CUR_DIRECTION);
      |          ^~~~~~~~~~~~~~~~~~~~~~~~
/usr/local/gnu-cross/lib/gcc/x86_64-linux-gnu/9.2.0/include/avx512fintrin.h: In function '_mm_roundscale_sd':
/usr/local/gnu-cross/lib/gcc/x86_64-linux-gnu/9.2.0/include/avx512fintrin.h:14798:10: error: cannot convert a value of type 'int' to vector type '__vector(2) double' which has different size
14798 |          _MM_FROUND_CUR_DIRECTION);
      |          ^~~~~~~~~~~~~~~~~~~~~~~~
make[2]: *** [/home/<user>/src/gnu_src/env-prep/preshing/build-glibc/sysd-rules:77: /home/<user>/src/gnu_src/env-prep/preshing/build-glibc/nptl/elision-lock.o] Error 1
make[2]: Leaving directory '/home/<user>/src/gnu_src/env-prep/preshing/glibc-2.32/nptl'
make[1]: *** [Makefile:470: nptl/subdir_lib] Error 2
make[1]: Leaving directory '/home/<user>/src/gnu_src/env-prep/preshing/glibc-2.32'
make: *** [Makefile:9: all] Error 2

我不确定如何修复此错误,并且我在网上找到了几乎没有关于它的信息。我认为在编译时禁用 AVX 可能会解决这个问题,但如果可能的话,我想远离它(我在编译 glibc 时也没有看到直接的方法)。

我正在构建的源代码的版本如下。我可以更改 glibc 版本,但其他版本需要保持不变(我正在比较特定于 GNU 和特定于 musl 的工具链)。

我的系统有gcc-10.2.1glibc-2.31

我的不同配置如下:

# binutils
../binutils-2.33.1/configure --prefix=/usr/local/gnu-cross --target=x86_64-linux-gnu --disable-multilib --enable-deterministic-archives --disable-separate-code --build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu --with-sysroot=/usr/local/gnu-cross/x86_64-linux-gnu

# gcc
../gcc-9.2.0/configure \
    --prefix=/usr/local/gnu-cross \
    --target=x86_64-linux-gnu \
    --build=x86_64-pc-linux-gnu \
    --host=x86_64-pc-linux-gnu \
    --with-sysroot=/usr/local/gnu-cross/x86_64-linux-gnu \
    --with-native-system-header-dir=/include \
    --enable-languages=c,c++                \
    --enable-default-pie                    \
    --disable-assembly                  \
    --disable-werror                    \
    --disable-multilib                  \
    --enable-tls                        \
    --disable-libmudflap                    \
    --disable-libsanitizer                  \
    --disable-gnu-indirect-function             \
    --disable-libmpx                    \
    --enable-libstdcxx-time=rt

# glibc
../glibc-2.32/configure --prefix=/usr/local/gnu-cross/x86_64-linux-gnu --build=x86_64-pc-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu --with-headers=/usr/local/gnu-cross/x86_64-linux-gnu/include --disable-multilib libc_cv_forced_unwind=yes

谢谢您的帮助!

更新

我尝试将我的配置选项回拨到上面链接的文章中的基本选项,但我仍然遇到相同的错误。这使我相信错误是由于缺少步骤或文章中列出的步骤已过时造成的。

标签: gcccross-compilinggnuglibcavx

解决方案


推荐阅读