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

Gcc 从LD隐藏共享对象中的符号,gcc,linker,solaris,shared-libraries,ld,Gcc,Linker,Solaris,Shared Libraries,Ld,我有两个第三方库,偶尔会导出相同的符号名。加载可执行文件时,ld通常会选择错误的文件,结果导致崩溃。我对这些库的内容做不了太多,所以有没有办法指导ld如何找到合适的实现 我的程序是由autoconf/autotools/gcc构建的,冲突的库是libclntsh(Oracle驱动程序的一部分)和OpenLDAP。不幸的是,我不能使用Oracle的LDAP客户端实现——它缺少OpenLDAP的许多特性 编辑:链接如下:libclntsh.so->A.so->MAIN如果您不需要在编译时在两个共享库

我有两个第三方库,偶尔会导出相同的符号名。加载可执行文件时,ld通常会选择错误的文件,结果导致崩溃。我对这些库的内容做不了太多,所以有没有办法指导ld如何找到合适的实现

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


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

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

Hi Dmitry。看看显然,您可以使用删除共享对象的符号。