运行时共享库是否可以调用现有符号

Can a runtime shared library call existing symbols?

本文关键字:调用 符号 共享 是否 运行时      更新时间:2023-10-16

我有:

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

其中:

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

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

其他注意事项:我需要D和A都能从S调用函数。理想情况下,我不想改变S.

我试过这个,我得到了(当S的符号在D中使用时):

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

我想这可能是:

  1. 现有函数"myFunction(int)"对共享库不可用(安全性?)
  2. 该函数的符号名称以不同的方式进行了名称篡改(EDIT:使用extern "C"进行了测试,并排除了这种情况)

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

感谢

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

相关文章: