Hasty Briefsbeta

双语

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等语言的运行时环境更为复杂。