在Linux中运行可执行文件时,有没有好的文档记录发生了什么。例如:我启动./a.out
,那么可能会运行一些引导程序汇编(与c运行时一起?),它会在程序中找到起始符号,进行动态重定位,最后调用main
。
我知道上面的不正确,但我正在寻找详细的文档,说明这个过程是如何发生的。你能解释一下,或者指向链接或书籍吗?
在Linux中运行可执行文件时,有没有好的文档记录发生了什么。例如:我启动./a.out
,那么可能会运行一些引导程序汇编(与c运行时一起?),它会在程序中找到起始符号,进行动态重定位,最后调用main
。
我知道上面的不正确,但我正在寻找详细的文档,说明这个过程是如何发生的。你能解释一下,或者指向链接或书籍吗?
PT_INTERP
头部,并先将动态链接器(/lib/ld-linux.so.2
或类似文件)映射到内存,并从动态链接器的主ELF头部的e_entry
地址开始执行。栈的初始状态包含动态链接器需要找到主程序二进制文件(已经在内存中)的信息。它负责读取此信息并查找必须加载的所有其他库,加载它们,进行重定位,并跳转到主程序的e_entry
地址。e_entry
地址。_start
的汇编例程开始(但名称不重要,只要其地址在ELF头部的e_entry
字段中)。它使用初始堆栈内容来确定argc
、argv
、environ
等,并调用正确的实现内部函数(通常是用C语言编写的)来运行全局构造函数(如果有)和执行在进入main
之前所需的任何libc初始化。这通常以调用exit(main(argc, argv));
或等效函数结束。gcc -static
会生成静态链接的二进制文件。内核通过ELF中存在或不存在PT_INTERP
程序头来区分差异。 - R.. GitHub STOP HELPING ICE