如何从可执行文件中删除链接库
全部。
有人创建了一个可执行文件。
# 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。但我还没有找到它。
请给我一个建议。
All.
Someone created an executable file.
# 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)
In this case, I want to merge libB.so into libA.so.
So I create libA.so that is covered all APIs provided by libB.so.
Then I have to re-link with this library. But I don't have any source for test_bin.
How can I remove libB.so linking from executable file without any sources?
Is it possible? I just look around binutils. But I haven't found for it.
Please give me an advice.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以采用简单的方法,将 libB.so 和 libB.so.0 设为 libA.so.0 的符号链接。不修改可执行文件,但却是一种快速且可移植的解决方案。
You could go the easy route and make libB.so and libB.so.0 a symlink to libA.so.0. Doesn't modify the executable, but is a quick and portable solution.
我认为这是不可能的,因为即使你让 libA.so 包裹 libB.so (你所描述的覆盖),libA.so 仍然依赖于 libB.so 的功能,所以两者都必须链接到你的可执行的。
我知道的唯一解决方法是 @thiton 提出的或让 libA.so 实现 libB.so 而不依赖它,即实现 libB.so 的所有功能或仅实现您需要的功能。
I don't think it is possible, because even when you make libA.so wrap libB.so (what you described as covers), libA.so still depends on the functions of libB.so, so both have to be linked to your executable.
The only workaround that I know it's what @thiton proposed or make libA.so implement libB.so without depending on it, i.e., implement all functions of libB.so or only the ones you need.
编辑可执行文件并替换
为该
文件,因为“libA.so.0”的 sizeo 与“libB.so.0”的 sizeo 相同。
如果您添加或删除额外的符号,它肯定会破坏可执行文件。
edit executable and replace
with
this works because sizeo of "libA.so.0" is the same as sizeo of "libB.so.0".
If u add or remove extra symbol it will break executable for sure.