【发布时间】:2013-04-15 22:50:23
【问题描述】:
我试图了解.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 被分配到 .rdata 部分,而 .text 部分的大小已经下降。因此,我假设a 在第一个示例中被分配到.text 部分。
我的问题是:
在确定
.rdata或.text中的位置时是否考虑const变量的范围?从我的实验中,我观察到变量在分配到
.text部分时需要 8 个字节,而在.rdata部分中需要 4 个字节。造成这种差异的原因是什么?如果局部
const变量过多,则对应.text部分的大小会显着增加。在这种情况下推荐的编程实践是什么?
非常感谢。
【问题讨论】: