对于我的嵌入式Linux(TI AM335x)主板,我有一个包含子文件夹sysroot和filesystem的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
filesystem / usr / lib / contains
libz.so.1 # symbolic link to libz.so.1.2.7
libz.so.1.2.7
文件系统不包含符号链接libz.so - > libz.so.1.2.7。但我的链接器想要它。所以我添加了它。 我的问题:有没有提供这种符号链接的常见原因?实现了哪个目标?
答案 0 :(得分:2)
这样做的原因是链接到图书馆的程序只能指定一个" soname",它与"真实姓名"相关联。的图书馆。如果您决定升级库,链接器现在链接到最新版本,而不是始终必须更改链接器配置。如果您想了解更多相关信息,请查看here。
答案 1 :(得分: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 bump 。您需要确认libz.so
中所需的功能是否存在,并在libz.so.1
中保持不变。 (大多数时候库是向后兼容的,但有时它们不是[例如libpng-1.2和libpng-1.4])
这就是声纳的全部意义。当您发现自己需要手动创建符号链接或降级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
的任何部分,那么符号链接就可以了。