5

我正在研究 ELF 文件格式,所以我编译了一个小程序,从生成的可执行文件中转储了节标题及其内容。

ELF 标头包含入口点地址,该地址指向 .text 部分的开头。

我还找到了包含静态数据的 .data 部分和包含只读数据的 .rodata ...我希望堆栈也有一个部分,但我找不到该部分。

我还希望在某些时候 ESP 设置为某些部分的顶部,但我在反汇编中找不到类似的东西。

那么ESP是如何得到它的初始值的呢?

4

1 回答 1

9

下图描述了 x86 上典型 C ELF 可执行文件的内存映射。

x86 上 C ELF 可执行文件的内存映射

  • 该进程在基地址加载.text和部分。.data

  • 堆栈位于正下方并向下增长。

  • 每个线程和函数调用都有自己的堆栈/堆栈帧
    它位于main-stack下方。

  • 每个堆栈由一个保护页面分隔以检测堆栈溢出。

因此,不需要stackELF 文件中的专用部分。


但是,在ELF 的手册页中确实可以在 ELF 文件中找到一些控制堆栈属性的内容。主要是内存中的可执行权限。

  1. PT_GNU_STACK
    GNU 扩展,Linux 内核使用它通过p_flags成员中设置的标志来控制堆栈的状态。

  2. .note.GNU-stack
    本节在 Linux 对象文件中用于声明堆栈属性。此部分的类型为 SHT_PROGBITS。唯一使用的属性是 SHF_EXECINSTR。这向 GNU 链接器表明目标文件需要一个可执行堆栈。

于 2013-08-16T18:29:57.950 回答