.bss,.data,.text,.rodata
那天工作时候发现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) |
今天先到这里,准备睡觉了。
还有一些,栈,堆,还没有总结,明天再看看。