我想了解.rdata
部分與.text
部分的含義。我想一個簡單的程序如下什麼時候放置在`.rdata`部分而不是`.text`部分?
int main()
{
const int a = 10;
printf("%d\n", a);
return 0;
}
當我建立並通過gcc -o a.out sample.c -Wl,Map,test.map
轉儲map
文件,然後搜索sample.o
,我發現下面的分配現在
.text 0x0040138c 0x34 sample.o
.data 0x00402000 0x0 sample.o
.rdata 0x00403064 0x8 sample.o
.eh_frame 0x00404060 0x38 sample.o
.bss 0x00405020 0x0 sample.o
,如果我稍微修改我的計劃使a
一個全局變量作爲
const int a = 10;
int main()
{
printf("%d\n", a);
return 0;
}
通過重複與上述相同的步驟,我觀察噸帽子的分配情況如下
.text 0x0040138c 0x2c sample.o
.data 0x00402000 0x0 sample.o
.rdata 0x00403064 0xc sample.o
.eh_frame 0x00404060 0x38 sample.o
.bss 0x00405020 0x0 sample.o
其中它清楚地表明a
被分配到.rdata
部分作爲
.rdata 0x00403064 0xc sample.o
0x00403064 a
從這些實驗,我明白global
const
被alocated爲.rdata
部分,而.text
節規模已經下降。因此,我假設a
被分配到第一個例子中的.text
部分。
我的問題是:當確定.rdata
或.text
它的位置
被認爲是
const
變量的範圍是什麼?從我的實驗中,我發現變量在分配到
.text
部分時需要8個字節,而在.rdata
部分中則需要4個字節。這種差異的原因是什麼?如果當地
const
變量太多,則相應的.text
部分的大小將顯着增加。在這種情況下推薦的編程習慣是什麼?
非常感謝提前。
感謝您提供非常豐富的回覆。我確實有幾點要澄清。其一,在我的問題中,與'.data'部分相比,變量位於'.rdata'部分。問題的主要目標是理解只讀部分的處理,即「.rdata」和「.text」。至於第1點,我相信'const',儘管我們可能通過類型轉換欺騙編譯器,但運行時會拋出異常。例如:http://cfiddle.net/zsPfEg。 – Ganesh
對不起另一個問題:你提到了PC相對尋址。在嵌入式系統中,我可能會靈活地將特定的代碼段加載到更快的存儲器(用於支持此功能的TI DSP-BIOS)。在這種情況下,如何處理偏移計算,因爲當前PC可能位於SDRAM中,而實際數據位於SRAM中? – Ganesh
關於SDRAM vs SRAM的問題超出了我的想象。其他人應該幫助你。我會假設常量表也將被移動到SDRAM。 –