繁体   English   中英

execve()是否设置寄存器以调用动态链接器或要执行的可执行文件?

[英]Does `execve()` set up registers to invoke dynamic linker or the executable to be executed?

深入理解Linux内核execve()调用load_binary()每个linux_binfmt对象, load_binary()

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

mosvy写道:

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

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

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

通过“ _start函数的开始”,他是指要执行的可执行文件的入口点吗?

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM