2010年(88)
分类: LINUX
2010-09-12 22:24:30
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. 程序开始执行.
chinaunix网友2010-09-13 14:42:52
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com