Ubuntu运行时加载的共享库的soname错误



我正在使用eclipse-cdt编译和运行C++应用程序。

My_main_program特别需要libjpeg.so.62.

我的Ubuntu系统以前在/usr/local/lib/上有libjpeg.so.9。在出现运行时兼容性错误之前,我碰巧使用libjpeg.so.9编译并运行。

然后,我删除了所有libjpeg.*,并从源代码中安装了libjpeg.la、libjpeg.so、libjpeg.so.62和libjpegso.62.0。然后我运行ldconfig。

我可以建立这个项目。问题是动态链接器一直在搜索libjpeg.so.9并抛出

'error while loading shared libraries: libjpeg.so.9: cannot open shared object file: No such file or directory'

在运行时。这个问题正在折磨我。我已经检查了libjpeg.so的符号链接是否正确。请帮忙!

我可以建立这个项目。问题是动态链接器一直在搜索libjpeg.so.9并抛出

'error while loading shared libraries: libjpeg.so.9: ... No such file ...

您需要了解以下几点:

  1. 共享库可以具有SONAME动态标签(用readelf -d foo.so | grep SONAME可见)
  2. 如果可执行文件链接到这样的库,则SONAME被记录为NEEDED动态标记(在可执行文件中),而不管库本身被称为什么。也就是说,您可以将库命名为foo.sofoo.so.1234或其他任何名称。如果库具有libbar.so.7中的SONAME,那么可执行文件将需要libbar.so.7,无论[1]如何

关于你的问题。您的可执行文件无法加载libjpeg.so.9,因此我们得出结论,它正在与具有SONAME: libjpeg.so.9的共享库链接(在构建时)。

我删除了所有libjpeg.*并安装了libjpeg.so.62

您一定没有删除可执行构建时使用的libjpeg.so(位于/usr/local/lib之外的其他位置)那个库仍然有SONAME: libjpeg.so.9,这让你很伤心。

您可以通过在链接行上传递-Wl,-t标志来了解链接时正在使用哪些库。

[1] 不完全正确:如果可执行文件不需要来自foo.so的任何符号,并且如果--as-needed链接器选项有效,那么NEEDED: libbar.so.7将不会被记录。

更新

我还检查了ldd可执行文件,它返回libjpeg.so.62

这意味着运行ldd的可执行文件是正确的,但实际运行的可执行程序不是,它们必须是不同的可执行代码。

更新2:

你说得对。ldd可执行文件显示libjpeg.so.62和libjpeg.se都包含在中

事实上,不,我没有。但这次我会对的。

实际情况是,您的可执行文件正确记录了NEEDED: libjpeg.so.62(您可以使用以下命令进行验证:readelf -d /path/to/exe | grep 'NEEDED.*libjpeg')。

但是有一些其他共享库(ldd输出中列出的库之一),该库已重建而不是,并且仍然依赖于libjpeg.so.9

您可以通过在ldd输出中列出的所有库上运行readelf -d /path/to/libXXX.so | grep 'NEEDED.*libjpeg.so.9'来查找该库。

一旦你找到它,你就必须重建它,所以它也依赖于libjpeg.so.62

最新更新