ELF文件格式如何定义堆栈?

时间:2013-08-16 17:15:50

标签: linux elf

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

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

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

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

那么ESP如何获得其初始值呢?

1 个答案:

答案 0 :(得分:7)

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

 Memory map of an C ELF executable on x86

  • 该过程会在基地址加载.text.data部分。

  • main-stack 位于下方并向下扩展。

  • 每个线程和函数调用都有自己的堆栈 它位于主堆栈下面。

  • 每个堆栈由一个保护页面隔开,以检测Stack-Overflow。

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


但是在 man pages for ELF 中,一个 会在控制堆栈属性的ELF文件中找到一些内容。主要是内存中堆栈的可执行权限。

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

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