![为什么栈VMA必须是可执行的?](https://linux22.com/image/106200/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%A0%88VMA%E5%BF%85%E9%A1%BB%E6%98%AF%E5%8F%AF%E6%89%A7%E8%A1%8C%E7%9A%84%EF%BC%9F.png)
我目前正在阅读Linux内核开发作者:罗伯特·洛夫。
在“15进程地址空间”一章中,他打印了进程的内存映射。
user@machine:~$ pmap 1424
#all the processes mapped memory (skipped for readability)
bfffe000 (8KB) rwxp (0:00 0) [ stack ]
最后一行显示堆栈(当它向下增长时)。
他现在表示:
堆栈自然是可读、可写和可执行的——否则没有多大用处。
据我所知,我们使用堆栈来存储数据和代码地址(函数及其参数/变量)。
我不明白为什么堆栈必须是可执行的?
答案1
该信息已过时,并且堆栈通常不再可执行:
00007ffd884fa000 356K rw--- [ stack ]
如果 GCC 生成,则需要一个可执行堆栈用于嵌套函数调用的蹦床。这些蹦床是在运行时生成的小代码片段,并存储在堆栈中 - 因此如果使用它们,堆栈需要是可执行的。编译器会跟踪此要求,并在二进制文件(库和可执行文件)中输出一个标志,以指示它们是否需要可执行堆栈。您可以使用以下命令查看和操作该标志的值execstack(8)
。