我有两个第三方库偶尔会导出相同的符号名称。加载可执行文件时, ld 通常会选错,因此我会崩溃。我不能对这些库的内容做太多,所以可能有一种方法可以指示 ld 如何找到合适的文件?
OS - Solaris 10,我的程序由autoconf / autotools / gcc构建,冲突的库是 libclntsh (Oracle驱动程序的一部分)和OpenLDAP。遗憾的是,我不能使用Oracle的LDAP客户端实现 - 它缺乏OpenLDAP的许多功能。
编辑:链接如下:libclntsh.so-> A.so-> MAIN< -B.so< -libldap_r.so
答案 0 :(得分:10)
如果在编译时不需要在两个共享库中链接(从您的问题中不清楚),则可以使用-Bdirect
作为共享库。这将记录共享库中找到它们的所有符号;如果然后在运行时出现符号的第二个定义(来自其他共享库),它将被忽略。
答案 1 :(得分:4)
一种解决方案是将LD_PRELOAD
环境变量设置为其符号优先的库。 (如果该库具有自己的共享库依赖项,则可能需要预加载其所有依赖项;只需将LD_PRELOAD
设置为依赖库的列表,用空格分隔。)