2

对于我的嵌入式 linux (TI AM335x) 板,我有一个包含子文件夹 sysroot 和文件系统的 SDK。例如对于 libz:

sysroot/.../usr/lib 包含:

libz.so         # symbolic link to libz.so.1.2.7
libz.so.1       # symbolic link to libz.so.1.2.7
libz.so.1.2.7

文件系统/usr/lib/ 包含

libz.so.1       # symbolic link to libz.so.1.2.7
libz.so.1.2.7

文件系统不包含符号链接 libz.so --> libz.so.1.2.7。但我的链接器想要它。所以我添加了它。我的问题:是否有任何常见的原因不提供此类符号链接?从而达到了哪个目标?

4

2 回答 2

2

这样做的原因是链接到库的程序可以只指定一个“soname”,它链接到库的“真实名称”。如果您决定升级库,链接器现在链接到最新版本,而不必总是更改链接器配置。如果您想了解更多信息,请查看此处

于 2014-08-16T17:40:28.827 回答
0
 Is there any common reason not provide such symbolic links? Which goal is achieved by that?

唯一值得关注的原因是库的符号链接版本和已安装的库之间是否存在库 API 更改。在这种情况下,如果找不到所需的函数名称,您将收到链接器错误,或者如果所有名称都相同,但给定函数的操作在版本之间发生了变化,您将收到损坏的代码。当您手动创建到共享库的符号链接时,有责任确保您需要的库调用在共享库版本之间是相同的。通常,当一个库更改其soname(共享对象名称)时,它会这样做,因为该库的用户需要了解并确认正确使用该库中的一些潜在更改。libz.so您需要和您的系统具有的事实libz.so.1表示发生了此类更改或soname 颠簸。您需要确认您需要的功能libz.solibz.so.1. (大多数时候库是向后兼容的,但有时它们不是[例如 libpng-1.2 和 libpng-1.4])

这就是 sonames 的全部意义所在。当您发现自己处于需要手动创建符号链接或降级 libz 以获得所需libz.so的情况时——soname 更改告诉您libz.so 和 libz.so.1 之间存在库更改,所以它由您决定是否可以按照您尝试的方式使用libz.so.1符号链接。libz.so

为什么你甚至需要符号链接?为什么你的代码不应该因为没有符号链接而感到高兴libz.so.1呢?libz.so您正在编译的代码正在寻找libz.so. 如您所见,它不存在于您的系统中。通过提供libz.so -> libz.so.1符号链接,您可以让您的代码在不修改代码的情况下libz.so.1通过名称查找。libz.so创建符号链接基本上只是解决修复代码以使用libz.so.1. 根据您对任一系统上代码的访问权限,这可能是必要的,但处理这种情况的正确方法是更新两个系统和代码以使用/使用当前库构建libz.so.1

话虽如此,如果更改libz.so.1不会影响libz.so您需要使用的任何部分,那么符号链接就可以正常工作。

于 2014-08-16T20:33:46.850 回答