【问题标题】:Add a dependency to an existing shared object library向现有共享对象库添加依赖项
【发布时间】:2017-01-20 06:10:57
【问题描述】:

假设我有三个库:libMissingSymbol.so、libMiddle.so 和 libSymbolHaver.so。 libMissingSymbol 包含在 libSymbolHaver 中定义的符号,但仅依赖于 libMiddle。 libMiddle 应该依赖于 libSymbolHaver,但它没有。我没有组装这些库的源代码或未链接的目标文件。我是否可以将 libMiddle 与 libSymbolHaver 链接,以便 libMissingSymbol 可以在加载时找到它需要的符号?有什么方法可以只使用这三个共享对象文件和任何必要的工具来解决这个问题?我必须最终得到具有相同内容(包括 SONAME)的库,除非将依赖项更改为 libMiddle,以免在我的项目中进一步破坏。

假设的 readelf 输出(针对相关性进行了修剪)以澄清:

$ readelf -s libMissingSymbol.so
123: 00000000     0 OBJECT  GLOBAL DEFAULT  UND MangledSymbol

$ readelf -d libMissingSymbol.so
Dynamic section at offset 0x42434 contains 37 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libMiddle.so]
 0x0000000e (SONAME)                     Library soname: [libMissingSymbol.so]

$ readelf -d libMiddle.so 
Dynamic section at offset 0x75b28 contains 29 entries:
  Tag        Type                         Name/Value
 0x0000000e (SONAME)                     Library soname: [libMiddle.so]

$ readelf -s libSymbolHaver.so
     35: 00064d0c     4 OBJECT  GLOBAL DEFAULT   22 MangledSymbol

【问题讨论】:

    标签: c++ linker ld


    【解决方案1】:

    我是否可以将 libMiddle 与 libSymbolHaver 链接,以便 libMissingSymbol 可以在加载时找到它需要的符号?

    否:所有 UNIX 链接器,除了 AIX 链接器,都将.so 视为最终链接产品,不能进一步修改。

    更新:

    以不同方式执行此操作的可行性(例如,反编译 libMiddle 并使用正确的依赖项重新构建它)?

    我也不认为这是可行的 - 真的很难修改一个完全链接的 ELF 文件并且不违反无数的内部一致性约束。

    我建议采用以下方法,这很可能会起作用(TM)。

    1. 放弃“仅使用这三个库”的限制。这似乎是人为的和不必要的。

    2. 复制libMiddle.so -> libZiddle.so(请务必在其他地方复制原始libMiddle.so,以防出现问题)。

    3. libZiddle.so 中的SONAME 进行二进制修补以匹配新名称。字符串"libMiddle.so" 位于库的.dynstr 部分,并且(我相信)没有以任何方式进行哈希处理,因此更改其中的一个字母不会在新库中引入任何自相矛盾。

      完成此操作后,比较readelf -a libMiddle.soreadelf -a libZiddle.soSONAME 应该是唯一的区别。

    4. 删除libMiddle.so

    5. 链接一个新的libMiddle.so,其中包含some_unused_function()动态依赖于both libZiddle.so libSymbolHaver.so

    现在任何当前链接到libMiddle.so 并因缺少符号而失败的二进制文件(例如libMissingSymbol.so)都会找到新的(空的)libMiddle.so,但是因为新的libMiddle.so 需要libZiddle.so(其中大多数符号是)libSymbolHaver.so,它应该可以工作。

    【讨论】:

    • 感谢您的回答。您对以不同方式执行此操作的可行性有任何见解(例如,反编译 libMiddle 并使用正确的依赖项重新构建它)?
    • Re: 第 1 点,我有限制,因为这一切的目的是模拟我无法控制的不同执行环境(我有更详细的帖子,更具体论坛here如果你想知道细节)。不过,您的修订使我再次检查了我的情况,我发现了真正的问题:我的库中的版本偏差。我不必尝试您的方法,但我接受您的回答;再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-05
    • 2011-10-01
    • 2011-11-07
    • 2019-11-24
    • 1970-01-01
    • 2012-06-19
    • 2016-02-18
    相关资源
    最近更新 更多