[英]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的值,以便它们分别指向动态链接器的入口和新用户模式堆栈的顶部。
发生的事情是内核在返回用户模式时安排
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.