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

时间:2019-03-21 11:13:21

标签: c assembly objdump

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

编译:gcc example.c -c

例如:objdump -s example.o

2258+haptom+street+columbia+sc+usa

1 个答案:

答案 0 :(得分:4)

您可能会参考:

  

.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   $0x69727473,-0x10(%rbp)
   b:   66 c7 45 f4 6e 67       movw   $0x676e,-0xc(%rbp)
...

最后两个指令在堆栈上移动“字符串”,因为它使用立即值操作,因此您可以在十六进制转储中看到该字符串。但是,它在运行时位于堆栈中。