梦醒潇湘love 发表于 2013-08-08 15:15

C语言中字符串字面值、const全局变量、const局部变量保存在哪个段??


当我们用size命令查看目标文件时,会出现三个段,分别为.text、.data、.bss。这三个段分别存放的内容如下:
.text:保存CPU执行的指令
.data:保存初始化的全局变量和静态局部变量
.bss:保存未初始化的全局变量和静态局部变量

请问:
(1)网上查找资料,说字符串字面值存在.rodata段中,也有说存放在.data段中?哪个正确呢?是不是随着编译器的实现不同而不同呢?
(2)const全局变量和const局部变量(由于const变量定义时肯定要初始化,所以不分初始化和未初始化),请问它们各自保存在哪里呢?
(3)我看网上有人说文本段?那这个文本段是不是就是指的.text段,也就是说的code段??

请哪位前辈知道,帮忙解答下,一直没彻底搞明白上面三个问题。

在此,表示感谢。

myworkstation 发表于 2013-08-08 16:17

回复 1# 梦醒潇湘love


    .text、.data、.bss, rodata这些段都是预定义的段,其实有些程序远不止这些段,没有什么规定强制生成的程序一定要用什么样的段名,真正起作用的是具体段的属性,比如说ELF格式的程序rodata通常有SHT_PROGBITS属性,编程器和链接器完全可以不使用任务预定义的段,完全使用自定义的段名,只需要要生成相应可执行文件的时候指定相应的属性就可以起到相同的目的。最典型的情况比如C++,通都会有额外的段去处理编译器生成的stub代码。通常的编译器和链接器会把字符字面量和常量放在rodata段中(记住,不是必需的)。编译器甚至提供方法让开发人员去创建指定的段。文本段指的就是text段。由于没有硬性规定,所以你的问题在具体的系统和编译器下去分析。

川zi 发表于 2016-09-03 15:55

谢谢楼上的解答

seufy88 发表于 2016-09-06 17:21

void foo(void)
{
charAA[] = "hello";

}
LZ觉得 "hello"字串该放哪? 可以放.rodata区,也可以直接在栈上用指令赋值,此情况字符串就不用保存在.rodata区。
具体看编译器怎么实现了。没有谁规定
页: [1]
查看完整版本: C语言中字符串字面值、const全局变量、const局部变量保存在哪个段??