运行Linux可执行文件的过程
收藏

当我在linux中运行一些可执行文件时,是否有很好的文档说明发生了什么。例如:我启动了./a.out,所以可能运行了一些引导加载程序集(附带c runtime?),然后在程序中找到开始符号,进行动态重定位,最后调用main
我知道上面的说法是不正确的,但是我想找一份详细的文档来说明这个过程是如何发生的。你能解释一下,或者指出链接或书籍吗?


最佳答案:

对于动态链接程序,内核检测elf文件中的PT_INTERP头并首先mmaps动态链接器(/lib/ld-linux.so.2或类似),然后在动态链接器的主elf头的e_entry地址开始执行。堆栈的初始状态包含动态链接器查找主程序二进制文件(已在内存中)所需的信息。它负责读取此文件并查找必须加载的所有附加库,加载它们,执行重新定位,并跳到主程序的e_entry地址。
对于静态链接程序,内核直接使用主程序elf头中的e_entry地址。
在这两种情况下,主程序都以传统上称为_start的程序集中编写的例程开始(但只要其地址在elf头的e_entry字段中,名称就不重要)。它使用初始堆栈内容来确定argcargvenviron等,并调用正确的实现内部函数(通常用c编写)来运行全局构造函数(如果有的话)并执行main项之前所需的任何libc初始化。这通常以调用exit(main(argc, argv));或等效命令结束。

    公众号
    关注公众号订阅更多技术干货!