运行linux可执行文件的过程

时间:2011-08-13 13:03:54

标签: c linux bootloader

在Linux中运行某些可执行文件时,会有很好的文档吗?例如:我启动./a.out,所以可能运行一些引导加载程序程序集(带有c运行时?),它在程序中找到起始符号,进行动态重定位,最后调用main

我知道上面的内容不正确,但是要查找有关此过程如何发生的详细文档。你能解释一下,还是指向那些链接或书籍?

2 个答案:

答案 0 :(得分:5)

对于动态链接程序,内核检测ELF文件中的PT_INTERP标头,然后首先映射动态链接器(/lib/ld-linux.so.2或类似标签),并从e_entry地址开始执行动态链接器的主要ELF头。堆栈的初始状态包含动态链接器查找主程序二进制文件(已在内存中)所需的信息。它负责读取并查找必须加载的所有其他库,加载它们,执行重定位以及跳转到主程序的e_entry地址。

对于静态链接程序,内核直接使用主程序的ELF头中的e_entry地址。

在任何一种情况下,主程序都以一个传统上称为_start的程序集编写的例程开始(但只要其地址在ELF头的e_entry字段中,名称就不重要了) 。它使用初始堆栈内容来确定argcargvenviron等,并调用正确的实现内部函数(通常用C编写)来运行全局构造函数(如果有的话)并在进入main之前执行所需的任何libc初始化。这通常以调用exit(main(argc, argv));或同等号码结束。

答案 1 :(得分:1)

书籍“Linker and Loader”提供了有关加载过程的详细说明。也许它可以帮助你解决这个问题。