代码为何/在何处请求特定版本的库?

时间:2019-02-14 22:33:37

标签: linux compilation

这是在Linux中。我已经获得了要在一些新主机上安装的小型工具的源代码。我在新主机上编译了代码,但是它抱怨缺少库:

ldd code.so
libpcre.so.0 => not found

新主机已安装libpcre.so.1。所以这是我的问题:为什么不针对.so.1库进行编译?为什么要专门寻找.so.0?我已经搜索了源代码和include的一些头文件,但是没有引用该库的特定版本。

以下文档提到“程序,当它们在内部列出所需的共享库时”。这似乎是朝着正确的方向前进,但并未详细说明程序如何或在何处执行此操作。

1 个答案:

答案 0 :(得分:0)

好吧,进一步研究,似乎在编译和链接程序时,链接程序会自动将所有必需库的名称插入已编译的二进制文件本身中:

objdump -p ip.so | grep NEEDED
NEEDED               libpcre.so.0
strings ip.so | grep pcre
libpcre.so.0

在我的特定情况下,我正在谈论的程序需要上述共享库,而共享库需要具有sop libpcre.so.0的pcre库。这就是依赖失败的地方。即使我的新主机具有libpcre库,它也具有不同的名称(libpcre.so.1而不是libpcre.so.0),因此失败。

有趣的是:有人知道是否有一种方法可以告诉链接程序替换其他soname而不是依赖项列表中指定的soname吗?显然,这在大多数时候都行不通(如果soname更改,很可能是因为新版本不再向后兼容),但如果可能的话,仍然值得知道如何做。