solaris elfedit:linux有类似的功能吗?(共享库编辑器)?

solaris elfedit:linux有类似的功能吗?(共享库编辑器)?,linux,g++,shared-libraries,ld,binutils,Linux,G++,Shared Libraries,Ld,Binutils,Linux:有没有办法编辑已编译的共享库 具体来说,我正在搜索如何在已编译的二进制共享库中添加DT_符号标志 这就是我问这个问题的原因: 我们的应用程序由 我们自己的库(staticlibXXX.a) 某些第三方LIB(仅二进制共享库libyy.so) 到目前为止,应用程序一切正常 现在,我已经用共享库版本(libXXX.so)替换了我们自己的static*libXXX.a库 一切都很好 但当我现在运行应用程序时,它会启动并执行许多预期的处理,然后在中途某个地方崩溃。gdb回溯显示崩溃发生在

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

具体来说,我正在搜索如何在已编译的二进制共享库中添加
DT_符号标志

这就是我问这个问题的原因:

我们的应用程序由

  • 我们自己的库(staticlibXXX.a)
  • 某些第三方LIB(仅二进制共享库libyy.so)
到目前为止,应用程序一切正常

现在,我已经用共享库版本(libXXX.so)替换了我们自己的static*libXXX.a库

一切都很好

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

我在软件上搜索了一下,发现了一篇有趣的文章

我指的建议是

... add the DT_SYMBOLIC flag to the dynamic section ...
虽然我怀疑它是否真的有用,但我认为它可能值得一试

有没有办法在已经编译/链接的共享库中添加
DT_符号标志

环境:使用g++v4.2.4和binutils v20的debian lenny 64位


EDIT:在solaris上有一个名为
elfedit
的程序。linux有类似的功能吗?

如果只是一个标志,那么痛苦的方法就是用十六进制编辑器调整elf头

但是,如果第三方库崩溃了,我个人会看看事情的另一端:库加载顺序因为您转到共享而发生了什么变化

ldd

导出LD_DEBUG=libs

你的朋友在这里


dlopen()在运行时加载器加载第三方LIB后加载共享LIB可能就足够了。

与此同时,我找到了一个名为
elfsh
的工具。它是一个交互式shell,用于检查和编辑ELF对象、二进制文件和共享库

有关项目页面,请参见此处:


不幸的是,它似乎不是很稳定。我在
elfsh
本身中经历了很多崩溃。

感谢您提供有关库加载顺序的建议。但我担心我不得不使用你提到的“痛苦的方法”。非常感谢关于如何编辑elf标题的任何帮助!同样,我不能真的推荐这种方法,但如果我必须推荐的话,我会:1。阅读ELF规范2。构建一个包含和不包含-Bsymbolic的最小库,并检查二进制差异“…不能真正推荐这种方法…”。我同意。但是还是值得一试。有关于
elfsh
的文档吗?它似乎是一个很棒的工具,只是它完全没有文档记录。