Linux:有没有办法编辑已编译的共享库?

具体来说,我正在寻找如何添加 DT_SYMBOLIC flag 在已经编译的二进制共享库上?

这就是我问这个的原因:

我们的应用程序由以下部分组成

  • 我们自己的图书馆(静止的 libXXX.a)
  • 一些第 3 方库(仅二进制共享 库 libYYY.so)

到目前为止,应用程序一切都很好。

现在我已经更换了我们自己的 静止的* 具有共享库版本 (libXXX.so) 的 libXXX.a 库。

一切都编译和链接良好。

但是,当我现在运行该应用程序时,它会启动并执行大量预期的处理 - 然后它在中途某个地方崩溃。gdb 回溯显示崩溃发生在某些第 3 方共享库中。

我在SOF上搜索了一下,发现了一篇有趣的文章 这里.

我指的是

... add the DT_SYMBOLIC flag to the dynamic section ...

尽管我怀疑这是否真的有帮助,但我认为值得一试。

任何想法如何我可以添加 DT_SYMBOLIC flag 在已经编译/链接的共享库上?

环境:debian lenny 64 位,带有 g++ v4.2.4 和 binutils v20。

编辑:在solaris上有一个程序叫做 elfedit. 。linux 有类似的东西吗?

有帮助吗?

解决方案

同时我发现了一个名为 elfsh. 。它是一个交互式 shell,用于检查和编辑 ELF 对象、二进制文件和共享库。

请参阅此处的项目页面: http://www.eresi-project.org

不幸的是,它似乎不太稳定。我经历过很多次崩溃 elfsh 本身。

其他提示

如果它只是一个标志,痛苦的方法是使用十六进制编辑器调整你的精灵头。

但如果第 3 方库崩溃了,我个人会看看事情的另一端:由于您转向共享,库加载顺序发生了哪些变化。

LDD

导出 LD_DEBUG=库

你的朋友在这里吗?

在运行时加载器加载第 3 方库后,dlopen() 处理您的共享库可能就足够了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top