有人告诉我这个,“我知道在加载库时 linux 上不使用符号链接。”
但是,这对我来说似乎不正确。当我在 Linux 中闲逛时,我经常不得不修复损坏的符号链接。
我可以找到有关符号链接、它们如何工作以及如何创建的信息。
我可以找到有关共享库和静态库及其工作方式的信息。
但是我找不到任何描述加载库时如何使用符号链接的库加载过程的文档。特别是当有多个版本的库时。
有人可以指点我描述如何使用符号链接在 Linux 中加载库的文档吗?
更新
经过一些研究,我相信这个人暗示.so
加载库时不使用符号链接。
您不太可能找到任何描述动态库如何使用符号链接的文档,因为这两个概念是在不同的抽象级别上实现的。符号链接属于文件系统,对应用程序和动态库是透明的。对于程序来说,文件就是文件,无论它是真实文件还是符号链接。所有内部工作都隐藏在操作系统内核中。
原来我不明白链接到图书馆的过程。
当库在编译后链接到程序时,它链接到库的 soname(通常是文件
.so.XX
,其中 XX 是版本号),而不是版本.so
。在应用程序上运行
ldd
显示:这些库中的每一个都有一个
.so
指向主要.so.X
版本的符号链接版本。但是ldd
显示应用没有链接到版本.so
。这是有道理的,因为它允许在系统上安装一个库的多个版本,并且每个应用程序只会加载它需要的版本,而不会与其他版本发生冲突。
例如,您的 curl 库可能如下所示:
假设 MyApplication 链接到版本 4,YourApplication 链接到版本 3。
如果两个应用程序都在寻找 libcurl.so,那么 YourApplication 将无法加载,因为
libcurl.so
它是指向libcurl.so.4
.这就是应用程序需要加载版本
.so.X
而不是.so
版本的原因。