我正在研究 ELF 文件格式,所以我编译了一个小程序,从生成的可执行文件中转储了节标题及其内容。
ELF 标头包含入口点地址,该地址指向 .text 部分的开头。
我还找到了包含静态数据的 .data 部分和包含只读数据的 .rodata ...我希望堆栈也有一个部分,但我找不到该部分。
我还希望在某些时候 ESP 设置为某些部分的顶部,但我在反汇编中找不到类似的东西。
那么ESP是如何得到它的初始值的呢?
该进程在基地址加载.text
和部分。.data
主堆栈位于正下方并向下增长。
每个线程和函数调用都有自己的堆栈/堆栈帧。
它位于main-stack下方。
每个堆栈由一个保护页面分隔以检测堆栈溢出。
因此,不需要stack
ELF 文件中的专用部分。
但是,在ELF 的手册页中,确实可以在 ELF 文件中找到一些控制堆栈属性的内容。主要是内存中栈的可执行权限。
PT_GNU_STACK
GNU 扩展,Linux 内核使用它通过p_flags
成员中设置的标志来控制堆栈的状态。
.note.GNU-stack
本节在 Linux 对象文件中用于声明堆栈属性。此部分的类型为 SHT_PROGBITS。唯一使用的属性是 SHF_EXECINSTR。这向 GNU 链接器表明目标文件需要一个可执行堆栈。