Linux动态连接器

转自:Chapter 9. Dynamic Linking

参考:Linux动态链接器

Linux加载启动可执行程序的过程(一)内核空间加载ELF的过程

Linux加载启动可执行程序的过程(二)解释器完成动态链接

本文和 理解ld-linux.so.2 内容上有点重复

动态链接器——Dynamic Linker

动态链接器既可以直接运行,也可以间接运行

间接运行

动态链接器可以通过一些动态链接的程序(dynamically linked program) 或 共享对象(shared object) 间接运行。对于动态链接器间接运行这种情况,动态链接器的命令行选项没办法传给动态链接的程序 或 共享对象。像ELF这种情况,动态链接器的命令行选项放到了被执行程序的 .interp节中。

直接运行

动态链接器也可以采用如下方式直接运行:

/lib/ld-linux.so.*  [OPTIONS] [PROGRAM [ARGUMENTS]]

不同二进制格式处理方式

程序ld.so和ld-linux.so *查找并加载程序需要的共享对象(共享库),为程序运行做准备,然后运行程序。Linux二进制文件需要在运行时动态链接链接,除非在编译期间给予ld命令-static选项。

a.out格式

程序ld.so处理a.out格式的二进制文件。a.out格式是很久以前使用的二进制格式。

ELF格式

ld-linux.so*处理ELF格式的二进制文件,ELF格式在Linux下已流行使用多年。(/lib/ld-linux.so.1用于libl5,/lib/ld-linux.so.2用于glibc2)
ld.so和ld-linux.so*处理二进制文件格式不同,如果相同,两者就具有相同的行为,并支持相同文件和程序,如ldd,ldconfig和/etc/ld.so.conf。

:libc是C库。基本上,它包含大多数程序在Linux上运行所需要的系统功能。 同时,它也包含很多C运行时库中的东西。libc6和glibc是相同的版本libc。官方的说法,它是GNU C库的第2版(但它是Linux C库的第六个主要版本)。目前用于Linux的libc有如下版本libc4,libc5,libc6。更多介绍参考:What's the difference between glibc and libc6?

共享对象依赖关系解析

在解析共享对象依赖关系时,动态链接器首先检查依赖关系字符串,看它是否包含斜杠。

如果找到斜线,那么 依赖项字符串被解释为(相对或绝对)路径名,然后用哪个路径名加载共享对象。

如果找不到斜杠,则按如下顺序搜索:

1.编译目标代码时指定的动态库搜索路径;

2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;

4.默认的动态库搜索路径/lib 或 /lib64;

5.默认的动态库搜索路径/usr/lib 或 /usr/lib64。

         
     

原文地址:https://www.cnblogs.com/kelamoyujuzhen/p/9808047.html