我strace
发现程序需要一些未指定版本的gmp
库:
open("/lib/x86_64-linux-gnu/libgmp.so", O_RDONLY|O_CLOEXEC) = \
-1 ENOENT (No such file or directory)
我认为它应该与特定的界面版本链接(例如libgmp.so.10
)。
但这看起来并不常见。这是偶然的还是有充分的理由依赖未指定的版本?
我能想到的唯一可接受的情况是操作系统分发:您构建(并控制)每个包。
答案1
我不会说“不可接受”,但二进制文件在运行时以普通名称搜索共享库绝对是不寻常的*.so
。通常:
- (构建时)链接器在名称匹配下搜索库
*.so
- 如果找到,链接器将查询库的 SONAME 字段以找出库在运行时应定位的名称
- 它将该名称记录在构建的二进制文件中,以便成为它在运行时搜索的名称。
此约定的目的是使二进制文件可以与库的特定 API 版本绑定。
也许有问题的库没有使用这个约定。要检查该库是否包含 SONAME 字段:
objdump -p /lib/`arch`-linux-gnu/libthing.so | fgrep SONAME
如果不存在 SONAME,则链接到该库的二进制文件将默认使用构建时找到该库的名称(即*.so
)。这可能就是你所看到的。如果 SONAME 存在,则链接到该库的二进制文件应该在运行时使用该名称。