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学习参考资料:
阅读(1307) | 评论(0) | 转发(0) |