【发布时间】:2011-03-15 01:16:40
【问题描述】:
我有一个应用程序与第三方供应商 VENDOR1 的库 libfoo 的版本 X 静态链接。它还与来自不同第三方供应商 VENDOR2 的动态(共享)库 libbar 链接,该库静态链接来自 VENDOR1 的 libfoo 版本 Y。
所以 libbar.so 包含版本 Y 的 libfoo.a 而我的可执行文件包含版本 X 的 libfoo.a libbar 仅在内部使用 libfoo,并且没有 libfoo 对象从我的应用程序传递到 libbar。
在构建时没有错误,但在运行时应用程序段错误。原因似乎是版本 X 使用的结构与版本 Y 的大小不同,并且运行时链接器似乎混淆了哪个由哪个使用。
VENDOR1 和 VENDOR2 都是封闭源代码,所以我无法重建它们。
有没有办法构建/链接我的应用程序,使其始终解析为版本 X,而 libbar 始终解析为版本 Y,并且两者从不混合?
【问题讨论】:
-
你能让你的应用动态链接到 VENDOR1 吗?
-
绝不是语言中立的。这对于编译器链接器和操作系统来说是非常具体的,它们是如何一起工作的。最简单的方法是给两个供应商发电子邮件,看看他们是如何解决这个问题的。
-
我们目前的想法是,至少在 Linux 上,使用带有 RTLD_DEEPBIND 标志的 libbar.so 上的 dlopen()。另一种可能性是将使用 libfoo.a 的应用程序分离到一个共享库 libbaz.so 中,它包装了 libfoo.a 的使用,然后让应用程序 dlopen libbaz.so 和 libbar.so 与我们认为可能保留所有的 RTLD_LOCAL内部的重复符号。这可能适用于 linux,但我们需要它,因此也适用于 Solaris、AIX 和 HPUX。
-
哎呀哎呀。不幸的是,不,在 Linux 上没有“简单”的解决方法。