没有堆栈段吗?这只是一个概念吗?

问题描述 投票:1回答:1

我一直在做一些测试,并意识到说堆栈段存在是错误的,因为当我分析二进制文件时,我意识到任何既不在寄存器中也不在静态,全局或常量中的数据类型都在文本段。你同意我的看法吗?我真的有疑问,我一直认为调用堆和堆栈内存段是正确的。我知道这个概念存在,但不是一个段

编译:gcc example.c -c

例如:objdump -s example.of

#include <stdio.h>

int main(void) {

     char s[] = "string";
     return 0;
}
c assembly objdump
1个回答
4
投票

你可能会参考这个:

section。的内容.text:

0000 554889e5 c745f073 74726966 c745f46e UH ... E.strif.E.n

0010 67645f6 00b80000 00005d3 g .......

您可以在文本部分中看到字符串“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   $0x69727473,-0x10(%rbp)
   b:   66 c7 45 f4 6e 67       movw   $0x676e,-0xc(%rbp)
...

最后两条指令在堆栈上移动“字符串”,因为它使用立即值操作,您可以在hexdump中看到字符串。然而,它在运行时存在于堆栈中。

© www.soinside.com 2019 - 2024. All rights reserved.