【问题标题】:How can I remove linked library from executable file如何从可执行文件中删除链接库
【发布时间】:2011-09-27 08:57:28
【问题描述】:

全部。

有人创建了一个可执行文件。

# ldd test_bin 
    libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x4082d000)
    libA.so.0 => /usr/lib/libA.so.0 (0x408fe000)
    libB.so.0 => /usr/lib/libB.so.0 (0x4093e000)
    libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0x409ad000)
    libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0x409fe000)
    librt.so.1 => /lib/librt.so.1 (0x40a0a000)
    libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0x40a19000)
    libdbus-1.so.3 => /usr/lib/libdbus-1.so.3 (0x40b25000)
    libssl.so.0.9.8 => /usr/lib/libssl.so.0.9.8 (0x40b67000)
    libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x40bb0000)
    libpthread.so.0 => /lib/libpthread.so.0 (0x40bc3000)
    libc.so.6 => /lib/libc.so.6 (0x40be3000)
    libm.so.6 => /lib/libm.so.6 (0x40d11000)
    libcrypto.so.0.9.8 => /usr/lib/libcrypto.so.0.9.8 (0x40d87000)
    /lib/ld-linux.so.3 (0x40000000)
    libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0x40f4e000)
    libdl.so.2 => /lib/libdl.so.2 (0x40f59000)

在这种情况下,我想将 libB.so 合并到 libA.so 中。

所以我创建了 libA.so,它涵盖了 libB.so 提供的所有 API。

然后我必须重新链接这个库。但是我没有 test_bin 的任何来源。

如何在没有任何来源的情况下从可执行文件中删除 libB.so 链接?

有可能吗?我只是看看binutils。但我还没找到。

请给我一个建议。

【问题讨论】:

  • 对了,为什么要消除这个依赖?
  • libB.so 的命名不合我的口味。;-)
  • libA.so 和 libB.so 的作用相似。但是有一些理由将其分开。 (如许可或政策)不再适用。为了方便维护,我将它合并到一个库中。
  • 这几乎肯定不是您正在寻找的解决方案:但如果不出意外,您可以手动修复 ELF 标头以产生您想要的结果。我在某个地方有一个脚本。
  • 是否只需要修复 ELF 标头?如果是这样,这对我来说是一个很好的解决方案!

标签: c linker shared-libraries binutils


【解决方案1】:

您可以走简单的路线,让 libB.so 和 libB.so.0 成为 libA.so.0 的符号链接。不修改可执行文件,但它是一种快速且可移植的解决方案。

【讨论】:

  • 是的,它对我有用。但我想获得更清晰的解决方案。谢谢。
  • @spbear: 如果你担心重复使用 libB.so 的名称,只需增加年龄并继续使用 libB.so.1 等。否则,祝你好运找到一个不那么 hacky 的版本,我会看这个讨论:-)。
【解决方案2】:

我不认为这是可能的,因为即使你让 libA.so 包装 libB.so(你描述为覆盖),libA.so 仍然依赖于 libB.so 的功能,所以两者都必须是链接到您的可执行文件。 我知道的唯一解决方法是@thiton 提出的或使 libA.so 实现 libB.so 而不依赖它,即实现 libB.so 的所有功能或仅实现您需要的功能。

【讨论】:

  • 正如你所说,我已经让 libA.so 实现了 libB.so 而不依赖它。这可能是因为 libA.so 和 libB.so 是我制作的。 :) 但我不知道如何删除可执行文件对 libB.so 的依赖。
【解决方案3】:

编辑可执行文件并替换

libA.so.0 

libB.so.0 

这是有效的,因为“libA.so.0”的 sizeo 与“libB.so.0”的 sizeo 相同。

如果你添加或删除额外的符号,它肯定会破坏可执行文件。

【讨论】:

  • 不幸的是,它们的名称大小不同。但是 libB.so 的名字比 libA.so 的名字长。可能吗?我担心其他副作用。
  • 不,很遗憾不是 :( 但我看不出制作符号链接有问题。
猜你喜欢
  • 1970-01-01
  • 2010-12-16
  • 2017-01-26
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多