.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)

今天先到这里,准备睡觉了。

还有一些,栈,堆,还没有总结,明天再看看。

原文地址:https://www.cnblogs.com/a364506875/p/4370344.html