2013-05-12 47 views
0

如果我想所有的.o文件鏈接,除了z.o。所有的.o(無z.o)在0xC0000000的重新定位,而z.o是0xFFFF0000地址,但z.o位於文件偏移8000。
如何寫這個ld腳本?

So.how寫這個劇本的LD?

這裏是我的loader.lds

SECTIONS { 
    loader  0x00000000 : { start.o loader.o } 
    kloader  0x30100000 : AT(4096) { loaderk.o ../lib/klib.a } 
    vect  0xFFFF0000 : AT(0x4000) { high_vect.o } 
} 

這是正確的????

回答

1

如果你使用input sections要容易得多。只是使用文件名不是正常的方式來做到這一點。的問題是,在一些點源模塊將幀間的行爲,你將有代碼和/或數據從相同的模塊中使用的多個位置。因此,使部分裝載機kloaderVECT和使用gccattributes編譯指示放置代碼/數據部分。

你的問題在羚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,和相關鏈接到這個問題。

+0

**模塊**在這裏表示*源翻譯單元*。人們經常說一個程序*模塊*表示一個'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

+1

哦,對不起! z.o是high_vect.o,所以沒有重疊...... 是否意味着如果z。o文件之前使用過,它不會再被包含在* .o中? 我的ld腳本現在好了!!! 。感謝^ _^.. (看來我需要閱讀ld手冊)^ _ ^ – 2013-05-13 03:49:14