Сбой компиляции glibc из исходного кода в заголовках avx с: «не удается преобразовать значение типа x в векторный тип y, который имеет другой размер»

#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.