gcc - 从源代码编译 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 的工具链)。
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.1
和glibc-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
谢谢您的帮助!
更新
我尝试将我的配置选项回拨到上面链接的文章中的基本选项,但我仍然遇到相同的错误。这使我相信错误是由于缺少步骤或文章中列出的步骤已过时造成的。
解决方案
推荐阅读
- ios - 设置两种颜色的视图,如条形图不能快速工作
- python - 如何在 Keras 中添加常量张量?
- wordpress - 如何在旧版本仍然存在的情况下从头开始创建一个新的 Wordpress 网站?
- c# - 在应用程序启动时进行验证并在验证执行时刷新列表视图
- php - Symfony3/Doctrine : ORDER BY CASE / 具体值优先
- scala - Scala:ObjectMapper 无法将 JSON 映射到成员类
- linux - 克隆文件夹/袭击文件夹?
- jsx - 古腾堡块获取最近的页面
- swift - 是否可以从 mapKit 中获取纬度和经度并在谷歌地图中使用它?
- javascript - 使用 Puppeteer 拦截请求时如何获取原始编码响应大小?