【问题标题】:Shared library: state and diamond共享库:状态和钻石
【发布时间】:2015-05-21 13:44:47
【问题描述】:

假设我有一个调用库 liba.so 和 libb.so 的应用程序。

这两个库都链接到 libc.so。

如果 licc.so 保留了一些状态信息,那么这个状态对于 liba.so 和 libb.so 是否相同?

如果是,有没有其他办法?

【问题讨论】:

    标签: shared-libraries diamond-problem


    【解决方案1】:

    这两个库都链接到 libc.so。

    libc.so 在 UNIX 上很特别:它是 C 运行时支持库。我假设您并不是真的指 libc.so,而是在问“libfoo.solibbar.so 是否都链接到 libbaz.so ...”。

    如果 licc.so 保留了一些状态信息,那么这个状态对于 liba.so 和 libb.so 是否相同?

    如果libbaz.so 有私有数据符号int baz,那么baz 将只有一个实例,所以是的:状态将是相同的。

    有没有其他办法?

    某些操作系统(尤其是 Solaris 和 Linux)允许您使用 dlmopenlibfoo.solibbar.so 动态加载到单独的链接器命名空间中。这样做也会加载libbaz.so 两次,并且会有baz 符号的两个实例(副本)。当心:这不是可移植的,很难正确,也很难调试。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-07
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多