许多文档都说程序入口点(默认为_start
)会进行初始化,例如准备命令行等。控件是如何传递到_start
和任何用户模式的在此之前为新进程运行了代码?
请您参考如下方法:
How is the control been past to _start and any user-mode code was run before this for the new process?
需要考虑两种情况:完全静态和动态链接的可执行文件。
在完全静态的情况下,_start
处的指令是执行的第一个用户模式指令,即进程在诞生时就由内核在该指令处设置了指令指针。
在动态链接的情况下,情况要复杂得多,并且有 1000 条用户模式指令在 _start
之前运行:动态链接器初始化自身,mmap
s 所有必需的共享库,初始化它们,然后将控制权传递给 _start
。
在基于 glibc 的系统上,您可以通过运行例如来观察这一点
LD_DEBUG=files /bin/date
另请参阅this answer .