Вопрос или проблема
Я пытаюсь собрать 32-битную инструментальную цепочку в контейнере Docker с архитектурой aarch64. Я явно указал –without-long-double-128 в моем первом проходе gcc, но glibc не может скомпилироваться из-за отсутствия типов __uint128_t. Я просмотрел параметры конфигурации libc, и не вижу способа явно избежать этих типов. Кто-нибудь знает, как это обойти?
Первая ошибка
1.504 /opt/usr/include/asm/sigcontext.h:81:9: ошибка: неизвестное имя типа '__uint128_t'; вы имели в виду '__uint32_t'?
1.504 81 | __uint128_t vregs[32];
1.504 | ^~~~~~~~~~~
1.504 | __uint32_t
1.514 В файле, включенном из ../sysdeps/unix/sysv/linux/powerpc/sys/user.h:24,
1.514 из ../sysdeps/unix/sysv/linux/sys/procfs.h:35,
1.514 из ../sysdeps/nptl/thread_db.h:28,
1.514 из ../nptl/descr.h:31:
Конфигурация первого прохода GCC
RUN mkdir -p ${WORKROOT}/src/gcc/build
WORKDIR ${WORKROOT}/src/gcc/build
RUN ../configure --prefix=${WORKROOT}/tools \
--target=powerpc-linux-gnu \
--with-sysroot=${WORKROOT} \
--with-newlib \
--without-headers \
--enable-initfini-array \
--enable-default-pie \
--enable-default-ssp \
--disable-nls \
--disable-shared \
--disable-multilib \
--disable-decimal-float \
--disable-threads \
--disable-libatomic \
--disable-libgomp \
--disable-libquadmath \
--disable-libssp \
--disable-libvtv \
--disable-libstdcxx \
--disable-gcov \
--without-long-double-128 \
--enable-languages=c,c++
Конфигурация glibc
RUN ../configure \
--prefix=/usr \
--host=powerpc-linux-gnu \
--build=$(../scripts/config.guess) \
--enable-kernel=4.14 \
--with-headers=${WORKROOT}/usr/include \
libc_cv_slibdir=/usr/lib
Ответ или решение
Сложность, с которой вы столкнулись при сборке glibc для 32-битных целевых систем, связана с отсутствием типа __uint128_t в средах, не поддерживающих 128-битные целые числа. В данном случае вы собираете инструментальную цепочку для архитектуры aarch64 на основе архитектуры PowerPC, и использование этого типа может вызывать ошибки компиляции.
Причины проблемы
Тип __uint128_t является 128-битным целым, который поддерживается только в 64-битных системах и при использовании компиляторов, которые могут работать с 128-битными числами. Попытка использовать этот тип в вашем проекте для 32-битной архитектуры приводит к ошибкам компиляции, так как в заголовковых файлах glibc или в используемых системных заготовках требуется данный тип, несмотря на указание --without-long-double-128
.
Рекомендации по решению
-
Проверка заголовочных файлов: Обратите внимание на пути, из которых компилятор пытается включить
sigcontext.h
. Возможно, что файл с ошибками не соответствует ожиданиям 32-битного окружения. Постарайтесь убедиться, что вы используете правильные заголовочные файлы для вашей целевой платформы. -
Модификация конфигурации glibc: В конфигурации glibc может отсутствовать явная настройка, отключающая использование uint128_t. Попробуйте изменить конфигурацию, добавив флаг, исключающий использование 128-битных типов. Если такой опции нет, возможно, потребуется вручную отредактировать исходный код glibc, чтобы удалить или заменить любые отсылки к __uint128_t на более подходящие для 32-битных архитектур типы данных (например, uint64_t или __uint32_t).
-
Использование альтернативных заголовочных файлов: Попробуйте найти или создать альтернативные заголовочные файлы, которые не требуют __uint128_t, или измените существующие на основании требований 32-битной архитектуры. Это может потребовать значительных усилий, но может решить проблему на уровне компиляции.
-
Проверка версий инструментов: Убедитесь, что используемые вами версии gcc и glibc совместимы между собой, и что актуальные патчи, исправления и изменения были применены. Конфликт версий может представлять собой источник ошибок.
-
Кросс-компиляция с использованием специальных флагов: Попробуйте использовать дополнительные флаги кросс-компиляции, чтобы указать, что вы не планируете использовать 128-битные типы. Например, установите
-D__SIZEOF_INT128__=0
в опциях компилятора. Это может помочь скомпилировать бинарные файлы, не требуя 128-битных типов.
В заключение
Сборка glibc для 32-битных целевых архитектур может быть сложной задачей, особенно когда дело касается поддержки типов данных, специфичных для 64-битных систем. Внимание к деталям в конфигурации, использование правильных заголовочных файлов и модификация исходного кода в нужных местах могут значительно облегчить процесс компиляции. Если ни одно из предложенных решений не помогло, рекомендуется обратиться к сообществу разработчиков функции кросс-компиляции, где можно получить советы и поддержку от более опытных участников.