【发布时间】: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