星期四, 3月 30, 2006

gcc linker loader (ld) 的問題 - linker option 與object 的次序

或是說...g++ 和 gcc 的linker 不同..

為了這個搞了一天... Q___Q


原來是用arm-elf-g++ 作compiler, linker。

link時出現..
undefined reference to `Fill(RKK *, long, long, unsigned long, unsigned long, unsigned long)'
但是明明就在library裏呀,更奇妙的是另一個libray中call這個Fill的function竟然可以 正常link。
直接call Fill 就會有這個錯...

只好把相關source file都copy到local folder,重新寫一個minimum function。link obj file。
的確是發現使用時,有一些type convertion。加入cast後,就OK了。

但是... sample code為什麼就OK ??

所以...發現sample code用gcc作 compiler, linker。我用g++。
也改g++後,這個"undefined reference to.." 的error消失了。
改出現.."undefined reference to pow".. 這個只要加上math library : -lm 就OK了。

發現是compiler的關係,不是linker的關係。

用gcc作compiler ,compile出來的object code,link 就沒有 Fill ( )找不到的問題。
用g++作linker,就不會有 pow function 找不到的問題。




這大概是因為 g++ 的type check比較嚴謹。尤其 function argument上。

還有一點要注意的:

在修改Makefile的過程中,雖然一度曾經修改成正確的格式。但是一樣make fail。
這是因為前一次make fail 留下的*.elf, *.elf2flt 未刪除。造成linker只有拿elf, elf2flt作strip 的動作。沒有重新從obj --> elf.

所以要記得,要刪除這些未成工的file (或是把Makefile也加入dependency中)。

2 則留言:

jserv 提到...

well,會不會是因為部份 object code 的 symbol 已被 C++ name mangling 過了,所以會有找不到 reference 的問題呢?

-j

CheckoBlog 提到...

嗯,很可能喔。
記得以前C++的教科書中有說...多型的function會在function後加上argument typ2。
但是我用nm 列出obj 中所有的symble,卻沒有看到function name被改掉,真是奇怪呀。

網誌存檔