我翻阅了一些Unix教科书,但无法清楚地了解进程的堆栈区域的内容。谁能解释一下或指出一些参考资料?
答案1
ld.so
只有当内核将其交给动态链接器时,您才能清楚地了解堆栈。你可以找到一个基本图片在这里。这显示了C 程序的传统 3 个参数argc
、argv
和。envp
int main(int argc, char **argv, char **envp)
这种观点有些简单化。一个ELF 辅助向量存在于堆栈上,也传达了很多信息ld.so
运行后ld.so
,libc 运行时介入并使事情变得复杂。 C++ 构造函数可以运行,各种疯狂的东西都可以在堆栈上结束。这取决于程序的编译方式。即使是简单的 C 程序也可以根据以下内容执行不同的操作什么图书馆他们编译为。
答案2
答案3
程序通常将函数参数压入堆栈,然后使用 asm CALL 指令调用函数,这会将返回地址压入堆栈,以便 RET 指令稍后可以将其弹出并知道返回到哪里。函数通常也会将其局部变量放在堆栈上。调用函数还可以在调用之前将其正在使用的任何寄存器压入堆栈,以便在被调用函数将这些寄存器用于其他用途后将其弹出。
函数 A 调用函数 B 的堆栈上的单词的可视化表示可能如下所示:
local1
arg1
functionA+12
local1
local2
这里 functionA 有一个局部变量,然后将参数传递给 functionB,并存储返回地址( functionA 开始后的 12 个字节)。然后 functionB 将它自己的两个局部变量放入堆栈中。如果 functionB 调用 functionC,那么堆栈会继续增长,然后随着函数返回而再次缩小。