【发布时间】:2015-05-21 13:44:47
【问题描述】:
假设我有一个调用库 liba.so 和 libb.so 的应用程序。
这两个库都链接到 libc.so。
如果 licc.so 保留了一些状态信息,那么这个状态对于 liba.so 和 libb.so 是否相同?
如果是,有没有其他办法?
【问题讨论】:
标签: shared-libraries diamond-problem
假设我有一个调用库 liba.so 和 libb.so 的应用程序。
这两个库都链接到 libc.so。
如果 licc.so 保留了一些状态信息,那么这个状态对于 liba.so 和 libb.so 是否相同?
如果是,有没有其他办法?
【问题讨论】:
标签: shared-libraries diamond-problem
这两个库都链接到 libc.so。
libc.so 在 UNIX 上很特别:它是 C 运行时支持库。我假设您并不是真的指 libc.so,而是在问“libfoo.so 和 libbar.so 是否都链接到 libbaz.so ...”。
如果 licc.so 保留了一些状态信息,那么这个状态对于 liba.so 和 libb.so 是否相同?
如果libbaz.so 有私有数据符号int baz,那么baz 将只有一个实例,所以是的:状态将是相同的。
有没有其他办法?
某些操作系统(尤其是 Solaris 和 Linux)允许您使用 dlmopen 将 libfoo.so 和 libbar.so 动态加载到单独的链接器命名空间中。这样做也会加载libbaz.so 两次,并且会有baz 符号的两个实例(副本)。当心:这不是可移植的,很难正确,也很难调试。
【讨论】: