The Journey Before main()
7 months ago
- #Kernel
- #ELF
- #Linux
- 文章探讨了从内核被请求运行程序到程序主函数执行之间的过程。
- Linux上的execve系统调用用于通知内核开始加载程序,需要提供可执行文件的路径、参数和环境变量。
- 高级语言封装(如Rust的Command::new)处理路径解析的方式类似shell,但内核要求完整路径。
- Linux可执行文件采用ELF格式,包含头部和多个节区(如.text节存放代码、.data节存放初始化变量、.bss节存放未初始化变量)。
- ELF文件通过过程链接表(PLT)等节区支持动态链接,使得像libc这样的共享库可以在运行时加载。
- 内核会设置程序栈结构,其中包含参数(argv)、环境变量(envp)以及传递系统信息的ELF辅助向量(auxv)。
- 程序的入口点通常是_start函数,它在调用main函数前完成运行时初始化。
- 不同编程语言的运行时初始化过程各异,Rust和C等语言的运行时设置较为精简,而Java或Python等语言的运行时环境更为复杂。