微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我一直在尝试构建一个针对我的主机的 GNU 工具链(您可以将其称为交叉编译器或带有前缀的编译器)。我一直在关注 these instructions,但在我的一些配置选项和我的代码版本中与他们不同。我顺利完成了第 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,__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 的工具链)。

  • binutils-2.33.1
  • glibc-2.32
  • gcc-9.2.0
  • gmp-6.1.2
  • mpc-1.1.0
  • mpfr-4.0.2

我的系统有 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

感谢您的帮助!

更新

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。