我试图了解.rdata
部分与.text
部分的含义。我正在尝试一个简单的程序如下
int main()
{
const int a = 10;
printf("%d\n", a);
return 0;
}
当我构建和转储map
文件gcc -o a.out sample.c -Wl,Map,test.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
部分中。
我的问题是:
const
在确定变量的位置时是否考虑变量的范围.rdata
or.text
?.text
从我的实验中,我观察到变量在分配到部分时需要 8 个字节,而在部分中需要 4 个字节.rdata
。造成这种差异的原因是什么?如果局部变量过多
const
,则相应.text
部分的大小会显着增加。在这种情况下推荐的编程实践是什么?
提前谢谢了。