【问题标题】:Can a runtime shared library call existing symbols?运行时共享库​​可以调用现有符号吗?
【发布时间】:2012-07-14 21:31:07
【问题描述】:

我有:

  • 应用A
  • 动态库D
  • 静态库S

地点:

  • A 在编译时与静态库 S 链接。
  • D 编译时不链接 S,但使用它的头文件
  • A 使用dlopen 在运行时加载 D。

D 在 A 中运行时是否可以使用 S 中定义的符号,而 D 在其自己的编译时不与 S 链接? IE。 D 可以访问全局命名空间中的符号吗?

其他说明: 我需要 D 和 A 都能够从 S 调用函数。 理想情况下,我不想改变 S。

我已经尝试过了,我得到了(当 D 中使用 S 中的符号时):

dyld: lazy symbol binding failed: Symbol not found: __Z14myFunctioni

我想这可能是:

  1. 现有函数“myFunction(int)”不适用于共享库(安全性?)
  2. 此函数的符号名称已以不同的方式命名(编辑:用extern "C" 测试并排除了这一点)。

也许我需要使用不同的设置进行编译,或者我必须始终将所有 S 链接到 D?如果 S 本身成为一个动态库,情况也会改变吗?

谢谢

【问题讨论】:

  • 如果问题在于名称修改,请尝试在 myFunction 的函数声明中使用 extern "C" 禁用名称修改。
  • 感谢 Radek,我现在已经根据您的建议排除了这种可能性。这一定是符号可访问性问题。

标签: c++ symbols dylib


【解决方案1】:

使用该库的依赖项列表中的库以及之前使用 RTLD_GLOBAL 标志打开的任何其他库来解析库中的外部引用。 如果可执行文件与标志“-rdynamic”(或同义词“--export-dynamic”)链接,则可执行文件中的全局符号也将用于动态解析引用加载库。

【讨论】:

  • 好的,这就解决了!谢谢你!但我现在揭示了下一个问题:以前未在应用程序中使用的符号不包含在链接阶段。有免费的旗帜吗? --whole-archive 似乎是前进的方向,但还没有工作。
猜你喜欢
  • 2011-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
  • 2011-05-12
  • 2011-01-09
  • 2021-07-27
相关资源
最近更新 更多