什么时候变量放在`.rdata`部分而不是`.text`部分?

前端之家收集整理的这篇文章主要介绍了什么时候变量放在`.rdata`部分而不是`.text`部分?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图理解.rdata section vs .text section的含义.我正在尝试一个简单的程序,如下所示
  1. int main()
  2. {
  3. const int a = 10;
  4. printf("%d\n",a);
  5. return 0;
  6. }

当我通过gcc -o a.out sample.c -Wl,Map,test.map构建并转储地图文件搜索sample.o时,我发现以下分配

  1. .text 0x0040138c 0x34 sample.o
  2. .data 0x00402000 0x0 sample.o
  3. .rdata 0x00403064 0x8 sample.o
  4. .eh_frame 0x00404060 0x38 sample.o
  5. .bss 0x00405020 0x0 sample.o

现在,如果我稍微修改我的程序以创建一个全局变量

  1. const int a = 10;
  2. int main()
  3. {
  4. printf("%d\n",a);
  5. return 0;
  6. }

通过重复上述相同的步骤,我发现分配如下

  1. .text 0x0040138c 0x2c sample.o
  2. .data 0x00402000 0x0 sample.o
  3. .rdata 0x00403064 0xc sample.o
  4. .eh_frame 0x00404060 0x38 sample.o
  5. .bss 0x00405020 0x0 sample.o

其中它清楚地显示了一个被分配到.rdata部分的

  1. .rdata 0x00403064 0xc sample.o
  2. 0x00403064 a

从这些实验中,我理解全局const被分配到.rdata部分,而.text部分的大小已经下降.因此,我假设在第一个例子中将a分配到.text部分.

我的问题是:

>在确定它在.rdata或.text中的位置时,是否考虑了const变量的范围?
>从我的实验中,我观察到变量在分配到.text段时需要8个字节,而在.rdata部分则需要4个字节.造成这种差异的原因是什么?
>如果本地const变量太多,那么相应的.text段的大小将显着增加.在这种情况下,推荐的编程实践是什么?

提前谢谢了.

解决方法

在第一种情况下,变量被声明为局部变量.它具有“自动”存储持续时间,这意味着它在封闭范围的末尾消失.由于其存储持续时间,它不能永久占用任何内存(无论const如何都是如此).因此,它通常存储在堆栈中或寄存器中.

在第二种情况下,变量被声明为全局变量.它具有静态存储持续时间,因此它在程序的生命周期内持续存在.这可以存储在许多地方,例如.data,.bss,.text或.rdata(或.rodata).

.data通常用于具有一些预定义(非零)内容的可写静态数据,例如,全局int foo = 42;. .bss用于初始化为零(或未初始化)的可写静态数据. rdata用于常量静态数据,如字符串和const变量.当然,这些用途都是“一般”的,并且可能因编译器而异.

那么为什么.text在第一种情况下会变得更大?这是因为编译器必须生成一些额外的指令来在堆栈或寄存器中加载10.

猜你在找的HTML相关文章