gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:50:44 26 4
gpt4 key购买 nike

您好,请考虑在具有相应内存映射的 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 命令与“文本”(程序代码)部分混为一谈,但您可以让它为您提供更多详细信息:

$ 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”代表“对象”,而“F”代表函数。)

关于c - 为什么常量存储在 C 内存映射的文本段中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12993435/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com