linux - 从 elf 文件的 DYNAMIC 部分删除条目

标签 linux gcc linker static-linking elf

我有第 3 方库 A,它需要一些库 BA 链接到二进制文件,二进制文件链接静态版本B。 因此,不再需要 B 的动态版本。

A 不在我的控制之下,我无法重新编译它。因此,我想从 ADYNAMIC 部分删除 NEEDED libA 条目。

有没有办法用 objcopy 或其他工具做到这一点?

最佳答案

Is there a way to do it with objcopy or other tool?

尽管 elfsh,我不知道有任何现有工具可以做到这一点或许可以。

编写一个 C 程序来做你想做的事情是很简单的:libA.so.dynamic 部分是一个固定大小记录的表( type ElfW(Dyn)), 由带有 .d_type == DT_NULL 的条目终止。要删除特定的 DT_NEEDED 条目,只需向上“滑动”所有后续条目(用 entry[n+1] 覆盖 entry[n] > 等)。这将使您的 .dynamic 在末尾留下两个 DT_NULL 条目,但什么都不用关心。

一个复杂的问题是,如果 libB.so 包含 versioned libA.so 引用的符号,那么将有对 libB.soDT_VERNEED 表中,这些更难摆脱。如果您不删除 VERNEED 引用,动态链接器将无法断言。

关于linux - 从 elf 文件的 DYNAMIC 部分删除条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14479394/

相关文章:

c++ - Visual Studio "Application failed to start because the application configuration is incorrect"错误

linux - Qt 是否需要在 Linux 上预装窗口管理器?

linux - Souranalyzer,强化给出错误无法识别或无效的命令行参数 '-o'

c++ - gcc 中的原子计数器

c++ - 其他文件中的静态函数访问

c - gcc、UTF-8 和 limits.h

c - 在 gdb 中观察内存范围?

linux - 为 OracleCloud 设置适用于 Linux 的 Cloudberry Backup

linux g++ 将 64 位共享库代码链接到静态库

qt - 整合QT和OpenCV?