LINUX.ORG.RU

Неправильная сборка кросс-компилятора под thumb2 (armv7)

 , , ,


1

2

Собрал своими силами toolchain для кросс-компиляции под Cortex-A7 (armv7-a). Думаю собрать собственную сборку дистрибьютива под Cubietruck, который использует hard fpu (аппаратную обработку операций с плавающей точкой).

Первая и вторая стадии компиляции gcc проходят без ошибок, аналогично собирается glibc с помощью gcc первой стадии.

Компиляторам на этапе сборки передаются явно параметры:

--with-arch=armv7-a --with-tune=cortex-a7 --with-float=hard --with-abi=aapcs-linux --with-fpu=neon-vfpv4 --with-mode=thumb"
с помощью которых, как я полагаю, должен генерироваться код инструкций thumb2. Также на этапе сборки glibc передаю те же параметры через:
CFLAGS="-march=armv7-a -mtune=cortex-a7 -mfloat-abi=hard -mabi=aapcs-linux -mfpu=neon-vfpv4 -mthumb -O2 -Wa,-mthumb -Wa,-mimplicit-it=thumb"
В итоге, собирая этим toolchain'ом библиотеку gmp выдается ошибка вида:
In file included from /opt/cross/tools/arm-cortexa7hf-linux-gnueabi/include/features.h:389:0,
                 from /opt/cross/tools/arm-cortexa7hf-linux-gnueabi/include/stdio.h:27,
                 from ./gmp-6.0.0/gen-fac.c:31:
/opt/cross/tools/arm-cortexa7hf-linux-gnueabi/include/gnu/stubs.h:7:29: fatal error: gnu/stubs-soft.h: No such file or directory
compilation terminated.
In file included from /opt/cross/tools/arm-cortexa7hf-linux-gnueabi/include/features.h:389:0,
                 from /opt/cross/tools/arm-cortexa7hf-linux-gnueabi/include/stdio.h:27,
                 from ./gmp-6.0.0/gen-fib.c:31:
/opt/cross/tools/arm-cortexa7hf-linux-gnueabi/include/gnu/stubs.h:7:29: fatal error: gnu/stubs-soft.h: No such file or directory
make: *** [gen-fac] Error 1
make: *** Waiting for unfinished jobs....
compilation terminated.
In file included from /opt/cross/tools/arm-cortexa7hf-linux-gnueabi/include/features.h:389:0,
                 from /opt/cross/tools/arm-cortexa7hf-linux-gnueabi/include/assert.h:35,
                 from ./gmp-6.0.0/mini-gmp/mini-gmp.c:44,
                 from ./gmp-6.0.0/bootstrap.c:32,
                 from ./gmp-6.0.0/gen-bases.c:32:
/opt/cross/tools/arm-cortexa7hf-linux-gnueabi/include/gnu/stubs.h:7:29: fatal error: gnu/stubs-soft.h: No such file or directory
compilation terminated.
make: *** [gen-fib] Error 1
make: *** [gen-bases] Error 1
In file included from /opt/cross/tools/arm-cortexa7hf-linux-gnueabi/include/features.h:389:0,
                 from /opt/cross/tools/arm-cortexa7hf-linux-gnueabi/include/stdlib.h:24,
                 from ./gmp-6.0.0/gen-trialdivtab.c:48:
/opt/cross/tools/arm-cortexa7hf-linux-gnueabi/include/gnu/stubs.h:7:29: fatal error: gnu/stubs-soft.h: No such file or directory
compilation terminated.
make: *** [gen-trialdivtab] Error 1

Ранее, экспериментировав с различными параметрами, обнаружил следующее:

  • Без указания float-abi=hard генерируется как раз таки soft float point.
  • Явно генерируется thumb1, а не thumb2, хотя ассеблеру я передаю -mimplicit-it=thumb, что по различной документации требуется для генерации именно thumb2.

Что идет не так? Подскажите, кто знает, как генерировать правильно код thumb2.
Я делаю что-то не так или gcc об этом не знает.

По определению armv7-a и cortex-a7 - это обязательно thumb2 и возможность использования hard float point.


Ответ на: комментарий от SZT

Знаю что есть, пробовал, но в серьёз не использовал. Хочу свое, потому и задал этот вопрос, надеясь, что найдутся люди которые делали сами что-то подобное и сталкивались со подобной сборкой вручную. На крайний случай буду копаться в исходниках crosstools-ng, хотя поможет ли мне это копание, не факт.

dmnord
() автор топика
Ответ на: комментарий от dmnord

В гугле по такому запросу https://www.google.com/search?q=stubs.h fatal error stubs-soft.h: No such fil... много полезного находится

А вообще, не вижу смысла вручную все собирать, когда есть всякие готовые рецепты, вроде crosstools-ng, OpenEmbedded

SZT ★★★★★
()
Последнее исправление: SZT (всего исправлений: 1)

Рапортую, что ошибка пропала, как только убрал из скрипта вот эти строки:

export C_INCLUDE_PATH="/opt/cross/tools/arm-cortexa7hf-linux-gnueabi/include"
export CPLUS_INCLUDE_PATH="/opt/cross/tools/arm-cortexa7hf-linux-gnueabi/include"
Не знаю почему, но
$ ls /opt/cross/tools/arm-cortexa7hf-linux-gnueabi/include/gnu/
libc-version.h  lib-names.h  lib-names-hard.h  stubs.h  stubs-hard.h
Получается, не понимаю правильного смысла этих переменных окружения.

Остается вопрос - как проверить какой код транслирует ассемблер?

dmnord
() автор топика
Ответ на: комментарий от dmnord

Остается вопрос - как проверить какой код транслирует ассемблер?

Опция -S в gcc заставит компилятор выдать код на ассемблере

SZT ★★★★★
()

Тоже когда-то была такая проблема, решилась явным указанием hardfloat и/или thumb2 библиотек gcc при линковке.

Rupricht ★★
()
Ответ на: комментарий от Rupricht

Вот как раз я и ставлю эти флаги при сборке программ и библиотек явно. Только вот поможет ли это. При сборке binutils я вижу, к примеру, что некоторые объектные файлы называются arm* и thumb1*, про thumb2 и речи нет. Хотя в разных документах пишут что нужно использовать именно флаги которые я указываю. Значит на имена файлов не стоит обращать внимания. Разработчики gcc лучше бы явно добавили параметр --with-mode=thumb2, чтобы такие как я не сомневалтсь линий раз :)

dmnord
() автор топика
Ответ на: комментарий от Rupricht

На гитхабе нашел репозитарий с аналогичным моему скриптом, единственное чем он отличается от моего так это опция -D__thumb2__. Думаю, что все будет нормально собираться.

А пока что, я думаю какие пакеты необходимы для минимального arm-дистрибьютива. Буду анализировать, изучать готовые системы. Время покажет.

По поводу linaro - еще подумаю.

dmnord
() автор топика
Ответ на: комментарий от dmnord

А пока что, я думаю какие пакеты необходимы для минимального arm-дистрибьютива. Буду анализировать, изучать готовые системы. Время покажет.

Минимальный: linux, uclibc, busybox, zlib, какой-нить велик для init скриптов и структуры файловой системы + может еще dropbear.

m0rph ★★★★★
()
Ответ на: комментарий от teod0r

Ну первым делом, советую сделать все как описано на clfs.org. Вторым - разобрать make-файлы от buildroot. Параллельно всему, лучше пиши скрипт, так будет проще если вдруг наткнёшься на ошибки, а их в кросс-компиляции просто как грязи.
Свой скрипт я так и не довел пока до ума, как сделаю обязательно выложу на github.
Все HOWTO в сети, которые я находил либо не полные, либо старые. На них можно лишь опираться, воспроизводить их бесполезно. Компоненты тулчейна постоянно улучшаются, и некоторые последовательности действий уже делать необязательно.
Как-то так!

dmnord
() автор топика
Ответ на: комментарий от m0rph

какой-нить велик для init скриптов

а какие бывают велики? systemd или systemV? какие реализации можно использовать? знаю что в генту что-то там легкое велосипедное есть...

dmnord
() автор топика
Ответ на: комментарий от dmnord

Я в аналогичной ситуации велосипедил свой. Ну сам init у меня был от busybox, а вот скрипты, произовдящие нужные действия при запуске/выключении (монтирование файловых систем, загрузка модулей, загрузка скриптов-сервисов) писал сам, вдохновляясь арчевским примером (тогда еще не было systemd).

m0rph ★★★★★
()
Ответ на: комментарий от m0rph

Подскажи пожалуйста, ты наверное уже это все проходил!
Почему так происходит?
При выполнении вот такой команды, компиляция проходит как положено:

${GCCBIN} -g -O2 -pedantic ${GCCARGS} -o test3-bin test3.c
А при выполнении такой команды выдается ошибка:
${GCCBIN} -g -O2 -pedantic ${GCCARGS} -I/usr/include -L/usr/lib -o test3-bin test3.c
Пробовал подставлять в каждую команду явно указание на sysroot:
--sysroot=${SYSROOT} -Wl,--sysroot=${SYSROOT}
И при этом никакого эфекта. Параметры sysroot игнорируются?
Компилятор GCC и утилиты Binutils собраны с параметром --with-sysroot=${SYSROOT}. Я предполагаю это на основании сообщения об ошибке, в котором gcc мне говорит, что не может найти файл stubs/stubs-32.h, который лежит в не sysroot, а в корневой (build) директории (AMD64/x86_64), при этом запрашиваются заголовки 32-битной системы (ARM). В компилируемом коде я указываю заголовочный файл, который отличается в основной build и host-директориях:
#include <limits.h>
По сути команды тестовые. На самом деле я компилирю в данный момент mpfr, которому на этапе конфигурации подставляю параметр --with-gmp=/usr, наивно полагая, что /usr будет искаться внутри sysroot-директории. Убирая этот параметр из скрипта конфигурации компиляция идет без проблем (из-за того, что параметры -I/usr/include и -L/usr/lib к параметрам gcc не подставляются).

dmnord
() автор топика
Ответ на: комментарий от dmnord

А какая выдается ошибка?
Я собирал gcc без sysroot и с soft float (микроконтроллер не умел плавающую точку аппаратно).

m0rph ★★★★★
()
Ответ на: комментарий от m0rph
In file included from /usr/include/features.h:389:0,
                 from /usr/include/stdio.h:27,
                 from test3.c:10:
/usr/include/gnu/stubs.h:7:27: fatal error: gnu/stubs-32.h: No such file or directory
compilation terminated.

У меня есть поддержка sysroot. Для всех исходников, которые я устанавливаю в sysroot, указываю prefix=/usr и при указании make install использую DESTDIR.

dmnord
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.