我有第三方库A ,这需要一些库B。 A链接到与静态版本B链接的binrary。 因此在B的dynamic版本中不再需要。
A不在我的控制之下,我不能重新编译它。 因此我想从A的 DYNAMIC部分删除NEEDED libA
条目。
有没有办法用objcopy或其他工具来做到这一点?
有没有办法用objcopy或其他工具来做到这一点?
我不知道任何现有的工具,可以做到这一点,虽然elfsh可能能够。
编写一个C程序来做你想做的事情是相当简单的: libA.so
的.dynamic
部分是一个固定大小的记录(类型为ElfW(Dyn)
)的表,由一个条目终止,该条目使用.d_type == DT_NULL
。 为了摆脱特定的DT_NEEDED
条目,只需简单地“滑动”所有下面的条目(用entry[n+1]
覆盖entry[n]
等)。 这将在两个DT_NULL
条目结尾处留下您的.dynamic
,但没有任何关系。
一个复杂的情况是,如果libB.so
包含libA.so
引用的版本化符号,那么在DT_VERNEED
表中会有额外的对libB.so
的DT_VERNEED
,这些更难以摆脱。 如果你没有摆脱VERNEED
引用,动态链接器将失败断言。