当我在Linux中运行一些可执行文件时,有没有很好的文档说明会发生什么。例如:我启动了./a.out
,所以可能运行了一些引导装载器程序集(附带c运行时?),它在程序中找到启动符号,进行动态重定位,最后调用main
。
我知道上面的说法是不正确的,但是我正在寻找这个过程是如何发生的详细文档。你能解释一下,或者指向链接或书籍吗?
发布于 2011-08-13 14:58:09
对于动态链接程序,内核检测ELF文件中的ELF头,并首先映射动态链接器(/lib/ld-linux.so.2
或类似的),然后从动态链接器的主PT_INTERP
头开始在e_entry
地址上执行。堆栈的初始状态包含动态链接器查找主程序二进制文件(已在内存中)所需的信息。它负责读取它并查找所有必须加载的附加库,加载它们,执行重定位,以及跳转到主程序的e_entry
地址。
对于静态链接程序,内核直接使用主程序的ELF头中的e_entry
地址。
在这两种情况下,主程序都从一个传统上称为_start
的汇编例程开始(但名称并不重要,只要它的地址在ELF头的e_entry
字段中)。它使用初始堆栈内容来确定argc
、argv
、environ
等,并调用正确的实现内部函数(通常用C编写)来运行全局构造函数(如果有的话),并在进入main
之前执行所需的任何libc初始化。这通常以调用exit(main(argc, argv));
或等效函数结束。
发布于 2011-08-13 13:07:02
"Linker and Loader“一书详细描述了加载过程。也许它可以在这个问题上给你一些帮助。
https://stackoverflow.com/questions/7050585
复制相似问题