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

时间:2013-12-07 15:33:57

标签: linux ubuntu shared-libraries eclipse-cdt

我正在使用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和libjpeg.so.62.0.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的符号链接是否正确。 请帮忙!

1 个答案:

答案 0 :(得分:2)

  

我可以建立这个项目。问题是动态链接器一直在搜索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或其他任何名称。如果图书馆有SONAME libbar.so.7,则可执行文件将需要libbar.so.7,无论[1]如何。
  3. 关于你的问题。您的可执行文件无法加载libjpeg.so.9,因此我们得出结论,它正在与具有SONAME: libjpeg.so.9的共享库链接(在构建时)。

      

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

    您不能删除在可执行 build 时使用的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.so.9

    实际上,不,我不是。但这次我会说得对。

    正在发生的事情是您的可执行文件正确记录NEEDED: libjpeg.so.62(您可以使用以下命令验证这一点:readelf -d /path/to/exe | grep 'NEEDED.*libjpeg')。

    但是还有一些其他共享库(ldd输出中列出的一个),其已重建,但仍然有依赖于libjpeg.so.9

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

    找到后,您将不得不重建它,因此它还取决于libjpeg.so.62