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

我正在学习ELF文件格式,所以我编译了一个小程序,从结果可执行文件中删除了部分头文件和它们的内容。

ELF标题包含入口点地址,它指向.text部分的开始。

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

我也希望在某个时候,ESP被设置在某个部分的顶部,但是我在反汇编中找不到那样的东西。

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

Solutions Collecting From Web of "ELF文件格式如何定义堆栈?"

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

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

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

  • 主栈位于正下方并向下生长。

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

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

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


然而,在ELF手册页中 ,人们在ELF文件找到了一些控制堆栈属性的东西。 主要是对内存中的堆栈的可执行权限。

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

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