【问题标题】:wrong soname of shared library loaded at runtime Ubuntu在运行时加载的共享库的错误名称 Ubuntu
【发布时间】:2013-12-07 15:33:57
【问题描述】:

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

【问题讨论】:

  • ldd 说什么? ldconfig 可以访问这个缺少的库吗?
  • 我删除了它,因为我必须使用 libjpeg.so.62。
  • 可执行文件的ldd说'libjpeg.so.62 => /usr/local/lib/libjpeg.so.62(0xb74af000)'
  • libjpeg.so.62 已经在 /usr/local/lib/
  • 这不是你的问题,libjpeg.so.**9** 你的 Eclipse 正在寻找另一个版本的 libjpeg,你应该检查一下你用来编译这些东西的标志。

标签: linux ubuntu shared-libraries eclipse-cdt


【解决方案1】:

我可以构建项目。问题是动态链接器不断搜索 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 或其他任何名称。如果库有SONAMElibbar.so.7,那么可执行文件将需要libbar.so.7,无论如何[1]。

解决您的问题。您的可执行文件无法加载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 的可执行文件是正确的,但实际运行的可执行文件不是,它们必须是不同的可执行文件。 p>

更新 2:

你是对的。 ldd 可执行文件显示包含 libjpeg.so.62 和 libjpeg.so.9

实际上,不,我不是。但这次我是对的。

发生的情况是您的可执行文件正确记录了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

【讨论】:

  • 我检查了 libjpg.so,它给出了 readelf -d /usr/local/lib/libjpeg.so | grep SONAME 0x0000000e (SONAME) 库 soname: [libjpeg.so.62] 这意味着 libjpeg.so 指向正确的 .so.major
  • 我也检查了 ldd 可执行文件,它返回 libjpeg.so.62 => /usr/local/lib/libjpeg.so.62 (0xb76ff000) 所以,似乎可执行文件也记录了正确的名字。我不知道这给了我这个问题。
  • 谢谢。你是对的。 ldd 可执行文件显示 libjpeg.so.62 和 libjpeg.so.9 都包括在内,尽管我没有包括 libjpeg.so.9。如何从可执行文件中删除 libjpeg.so.9?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
  • 2019-11-27
  • 2011-06-29
  • 2021-04-20
  • 2014-11-20
  • 2011-11-29
  • 1970-01-01
相关资源
最近更新 更多