Chinaunix首页 | 论坛 | 博客
  • 博客访问: 340156
  • 博文数量: 88
  • 博客积分: 2011
  • 博客等级: 大尉
  • 技术积分: 885
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-21 14:50
文章分类

全部博文(88)

文章存档

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. 程序开始执行.

 

阅读(2753) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-09-13 14:42:52

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com