blackfin gcc-toolchain связывает математическую функцию ошибки, например atan2: неопределенная ссылка на watan2.o

У меня проблема с классической математической функцией, связывающей мою программу на чистом металле с компоновщиком цепочки инструментов blackfin. Я пробовал много вещей, но не понимаю, почему libm.a не предоставляет определения для используемой функции. Нужно ли добавлять дополнительную библиотеку? если да то какой?

Я поместил свой компоновщик с подробным описанием связанных библиотек и получил пример ошибки связывания.

Спасибо,

Уильям

bfin-elf-ld -v  -o test_ad1836_driver -T  coreb_test_ad1836_driver.lds  --just-symbol  ../../icc_core/icc queue.o ezkit_561.o  heap_2.o  port.o tasks.o test_ad1836_driver.o list.o croutine.o user_isr.o bfin_isr.o app_c.o context_sl_asm.o cycle_count.o CFFT_Rad4_NS_NBRev.o fir_decima.o fir_decima_spl.o math_tools.o -Ttext 0x3c00000   -L /opt/uClinux/bfin-elf/bfin-elf/lib -lbffastfp -lbfdsp -lg -lc -lm -Map=test_ad1836_driver.map 
argv[0]      = 'bfin-elf-ld'
bindir       = '/opt/uClinux/bfin-elf/bin/'
tooldir      = '/opt/uClinux/bfin-elf/bin/../bfin-elf/bin/'
linker       = '/opt/uClinux/bfin-elf/bin/../bfin-elf/bin/ld.real'
elf2flt      = '/opt/uClinux/bfin-elf/bin/../bfin-elf/bin/elf2flt'
nm           = '/opt/uClinux/bfin-elf/bin/../bfin-elf/bin/nm'
objdump      = '/opt/uClinux/bfin-elf/bin/bfin-elf-objdump'
objcopy      = '/opt/uClinux/bfin-elf/bin/bfin-elf-objcopy'
ldscriptpath = '/opt/uClinux/bfin-elf/bin/../bfin-elf/bin/../lib'
Invoking: '/opt/uClinux/bfin-elf/bin/../bfin-elf/bin/ld.real' '-v' '-o' 'test_ad1836_driver' '-T' 'coreb_test_ad1836_driver.lds' '--just-symbol' '../../icc_core/icc' 'queue.o' 'ezkit_561.o' 'heap_2.o' 'port.o' 'tasks.o' 'test_ad1836_driver.o' 'list.o' 'croutine.o' 'user_isr.o' 'bfin_isr.o' 'app_c.o' 'context_sl_asm.o' 'cycle_count.o' 'CFFT_Rad4_NS_NBRev.o' 'fir_decima.o' 'fir_decima_spl.o' 'math_tools.o' '-Ttext' '0x3c00000' '-L' '/opt/uClinux/bfin-elf/bfin-elf/lib' '-lbffastfp' '-lbfdsp' '-lg' '-lc' '-lm' '-Map=test_ad1836_driver.map'
GNU ld version 2.17
/opt/uClinux/bfin-elf/bfin-elf/lib/libm.a(w_atan2.o): In function `atan2':
/usr/src/packages/BUILD/blackfin-toolchain-2010R1/gcc-4.3/newlib/libm/math/w_atan2.c:96: undefined reference to `__eqdf2'
/usr/src/packages/BUILD/blackfin-toolchain-2010R1/gcc-4.3/newlib/libm/math/w_atan2.c:96: relocation truncated to fit: R_BFIN_PCREL24 against undefined symbol `__eqdf2'
.....
/opt/uClinux/bfin-elf/bfin-elf/lib/libm.a(e_sqrt.o): In function `_ieee754_sqrt':
/usr/src/packages/BUILD/blackfin-toolchain-2010R1/gcc-4.3/newlib/libm/math/e_sqrt.c:110: undefined reference to `__muldf3'
/usr/src/packages/BUILD/blackfin-toolchain-2010R1/gcc-4.3/newlib/libm/math/e_sqrt.c:110: undefined reference to `__adddf3'

.....
/opt/uClinux/bfin-elf/bfin-elf/lib/libm.a(s_atan.o): In function `atan':
/usr/src/packages/BUILD/blackfin-toolchain-2010R1/gcc-4.3/newlib/libm/math/s_atan.c:169: undefined reference to `__muldf3'
/usr/src/packages/BUILD/blackfin-toolchain-2010R1/gcc-4.3/newlib/libm/math/s_atan.c:170: undefined reference to `__muldf3'
/usr/src/packages/BUILD/blackfin-toolchain-2010R1/gcc-4.3/newlib/libm/math/s_atan.c:172: undefined reference to `__muldf3'

person william pagnon    schedule 29.11.2011    source источник


Ответы (3)


Добавьте -lgcc. Вам нужны функции для сравнения, сложения и умножения значений типа C double, соответственно, __eqdf2, __adddf3 и __muldf3.

Обычно я бы рекомендовал использовать драйвер компилятора (gcc) вместо прямого связывания с ld, даже для выходных данных типа прошивки/ядра, потому что первый позаботится о необходимых файлах запуска и библиотеках времени выполнения компилятора.

person chill    schedule 29.11.2011
comment
Привет, спасибо за ответ, я обычно также использую GCC для связи, к сожалению, я не смог сделать это с этим приложением из-за определенного отображения памяти. Раньше я несколько раз пытался просто заставить GCC скомпилировать и связать, но это не сработало. знаете ли вы, как добавить функции сравнения, сложения и умножения значений типа C double, соответственно, __eqdf2, __adddf3 и __muldf3 непосредственно в компоновщик? компоновщик bfin elf ld не принимает -lgcc только -lg - person william pagnon; 30.11.2011
comment
@williampagnon, что вы подразумеваете под не принимает -lgcc? Может быть, он не может найти его? Он должен быть в $gccdir/lib/gcc/$target/$version. - person chill; 30.11.2011
comment
Спасибо, я попробовал еще раз, и теперь это работает, не знаю почему, но я нашел исправление: у меня было: GNU ld версии 2.17 /opt/uClinux/bfin-elf/bin/../bfin-elf/bin/ld.real : не могу найти -lgcc. добавление папки библиотеки -L /opt/uClinux/bfin-elf/lib/gcc/bfin-elf/4.3.5/ решает проблему -lgcc - person william pagnon; 05.12.2011

Привет, я думаю, что знаю проблему, blackfin не очень совместим с математикой std lib. Именно поэтому в версии VDSP математические функции реализованы заново. Чтобы решить мою проблему, я преобразовал математическую библиотеку VDSP в gcc, и теперь она отлично компилируется.

Спасибо

person william pagnon    schedule 30.11.2011

На самом деле я нашел лучший ответ,

Blackfin действительно поддерживает стандартную математику. У меня просто был какой-то библиотечный флаг в неправильном порядке.

Для компоновщика используйте следующий порядок флагов lib, и он должен работать:

/opt/uClinux/bfin-elf/bin/../bfin-elf/bin/ld.real' '-v' '-o' .... '-L' '/opt/uClinux/bfin-elf/lib/gcc/bfin-elf/4.3.5/' '-lgcc' '-L' '/opt/uClinux/bfin-elf/bfin-elf/lib' '-lbfdsp' '-lg' '-lm' '-lbffastfp' '-lc' 
person william pagnon    schedule 05.12.2011