如果你使用input sections要容易得多。只是使用文件名不是正常的方式來做到這一點。的問題是,在一些點源模塊將幀間的行爲,你將有代碼和/或數據從相同的模塊中使用的多個位置。因此,使部分裝載機,kloader和VECT和使用gcc
attributes或編譯指示放置代碼/數據部分。
你的問題在羚ld的Input section example回答。輸出部分列表不一定要按內存順序排列。放置通配符{ *.o(.text*) }
最後,不匹配的輸入對象將放置在此部分。
一個例子標註的功能可能看起來像,
void data_abort(unsigned int fsr, void* fault) __attribute__ ((section ("vector)))
通常功能/不同部分的數據必須合作,這樣能夠給他們的同一個源文件中混合使用,編譯器可以對static
進行優化項目並將功能相似的項目組合在一起,即使它們可能位於不同的部分。
我想這可能一般遵循你的要求是什麼。
SECTIONS {
loader 0x00000000 : { start.o loader.o }
kloader 0x30100000 : AT(4096) { loaderk.o ../lib/klib.a }
vect 0xFFFF0000 : AT(0x4000) { high_vect.o }
vect2 0xFFFF0000 : AT(0x8000) { z.o } /* overlay? */
text 0xC0000000 : { *.o }
}
我不確定您是否打算重疊載體。您可以使用一些數據表覆蓋init
代碼。通常情況下,您希望至少分開.text
,.data
和.bss
。
總是產生映射文件和雙重檢查地址在那裏。這比加載和測試代碼以確定某些東西被放置在錯誤的地址要快得多。
請參閱:Running code from RAM,Gnu Linker giving unexpected address,和相關鏈接到這個問題。
**模塊**在這裏表示*源翻譯單元*。人們經常說一個程序*模塊*表示一個'C'文件。可能這個例子不會按原樣工作。對於*覆蓋*,我只是在鏈接器文件中作弊並定義符號。例如'sections {.mmu_table =。; .init:{*(.init)}}'。 Bss清除,io-muxing等可以放在'.init'部分,它可以方便地對齊MMU表,但是不能重新使用'reset'代碼。請參閱[覆蓋層描述](http://sourceware.org/binutils/docs/ld/Overlay-Description.html),瞭解* real *的方法。 – 2013-05-13 01:11:15
哦,對不起! z.o是high_vect.o,所以沒有重疊...... 是否意味着如果z。o文件之前使用過,它不會再被包含在* .o中? 我的ld腳本現在好了!!! 。感謝^ _^.. (看來我需要閱讀ld手冊)^ _ ^ – 2013-05-13 03:49:14