【问题标题】:solaris elfedit: Is there something similar for linux ? (a shared library editor)?solaris elfedit:linux 有类似的东西吗? (共享库编辑器)?
【发布时间】:2011-01-11 19:58:20
【问题描述】:

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

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

这就是我问这个的原因

我们的应用由

组成
  • 我们自己的库(静态 libXXX.a)
  • 一些第 3 方库(仅限二进制共享库 libYYY.so)

到目前为止,该应用程序一切正常。

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

一切编译和链接都很好。

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

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

我指的提示是

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

虽然我怀疑它是否真的有帮助,但我认为它可能值得一试。

有什么想法可以在已编译/链接的共享库上添加DT_SYMBOLIC flag 吗?

环境:debian lenny 64bit with g++ v4.2.4 and binutils v20.

编辑:在 solaris 上有一个名为 elfedit 的程序。 linux有类似的吗?

【问题讨论】:

    标签: linux g++ shared-libraries ld binutils


    【解决方案1】:

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

    在此处查看项目页面:http://www.eresi-project.org

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

    【讨论】:

    • elfsh 是否有任何文档?它似乎是一个很棒的工具,只是它完全没有文档记录。
    【解决方案2】:

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

    但是,如果 3rd 方库崩溃,我会亲自查看另一端:由于您转向共享,库加载顺序发生了哪些变化。

    ldd

    导出 LD_DEBUG=libs

    是你的朋友吗。

    在运行时加载程序加载您的第 3 方库之后对您的共享库进行 dlopen() 可能就足够了。

    【讨论】:

    • 感谢有关库加载顺序的建议。但我担心我不得不使用你提到的“痛苦的方法”。非常感谢有关如何编辑精灵标题的任何帮助!
    • 再一次,我真的不能推荐这种方法,但如果我不得不这样做,我会: 1. 阅读 ELF 规范 2. 构建一个带有和不带有 -Bsymbolic 的最小库并检查二进制差异
    • "...不能真正推荐这种方法..."。我同意。但仍然值得一试。
    猜你喜欢
    • 1970-01-01
    • 2017-07-15
    • 2014-09-22
    • 2010-11-29
    • 2020-03-26
    • 2011-10-18
    • 2023-03-09
    • 2011-04-04
    • 1970-01-01
    相关资源
    最近更新 更多