为什么常量存储在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.它已存储在数据段中 #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.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |