我有一个非常基本的问题.让我们看看这个片段:
#include <stdio.h>
void foo(void) {
char *s = "StackOverflow";
printf("%s\n", s);
}
int main(void) {
foo();
}
Run Code Online (Sandbox Code Playgroud)
在进程执行堆栈中,main被加载到堆栈,然后调用foo().现在,分配了"StackOverflow"的内存在哪里?同样,在调用printf时分配给"%s \n"的memroy是什么?
请考虑以下代码:
现在我的另一个问题是,考虑下面的代码:
#include <stdio.h>
int x;
int abc = 100;
void foo(void) {
char *s = "stackoverflow";
printf("%s\n", s);
}
int main(void) {
foo();
}
Run Code Online (Sandbox Code Playgroud)
所以,如果我做objdump -s -j .bss a.out,我应该看到未初始化的段,如果我做objdump -s -j .data a.out,我应该看到初始化段(abc = 100)rt?这个假设有什么问题吗?
我得到以下输出:
test> objdump -s -j .bss a.out a.out:文件格式为elf32-i386
test> objdump -s -j .data a.out
a.out:文件格式为elf32-i386
部分内容.data:804954c 00000000 3c960408 00000000 64000000 .... <....... d ...
我在这里错过了什么?
再次感谢大家
"StackOverflow"在大多数系统中,"%s\n"字符串文字放入.rodata(只读数据)部分.
在UNIX上,您可以.rodata使用objdump命令转储节:
$ gcc tst.c
$ objdump -s -j .rodata a.out
Run Code Online (Sandbox Code Playgroud)
由注释中的@FatalError添加,在"%s\n"示例中使用objdump是不可见的,因为gcc通过调用来printf("%s\n",str)替换它来优化调用puts(str).
要"%s\n"在objdump输出中查看字符串文字,可以使用编译程序gcc -fno-builtin.