首页 > 解决方案 > `execve()` 是否设置寄存器来调用动态链接器或要执行的可执行文件?

问题描述

了解 Linux 内核说明每个对象的execve()调用,以及load_binary()linux_binfmtload_binary()

调用 start_thread( ) 宏来修改保存在内核模式堆栈上的用户模式寄存器 eip 和 esp 的值,使它们分别指向动态链接器的入口点和新用户模式堆栈的顶部。

莫维写道:

发生的情况是内核安排execve系统调用,在返回到用户模式时,将 IP(指令指针)寄存器设置为指向函数的开头_start,并将 SP(堆栈指针)寄存器设置为指向函数的开头。 argv + env 字符串列表的开头,所以从用户模式的角度来看,效果就像有人调用了_start函数一样:

_start(argc, argv0, argv1, ... , NULL, env0, env1, ... NULL)

在所有参数都在堆栈上传递的调用约定中。

“函数的开头_start”是指要 执行的可执行文件的入口点吗?

哪一个是正确的?即是否execve()设置寄存器来调用动态链接器或要执行的可执行文件?

标签: linuxlinux-kerneldynamic-linkingexec

解决方案


_start 是可执行文件的入口点。在 C 中你可能认为 main 是入口点,但这只是程序员的观点。编译器可能会在 _start 中插入其他代码,以便在调用 main 之前运行。

我的解释是,您问题中描述的所有内容都发生在调用_start(或似乎调用_start)之前。


推荐阅读