2016-08-19 79 views
1

我可能太好奇或小心,但請考慮這一點:
如果我把例如一個數組放在一些部分 char buff[128] __attribute__((my_section)); 然後使用鏈接描述文件的地方,例如地址0x10004000, 我可以永遠確定,&buff[0]將永遠是0x10004000? (我正在考慮ARM公司的ARMCC(以前的RealView),以及基本的GCC工具鏈和GNU ARM開源。)可能會有buff偏移或填充,或者可能會放置一些服務(運行時,鏈接,特定鏈接)在0x10004000之前buff
另外,在這種情況下,C和C++之間是否有區別?因爲C++有「在後臺做更多的事情」。 :) 我可以提供任何形式的文件以及您的知識 - 非常感謝。ELF節填充

回答

0

是的,& buff [0]將始終爲0x10004000。您可以在Keil幫助文件的「編譯器用戶指南」一書中看到第9.46節。

char數組是c/C++的內聯對象。所以編譯器對c/C++做同樣的事情。

+0

這不完全正確。如果本節中有多個對象,則無法保證它們在內存中的排列順序,因此您可能需要在鏈接描述文件中專門設置地址。但是,當然,如果你保留這個部分只存儲這個緩衝區,那麼你很好。 –

+0

@ChristopheAugier是的。如果同一節中有很多對象,最好明確地使用對象地址。 –

+0

我認爲這並非總是如此。如果你創建了'.eeprom.my'節,並且從鏈接描述文件中指定該節在'.eeprom'節開始之後是100個字節,那麼鏈接器可以決定將'.eeprom.my'放在開頭如果沒有使用這些100字節,'.eeprom'。 –