избегание __uint128_t в libc при кросс-компиляции для 32-битных целей

Вопрос или проблема

Я пытаюсь собрать 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.

Рекомендации по решению

  1. Проверка заголовочных файлов: Обратите внимание на пути, из которых компилятор пытается включить sigcontext.h. Возможно, что файл с ошибками не соответствует ожиданиям 32-битного окружения. Постарайтесь убедиться, что вы используете правильные заголовочные файлы для вашей целевой платформы.

  2. Модификация конфигурации glibc: В конфигурации glibc может отсутствовать явная настройка, отключающая использование uint128_t. Попробуйте изменить конфигурацию, добавив флаг, исключающий использование 128-битных типов. Если такой опции нет, возможно, потребуется вручную отредактировать исходный код glibc, чтобы удалить или заменить любые отсылки к __uint128_t на более подходящие для 32-битных архитектур типы данных (например, uint64_t или __uint32_t).

  3. Использование альтернативных заголовочных файлов: Попробуйте найти или создать альтернативные заголовочные файлы, которые не требуют __uint128_t, или измените существующие на основании требований 32-битной архитектуры. Это может потребовать значительных усилий, но может решить проблему на уровне компиляции.

  4. Проверка версий инструментов: Убедитесь, что используемые вами версии gcc и glibc совместимы между собой, и что актуальные патчи, исправления и изменения были применены. Конфликт версий может представлять собой источник ошибок.

  5. Кросс-компиляция с использованием специальных флагов: Попробуйте использовать дополнительные флаги кросс-компиляции, чтобы указать, что вы не планируете использовать 128-битные типы. Например, установите -D__SIZEOF_INT128__=0 в опциях компилятора. Это может помочь скомпилировать бинарные файлы, не требуя 128-битных типов.

В заключение

Сборка glibc для 32-битных целевых архитектур может быть сложной задачей, особенно когда дело касается поддержки типов данных, специфичных для 64-битных систем. Внимание к деталям в конфигурации, использование правильных заголовочных файлов и модификация исходного кода в нужных местах могут значительно облегчить процесс компиляции. Если ни одно из предложенных решений не помогло, рекомендуется обратиться к сообществу разработчиков функции кросс-компиляции, где можно получить советы и поддержку от более опытных участников.

Оцените материал
Добавить комментарий

Капча загружается...