2011-11-29 53 views
0

我有一個經典的數學函數連接我的裸機程序與blackfin工具鏈連接器的問題。我嘗試了很多東西,但我不明白爲什麼libm.a沒有提供它使用的函數的定義。我需要添加一個額外的庫嗎?如果是的,哪一個?blackfin gcc-toolchain鏈接錯誤數學函數像atan2:未定義的參考...在watan2.o

我已經把鏈接器詳細lign與鏈接庫和示例鏈接錯誤我得到了。

感謝,

威廉

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' 

回答

1

添加-lgcc。您需要分別比較,添加和乘以C double類型值的函數,即__eqdf2,__adddf3__muldf3

通常,我會推薦使用編譯器驅動程序(gcc),而不是直接鏈接到ld,即使是固件/內核類型的輸出,因爲前者會照顧必要的啓動文件和編譯器運行時庫。

+0

嗨,感謝您的回答,我一般用GCC來鏈接不幸,以及我一直沒能做到所以這個應用程序由於特定的內存映射。我已經嘗試過幾次,只是讓GCC編譯和鏈接,但沒有奏效。您是否知道如何在鏈接器中直接添加「函數來分別比較,添加和相乘C double類型的值,__eqdf2,__adddf3和__muldf3」? bfin elf ld鏈接器不接受-lgcc -lg –

+0

@williampagnon,你是什麼意思「不接受-lgcc」?也許它找不到它?它應該在'$ gccdir/lib/gcc/$ target/$ version'中。 – chill

+0

謝謝,我再次嘗試,現在它工作,不知道爲什麼,但我找到了修復:我有: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的問題 –

0

嗨我想我知道這個問題,blackfin是不是真的與數學std lib兼容。這就是爲什麼在VDSP版本中數學功能被重新實施。爲了解決我的問題,我將VDSP數學庫轉換爲gcc,現在編譯好了。

感謝

0

其實我發現了一個更好的答案,

Blackfin處理器確實在事實上支持STD數學。我錯誤地訂購了一些庫標誌。

爲連接器,使用下面的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' 
相關問題