何时链接未定义版本的库是正确的选择?

何时链接未定义版本的库是正确的选择?

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 存在,则链接到该库的二进制文件应该在运行时使用该名称。

相关内容