Chinaunix首页 | 论坛 | 博客
  • 博客访问: 112246
  • 博文数量: 22
  • 博客积分: 835
  • 博客等级: 准尉
  • 技术积分: 260
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-25 21:23
文章分类

全部博文(22)

文章存档

2011年(1)

2009年(21)

我的朋友

分类: LINUX

2009-11-16 19:55:58

1、连接器包括两种:静态链接器和动态链接器
 
2、静态链接器就是我们经常使用的toolchain的ld
 
3、动态链接器其实是由:可执行目标文件中.interp段中指定的program interpreter: /lib/ld-linux.so.2
 
4、我们常提到的连接器和加载器,加载器其实没有对应的应用程序或者库,他是操作系统的一部份,比如:可以把execv操作看作是静态加载器,把页面异常和dlopen看着动态加载器;加载器使得链接向后推迟,这样节省了内存和外存的空间,但给操作系统提出了更高的要求。
  
5、相应地动态链接发生在两个阶段,一是程序启动的时候,称为载入时动态链接;它调用动态链接程序(执行ld-linux.so.2中代码)来对程序中引用的外部符号进行定位。另一个阶段是在运行的时候,当执行到某个动态库中的代码时,把这个库实时印射到程序空间中,然后进行动态解析并调用。
 
6、可重定位目标文件没有程序头部表(Progrm Header),而可执行目标文件可能没有区头部表,而可共享目标文件这三者都可以有。程序头部表中的一项一般叫做段,它描述程序如何隐射到进程空间,它一般有多个区组成,通过readelf -l ***可以查看对应关系。
  
7、在main运行之前,动态链接器还做了很多事情,比如:扫描每个共享库并执行其中的初始化函数,调用__libc_start_main并执行程序的初始化函数init.大致过程是_dl_start--->object->init()--->_start()--->__libc_start_main--->.init->main;其中_start()也是程序在elf中的入口地址。
 
ld学习参考资料:
阅读(1275) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~