#gcc #cross-compiling #gnu #glibc #avx
#gcc #перекрестная компиляция #gnu #glibc #avx
Вопрос:
Я пытался создать набор инструментов 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
Спасибо за вашу помощь!
Обновить
Я попытался вернуть свои параметры настройки к базовым в статье, приведенной выше, но я все еще получаю те же ошибки. Это наводит меня на мысль, что ошибки являются результатом пропущенного шага или что шаги, изложенные в статье, устарели.
Комментарии:
1.
cannot convert a value of type 'int'
обычно означаетint
, что исходило из неявного объявления. т. е. В вашем заголовке отсутствовало объявление чего-то, что он пытался использовать, или в вашей версии GCC отсутствует__builtin_ia32_...
функция, которую заголовок предполагал доступной. Это может быть проблемой при попытке скомпилировать новые заголовки GCC с использованием более старого узла GCC? Может быть, вам следует использовать заголовки вашего хоста GCC, а не кросс-заголовки, для этого шага? IDK, я не создал кросс-GCC.2. Спасибо за ответ @PeterCordes, я попытался использовать что-то похожее на статью, о которой я упоминал: gist.github.com/stahta01/5d799d54069b851c7678b443efea25c6 и это, казалось, работало нормально. Мне интересно, помогла ли эта строка
sed -i 's/.oS)/.oZ)/g' nptl/Makefile
(выполняется в исходном каталоге glibc).3. Также мой хост GCC — это v10, тогда как я компилирую GCC9.