我有 3rd 方库A,需要一些库B。 A链接到二进制文件,二进制文件与静态版本B链接。因此不再需要B的动态版本。
A不在我的控制之下,我无法重新编译它。因此,我想从A的DYNAMIC部分中删除NEEDED libA
条目。
有没有办法用 objcopy 或其他工具来做到这一点?
我有 3rd 方库A,需要一些库B。 A链接到二进制文件,二进制文件与静态版本B链接。因此不再需要B的动态版本。
A不在我的控制之下,我无法重新编译它。因此,我想从A的DYNAMIC部分中删除NEEDED libA
条目。
有没有办法用 objcopy 或其他工具来做到这一点?
有没有办法用 objcopy 或其他工具来做到这一点?
我不知道任何现有的工具可以做到这一点,尽管elfsh可能能够做到。
编写一个 C 程序来做你想做的事情是非常简单的: 的.dynamic
部分libA.so
是一个固定大小的记录表(类型为ElfW(Dyn)
),由一个带有 的条目终止.d_type == DT_NULL
。要删除特定DT_NEEDED
条目,只需向上“滑动”所有后续条目(用 覆盖entry[n]
等entry[n+1]
)。这将在最后留下.dynamic
两个DT_NULL
条目,但什么都不应该关心。
一个复杂的问题是,如果libB.so
包含引用的版本化符号,那么在tablelibA.so
中会有额外的引用,而这些更难摆脱。如果你不摆脱引用,动态链接器将失败断言。libB.so
DT_VERNEED
VERNEED