【问题标题】:Hide symbol(s) in Shared Object from LD从 LD 隐藏共享对象中的符号
【发布时间】:2010-09-25 00:10:59
【问题描述】:

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

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

已编辑:链接如下:libclntsh.so->A.so->MAIN

【问题讨论】:

标签: gcc linker solaris shared-libraries ld


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      • 2021-11-04
      • 2012-11-27
      • 1970-01-01
      • 2011-04-25
      • 2013-06-27
      相关资源
      最近更新 更多