那天工作時候發現build的時候發現問題,
問題內容是:.text的空間太小了。
我一直以為寫代碼,就真是弄懂代碼怎么寫,式樣書怎么寫,或者弄懂代碼的問題所在,
沒有想到在build的時候出現問題。結果就是被罵了,連這個你都不懂。
工作時間查了一下。
其實基本的概念還是懂的,但是被問到.text放的是什么東西的時候,就不明白。
其實網上有很多文章。我把我查找到的文章整理一下。不過說實話,國外的文章比較詳細。
國內的文章大多數是告訴,它們代表什么,而不說明由來。
1,為什么會產生各個文件(.bss,.data,.text,.rodata,堆,棧,常量段)
我們現在所使用的電腦,代碼都是存在內存上的
(估計有人罵人了,這不是廢話嗎。早期的電腦,很多都是依靠硬件完成的)
因為有內存的存儲特性(變數卸載rom上就不能更改了),
所以后來改成放在內存上(flash memory的rom也應該是可以的,但是估計是讀寫速度慢,所以沒有采用)。
但是如果全都寫在內存上,就會很混亂,容易發生問題。
程序-------> 程序加載器| ----------> Flash memory
| ----------> SDRAM
| ----------> BBRAM
為了是對文件讀取時候的方便(也有為了電腦成本降低),以便於調試器和鏈接器進行調試和鏈接。
2,系統是怎么識別數據,生成相對應的文件呢
根據文件生成區塊(section)時候內存的特性,來划分
特性:
_1,種類:
SHT_NULL | 無效的區塊 |
SHT_PROGBITS | 帶有數據(機械語和初始值等)的區塊 |
SHT_NOBITS | 不帶有數據 |
SHT_RELA | 帶有可再分配的數據(不依賴與內存的代碼)的區塊 |
SHT_REL | |
SHT_SYMTAB | 帶有符號表的區塊 |
_2,屬性:
SHF_ALLOC | 應該放在內存上的區塊 |
SHF_WRITE | 應該放在可讀寫區域的區塊 |
SHF_EXECINSTR | 應該放在可執行區域的區塊 |
_3,歸類
文件 | 種類 | 屬性 |
.bbs | SHT_NOBITS | SHF_ALLOC + SHF_WRITE |
.data | SHT_PROGBITS | SHF_ALLOC + SHF_WRITE |
.text | SHT_PROGBITS | SHF_ALLOC + SHF_EXECINSTR |
.rodata | SHT_PROGBITS | SHF_ALLOC |
說明 |
主要存放0或者無初始值的全局變量和0或者無初始值的靜態局部變量 |
主要存放初始值是0以外的全局變量和初始值為0以外的靜態局部變量 |
機械語跟代碼 |
字符串,或者定數(const) |
今天先到這里,准備睡覺了。
還有一些,棧,堆,還沒有總結,明天再看看。