为什么栈VMA必须是可执行的?

为什么栈VMA必须是可执行的?

我目前正在阅读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)

相关内容