8

我有两个第三方库偶尔会导出相同的符号名称。加载可执行文件时,ld通常会选择错误的文件,结果导致我崩溃。我不能对这些库的内容做太多,所以可能有一种方法可以指导ld如何找到正确的实施方式?

操作系统 - Solaris 10,我的程序是由 autoconf/autotools/gcc 构建的,冲突的库是libclntsh(Oracle 驱动程序的一部分)和 OpenLDAP。不幸的是,我不能使用 Oracle 的 LDAP 客户端实现——它缺少 OpenLDAP 的许多功能。

编辑:链接如下:libclntsh.so->A.so->MAIN<-B.so<-libldap_r.so

4

2 回答 2

10

如果您不需要在编译时链接两个共享库(从您的问题中不清楚),您可以使用-Bdirect共享库。这将记录共享库中找到它们的所有符号;如果在运行时出现符号的第二个定义(来自另一个共享库),它将被忽略。

于 2008-12-02T19:39:52.590 回答
4

一种解决方案是将LD_PRELOAD环境变量设置为符号应优先的库。(如果该库具有自己的共享库依赖项,您可能需要预加载其所有依赖项;只需设置LD_PRELOAD为依赖库列表,以空格分隔即可。)

于 2008-12-02T20:09:31.047 回答