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)

Если я правильно понимаю, то аппаратного FPU на Cortex-M3 нет.

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

Какой в точности версии тулчейн, он достаточно новый? Не совсем понимаю зачем wine, для STM32 я без проблем собираю прямо в Linux и через Makefile

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

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

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

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

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

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

mittorn ★★★★★
()

Да, кстати, статические либы это архивы. Ты можешь достать из libgcc.a только нужные объектники и влинковать их

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

Да, нужны. Производительность не важна. Вообще, я пробовал прописывать -lgcc, но это не помогло.

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

Я пробовал и с -lm и без него, результат одинаковый.

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

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

mittorn ★★★★★
()

Флаги компилятора — -mcpu=cortex-m3 -mthumb

А линкеру не забыл эти флаги?

(И вроде бы компилятор нужен arm-none-eabi?)

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

Автор тулчейна назвал его так. Разницы нет, код он генерит рабочий (только плавающая точка не работает).

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

Я уже расковыривал libgcc, там функции, отвечающие за дробные операции не реализованы.

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

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

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

firkax ★★★★★
()

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

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

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

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

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

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

Флаг -msoft-float ни на что не влияет, пробовал. Буду тогда ковырять опции сборки gcc.

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

gcc-4.3.0

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

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

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

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

На железке с soft-float операции с double медленнее, чем с float, а так всё нормально.

annulen ★★★★★
()

А можно взглянуть на команду линковки? А то на стэковерфлоу находится вопрос с похожей ошибкой, и там чувак линковал бинарник ld вместо gcc.

annulen ★★★★★
()

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

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

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

Под виндой можно проверить, но скорее всего не в этом дело, тем более без дробной арифметики всё нормально.

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

Я пробовал и с gcc, и с ld, с ld всё совсем плохо, тогда как с gcc проблема только с описанными выше функциями.

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

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

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

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

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

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

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

I-Love-Microsoft ★★★★★
()

Строки линковки с винды где всё собирается и линкуется (как я понял) и на Linux под Wine где сыпятся подобные ошибки сверь между собой.

EXL ★★★★★
()
Последнее исправление: EXL (всего исправлений: 1)
Ответ на: комментарий от EXL

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

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

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

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

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

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

anonymous
()

Ещё вопрос, каккая команда вызывается в качестве линковщика, я всегда указываю g++ с -wl…

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

В качестве команды линковки дёргается gcc.

Werenter ★★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.