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

发布于 2024-12-06 20:11:45 字数 1290 浏览 1 评论 0原文

全部。

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

# 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

明月松间行 2024-12-13 20:11:46

您可以采用简单的方法,将 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.

笑饮青盏花 2024-12-13 20:11:46

我认为这是不可能的,因为即使你让 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.

用心笑 2024-12-13 20:11:46

编辑可执行文件并替换

libA.so.0 

为该

libB.so.0 

文件,因为“libA.so.0”的 sizeo 与“libB.so.0”的 sizeo 相同。

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

edit executable and replace

libA.so.0 

with

libB.so.0 

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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文