Wednesday, October 3, 2012

Linker的問題

最近Build Embedded System的程式,在寫Makefile的時候,有一個問題我竟然花了快1個小時才解決.


通常我們再寫大程式的時候(有許多程式),透過Makefile順利地將所有source code compile成計算機可以讀的OBJ檔.但是所有的obj檔要合併成一個真正的可執行檔則必須透過Linker的方式去重組裡面的程式位址(reloacation).


底下的指令是我原本寫的


$(LD) $^ -o sample.elf -nostartfiles $(LDFLAGS)

結果每次執行的結果

unreferenced to 'print'

類似這樣的錯誤訊息,這個錯誤訊息代表著你的程式裡面有用到外部的一個函式(不是在同一個檔案裡面),必須要參考到外部的函式的位址,這樣Linker程式才可以正確地算出所要呼叫的位址.
我都以為這樣的寫法沒有錯,害我以為是不是Linker的問題,還是其他問題.

結果我也不知道怎麼想的,我就把它的位置調整一下試試看
$(LD) -nostartfiles $^ -o sample.elf $(LDFLAGS)

再執行一次,竟然成功了!!

我想有可能Cross Compiler寫的沒有那麼smart.所以才會這樣!!

No comments: