如何从可执行文件中删除链接库

时间:2011-09-27 08:57:28

标签: c linker shared-libraries binutils

所有

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

# 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。但我还没有找到它。

请给我一个建议。

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

编辑可执行文件并替换

libA.so.0 

libB.so.0 

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

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