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

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

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

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

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

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

解决方法:

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

>该进程在基址处加载.text和.data节.
>主堆栈位于下方并向下增长.
>每个线程和函数调用都有自己的堆栈.
它位于主堆栈下方.
>每个堆栈由一个保护页面隔开,以检测Stack-Overflow.

因此,在ELF文件中不需要专用的堆栈部分.

但是在man pages for ELF中,人们确实在ELF文件中找到了控制堆栈属性的一些东西.主要是内存中堆栈的可执行权限.

> PT_GNU_STACK
GNU扩展,Linux内核使用它来通过p_flags成员中设置的标志来控制堆栈的状态.
> .note.GNU-stack
此部分在Linux对象文件中用于声明堆栈属性.此部分的类型为SHT_PROGBITS.使用的唯一属性是SHF_EXECINSTR.这向GNU链接器指示目标文件需要可执行堆栈.

上一篇:SQL Server 数据库关键知识点详解(优秀经典)


下一篇:element-ui分页器的使用-搭配表格