ELF的加载过程

做c/c++一定要熟悉ELF是怎么加载的:

1. 内核首先读取ELF文件头部,再读如各种数据结构,从这些数据结构中可知各段或节的地址及标识,然后调用mmap()把找到的可加载段的内容加载到内存中。同时读取段标记,以标识该段在内存中是否可读、可写、可执行。其中,文本段是程序代码,只读且可执行,而数据段是可读且可写。

2. PT_INTERP的段中找到所对应的动态链接器名称,并加载动态链接器。通常是/lib/ld-linux.so.2.

3. 内核把新进程的堆栈中设置一些标记对,以指示动态链接器的相关操作。

4. 内核把控制权传递给动态链接器。

5. 动态链接器检查程序对共享库的依赖性,并在需要时对其进行加载

6. 动态链接器对程序的外部引用进行重定位,并告诉程序其引用的外部变量/函数的地址,此地址位于共享库被加载在内存的区间内。动态链接还有一个延迟定位的特性,即只有在“真正”需要引用符号时才重定位,这对提高程序运行效率有极大帮助。

7. 动态链接器执行在ELF文件中标记为.init的节的代码,进行程序运行的初始化。

8. 动态链接器把控制传递给程序,从ELF文件头部中定义的程序进入点(main)开始执行。在a.out格式和ELF格式中,程序进入点的值是显式存在的,而在COFF格式中则是由规范隐含定义。

9. 程序开始执行.


你可能感兴趣的:(ELF的加载过程)