在Linux中运行某些可执行文件时,会有很好的文档吗?例如:我启动./a.out
,所以可能运行一些引导加载程序程序集(带有c运行时?),它在程序中找到起始符号,进行动态重定位,最后调用main
。
我知道上面的内容不正确,但是要查找有关此过程如何发生的详细文档。你能解释一下,还是指向那些链接或书籍?
答案 0 :(得分:5)
对于动态链接程序,内核检测ELF文件中的PT_INTERP
标头,然后首先映射动态链接器(/lib/ld-linux.so.2
或类似标签),并从e_entry
地址开始执行动态链接器的主要ELF头。堆栈的初始状态包含动态链接器查找主程序二进制文件(已在内存中)所需的信息。它负责读取并查找必须加载的所有其他库,加载它们,执行重定位以及跳转到主程序的e_entry
地址。
对于静态链接程序,内核直接使用主程序的ELF头中的e_entry
地址。
在任何一种情况下,主程序都以一个传统上称为_start
的程序集编写的例程开始(但只要其地址在ELF头的e_entry
字段中,名称就不重要了) 。它使用初始堆栈内容来确定argc
,argv
,environ
等,并调用正确的实现内部函数(通常用C编写)来运行全局构造函数(如果有的话)并在进入main
之前执行所需的任何libc初始化。这通常以调用exit(main(argc, argv));
或同等号码结束。
答案 1 :(得分:1)
书籍“Linker and Loader”提供了有关加载过程的详细说明。也许它可以帮助你解决这个问题。