加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

为什么常量存储在C存储器映射中的文本段中?

发布时间:2020-12-16 10:32:19 所属栏目:百科 来源:网络整理
导读:您好请考虑下面的代码片段在 Linux机器(64位)上用gcc编译,并带有相应的内存映射 #include stdio.hint global = 2;int main(void){ int local = 0; return 0;}text data bss dec hex filename1092 500 16 1608 648 mem 这里因为有一个全局变量初始化为2.它已
您好请考虑下面的代码片段在 Linux机器(64位)上用gcc编译,并带有相应的内存映射

#include <stdio.h>

int global = 2;

int main(void)
{
    int local = 0;

    return 0;
}

text       data     bss     dec     hex filename

1092        500      16    1608     648 mem

这里因为有一个全局变量初始化为2.它已存储在数据段中
考虑将其设为const如下所示的情况

#include <stdio.h>

int const global = 2;

int main(void)
{
    int local = 0;

    return 0;
}

text       data     bss     dec     hex filename
1096        496      16    1608     648 mem

这里全局变量从数据段移动到文本段.

为什么它从数据移到文本段?

由于数据段分为读写区域,它应该存储在数据的读取区域中吗?

在代码中间初始化的未初始化的全局变量会发生什么?

解决方法

在现代系统中,常量位于为只读数据保留的目标文件的一部分中.该部分在默认模式下通过size命令与“text”(程序代码)部分混为一谈,但您可以使它为您提供更多详细信息:

$size test.o  # compiled from the code in the question
   text    data     bss     dec     hex filename
     58       0       0      58      3a test.o

$size -A test.o
test.o  :
section           size   addr
.text                6      0
.data                0      0
.bss                 0      0
.rodata              4      0
.comment            29      0
.note.GNU-stack      0      0
.eh_frame           48      0
Total               87

看看第一个命令产生的“文本”号是如何由第二个问题产生的.text,.rodata和.eh_frame数字的总和?

您可以使用objdump命令告诉常量是.rodata而不是.text:

$objdump -t test.o | grep -w global
0000000000000000 g     O .rodata    0000000000000004 global

(‘g’表示全局,’O’表示’Object’而不是’F’表示Function.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读