LINUX.ORG.RU

Проблемы с линковкой libm на arm-eabi-gcc-4.3.0

 , , , ,


0

2

Пытаюсь скомпилировать проект. Если обходиться целочисленной арифметикой, то всё хорошо. Но если попытаться притащить libm или произвести операции с плавающей точкой получаем вот это:

APP/src/main.c:33: undefined reference to `__aeabi_i2d'
APP/src/main.c:34: undefined reference to `__aeabi_i2d'
APP/src/main.c:34: undefined reference to `__aeabi_d2iz'
z:/home/alex/soft/winarm/bin/../lib/gcc/arm-eabi/4.3.0/../../../../arm-eabi/lib/thumb2\libm.a(lib_a-w_sqrt.o): In function `sqrt':
c:\winarms\build\gcc-build\arm-eabi\thumb2\newlib\libm\math/../../../../../../gcc-4.3.0/newlib/libm/math/w_sqrt.c:71: undefined reference to `__aeabi_dcmplt'
c:\winarms\build\gcc-build\arm-eabi\thumb2\newlib\libm\math/../../../../../../gcc-4.3.0/newlib/libm/math/w_sqrt.c:79: undefined reference to `__aeabi_ddiv'
c:\winarms\build\gcc-build\arm-eabi\thumb2\newlib\libm\math/../../../../../../gcc-4.3.0/newlib/libm/math/w_sqrt.c:83: undefined reference to `__errno'
c:\winarms\build\gcc-build\arm-eabi\thumb2\newlib\libm\math/../../../../../../gcc-4.3.0/newlib/libm/math/w_sqrt.c:86: undefined reference to `__errno'
z:/home/alex/soft/winarm/bin/../lib/gcc/arm-eabi/4.3.0/../../../../arm-eabi/lib/thumb2\libm.a(lib_a-e_sqrt.o): In function `__ieee754_sqrt':
c:\winarms\build\gcc-build\arm-eabi\thumb2\newlib\libm\math/../../../../../../gcc-4.3.0/newlib/libm/math/e_sqrt.c:110: undefined reference to `__aeabi_dmul'
c:\winarms\build\gcc-build\arm-eabi\thumb2\newlib\libm\math/../../../../../../gcc-4.3.0/newlib/libm/math/e_sqrt.c:110: undefined reference to `__aeabi_dadd'
c:\winarms\build\gcc-build\arm-eabi\thumb2\newlib\libm\math/../../../../../../gcc-4.3.0/newlib/libm/math/e_sqrt.c:117: undefined reference to `__aeabi_dsub'
c:\winarms\build\gcc-build\arm-eabi\thumb2\newlib\libm\math/../../../../../../gcc-4.3.0/newlib/libm/math/e_sqrt.c:117: undefined reference to `__aeabi_ddiv'
collect2: ld returned 1 exit status
make: *** [Makefile:67: CM530.elf] Ошибка 1

Контроллер - STM32F103RE. Флаги компилятора — -mcpu=cortex-m3 -mthumb -Wall -g -Os.

Сменить тулчейн возможности нет (точнее она есть, но другие тулчейны тупо не компилируют говнокод производителя железки (точнее компилируют, но оно не работает при этом)). При этом тулчейн вендовый, поэтому приходится запускать под wine. Под wine тулчейн работает нормально, поэтому проблема явно не в этом.

Куда копать?

★★★

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

Ответ на: комментарий от I-Love-Microsoft

Я достаточно подробно всё описал. Говнокод производителя железки отказывается работать под другим тулчейном. А по версии — наоборот всё дико древнее, тут gcc-4.3.0

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

И железка несколько отличается от простого STM32, как минимум к ней требуется другой скрипт линкера и другие настройки таблицы прерываний.

Werenter ★★★
() автор топика

Реализация aeabi функций обычно находится в libgcc.
Однако конечно стоит задумываться, сильно ли тебе нужны операции с плавающей точкой и деление на MCU? Иногда без этого правда можно обойтись

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

возьми libgcc из другого тулчейна с 4.3.0, погрепай там нужные функции и подсунь сразу объектики.
Некоторые функции можно вообще попробовать застабить

mittorn ★★★★★
()

но другие тулчейны тупо не компилируют говнокод производителя железки (точнее компилируют, но оно не работает при этом

Так этот тоже не компилирует, в чём разница?

firkax ★★★★★
()

Сменить тулчейн возможности нет (точнее она есть, но другие тулчейны тупо не компилируют говнокод производителя железки (точнее компилируют, но оно не работает при этом))

Я думаю, ты просто компилируешь тулчейн не с теми опциями, как в оригинале (их можно посмотреть, например, в gcc -###). Запускать gcc через wine — это, конечно, изврат, и тем более для такой попсовой целевой архитектуры.

Поддерживаю вариант с -msoft-float.

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

Ну если double там какая-то либа его использует, то не факт, что удастся заменить на float. А если даже удастся, то, теоретически, может точности не хватить — мы же не знаем, что они там считают.

annulen ★★★★★
()

gcc-4.3.0

Господи! Но вообще, проблема в том, что при сборке с -ffreestanding gcc не линкует libgcc (разрабы GCC говорят что это фишка), где все эти функции живут. Соответственно, тебе нужно сунуть -static-libgcc -lgcc в флаги сборки.

другие тулчейны тупо не компилируют говнокод производителя железки (точнее компилируют, но оно не работает при этом)

лол сишное уб опять портит всем жизнь хахахахахахахах

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

При этом тулчейн вендовый, поэтому приходится запускать под wine. Под wine тулчейн работает нормально, поэтому проблема явно не в этом.

Имелось в виду, что под windows работает нормально? Тогда это какие-то вайнопроблемы, например, какой-то файл линкскрипта по нужному пути не находится или что-то в этом роде

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

Походу gcc собран без поддержки soft-float, видимо остаётся либо забить (пользоваться только целочисленной арифметикой), либо ковырять параметры сборки gcc и таки собрать свой тулчейн, который будет работать.

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

Если что, для сборки тулчейна есть смысл использовать buildroot или специализированные инструменты вроде crosstool-ng, вручную всё собирать слишком геморно.

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

Плавучка хороша там где требуются шальные степени типа 2 в сотой степени, или где требуется легкое масштабирование при помощи суммы той же экспоненты

Я бы вообще не заморачивался float, часто работаю с fixed point

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от EXL

Под виндой не проверял, но скорее всего тоже не будет работать. Возможно я не точно выразился. Работает, если не использовать плавающую точку. Как я понял, в libgcc тупо нет нужных функций (смотрел через nm).

Werenter ★★★
() автор топика

Ты линкуешь не ту версию libm, вот описание аналогичной проблемы https://stackoverflow.com/questions/40934348/cant-resolve-symbol-aeabi-d2iz

Под видной постоянно проблемы с путями к либам и заголовкам.

Найди правильную версию либы и линкуй с ней. Вместо -lm укажи какой, конкретно файл шинковать.

мимо-школьник-кун

anonymous
()