C执行堆栈 - 局部变量分配

use*_*755 4 c

我有一个非常基本的问题.让我们看看这个片段:

#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 ...

我在这里错过了什么?

再次感谢大家

oua*_*uah 6

"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.

  • 在linux(和类似的)系统上,您可以在二进制文件上使用`objdump -s -j .rodata`来查看它.另外,如果使用`gcc`,你将找不到"%s \n",因为`gcc`将该模式优化为对`puts()`的调用. (2认同)