【问题标题】:Removing entry from DYNAMIC section of elf file从 elf 文件的 DYNAMIC 部分中删除条目
【发布时间】:2013-01-23 12:09:34
【问题描述】:

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

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

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

【问题讨论】:

  • 有 90% 或更高的几率删除 NEEDED 条目只会产生无法解决的符号错误(如果你很幸运)或出现故障的程序(如果你不那么幸运,由于重复数据必须是唯一的)。您应该将二进制文件重新链接到库 B 的动态版本。
  • @Zack 我将我的二进制文件与 B 的静态版本相关联,因此不应该有未解析的符号。你还觉得我会有问题吗?
  • 是的。您的二进制文件仅包含二进制文件本身使用的 B 子集。这对于 A 来说也很可能是不够的。为什么链接 B 的动态版本会出现问题?
  • @Zack 我不想在生产服务器上安装 B,因为有其他版本的 B。这两个版本的 B 可能会冲突。
  • @Zack 但是 A 是二进制的一部分,所以它的所有未定义符号都应该在与 A 和 B 的二进制链接时解析。我正确吗?

标签: linux gcc linker static-linking elf


【解决方案1】:

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

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

编写一个 C 程序来做你想做的事情是非常简单的:libA.so.dynamic 部分是一个固定大小的记录表(类型为 ElfW(Dyn)),以 @987654325 的条目结束@。要摆脱特定的DT_NEEDED 条目,只需向上“滑动”所有后续条目(用entry[n+1] 覆盖entry[n] 等)。这将在您的 .dynamic 留下两个 DT_NULL 条目,但什么都不应该关心。

一个复杂的情况是,如果libB.so 包含libA.so 引用的版本化 符号,那么DT_VERNEED 表中将有对libB.so 的额外引用,而这些更难获得摆脱。如果您不摆脱 VERNEED 引用,动态链接器将失败断言。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-20
    • 2012-01-24
    • 2012-02-22
    • 1970-01-01
    • 2012-06-01
    • 2021-12-15
    相关资源
    最近更新 更多