没有堆栈段吗?它只是一个概念吗?
Is there no stack segment? Is it simply a concept?
我一直在做一些测试,并意识到说堆栈段存在是错误的,因为当我分析一个二进制文件时,我意识到任何数据类型,既不在寄存器中也不在静态中,全局的或常量,在文本段中。你同意我的看法吗?我真的很怀疑,我一直认为调用堆和堆栈内存是正确的segments.I知道这个概念存在,但不是段
编译:gcc example.c -c
例如:objdump -s example.o
#include <stdio.h>
int main(void) {
char s[] = "string";
return 0;
}
你可能指的是这个:
Contents of section .text:
0000 554889e5 c745f073 74726966 c745f46e UH...E.strif.E.n
0010 67c645f6 00b80000 00005dc3 g.E.......].
在正文部分可以看到字符串“string”,因为这条语句
char s[] = "string";
引出代码,将字符串复制到堆栈。 objdump -d
显示
.text 部分的反汇编:
0000000000000000 <main>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: c7 45 f0 73 74 72 69 movl [=11=]x69727473,-0x10(%rbp)
b: 66 c7 45 f4 6e 67 movw [=11=]x676e,-0xc(%rbp)
...
最后两条指令在堆栈上移动“string”,因为它使用立即值操作,您可以在 hexdump 中看到该字符串。然而,它在运行时存在于堆栈中。
我一直在做一些测试,并意识到说堆栈段存在是错误的,因为当我分析一个二进制文件时,我意识到任何数据类型,既不在寄存器中也不在静态中,全局的或常量,在文本段中。你同意我的看法吗?我真的很怀疑,我一直认为调用堆和堆栈内存是正确的segments.I知道这个概念存在,但不是段
编译:gcc example.c -c
例如:objdump -s example.o
#include <stdio.h>
int main(void) {
char s[] = "string";
return 0;
}
你可能指的是这个:
Contents of section .text:
0000 554889e5 c745f073 74726966 c745f46e UH...E.strif.E.n
0010 67c645f6 00b80000 00005dc3 g.E.......].
在正文部分可以看到字符串“string”,因为这条语句
char s[] = "string";
引出代码,将字符串复制到堆栈。 objdump -d
显示
.text 部分的反汇编:
0000000000000000 <main>:
0: 55 push %rbp
1: 48 89 e5 mov %rsp,%rbp
4: c7 45 f0 73 74 72 69 movl [=11=]x69727473,-0x10(%rbp)
b: 66 c7 45 f4 6e 67 movw [=11=]x676e,-0xc(%rbp)
...
最后两条指令在堆栈上移动“string”,因为它使用立即值操作,您可以在 hexdump 中看到该字符串。然而,它在运行时存在于堆栈中。