从LD隐藏共享对象中的符号

时间:2008-12-02 19:19:20

标签: gcc linker solaris shared-libraries ld

我有两个第三方库偶尔会导出相同的符号名称。加载可执行文件时, ld 通常会选错,因此我会崩溃。我不能对这些库的内容做太多,所以可能有一种方法可以指示 ld 如何找到合适的文件?

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

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

2 个答案:

答案 0 :(得分:10)

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

答案 1 :(得分:4)

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