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

JDu*_*ger 2 process kernel memory stack

我目前正在阅读Robert Love 的Linux Kernel Development

在“15 进程地址空间”一章中,他打印了进程的内存映射。

user@machine:~$ pmap 1424
#all the processes mapped memory (skipped for readability)
bfffe000 (8KB)        rwxp (0:00 0)         [ stack ]
Run Code Online (Sandbox Code Playgroud)

最后一行显示堆栈(随着它向下增长)。
他现在说:

堆栈自然是可读、可写和可执行的——否则没有多大用处。

据我所知,我们将堆栈用于数据和代码地址(函数及其参数/变量)。

我不明白为什么堆栈必须是可执行的?

Ste*_*itt 6

该信息已过时,堆栈通常不再可执行:

00007ffd884fa000    356K rw---   [ stack ]
Run Code Online (Sandbox Code Playgroud)

如果 GCC为嵌套函数调用生成蹦床,则它需要一个可执行堆栈。这些蹦床是在运行时生成的一小段代码,并存储在堆栈中——所以如果使用它们,堆栈需要是可执行的。编译器会跟踪此要求,并在二进制文件(库和可执行文件)中输出一个标志,以指示它们是否需要可执行堆栈。您可以使用execstack(8).