运行时共享库是否可以调用现有符号
Can a runtime shared library call existing symbols?
我有:
- 应用程序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
我想这可能是:
- 现有函数"myFunction(int)"对共享库不可用(安全性?)
- 该函数的符号名称以不同的方式进行了名称篡改(EDIT:使用
extern "C"
进行了测试,并排除了这种情况)
也许我需要使用不同的设置进行编译,或者我必须始终将所有的S链接到D中?如果S本身成为一个动态库,情况还会改变吗?
感谢
库中的外部引用是使用该库的依赖项列表中的库以及以前使用RTLD_GLOBAL标志打开的任何其他库来解析的如果可执行文件链接了标志"-rdynamic"(或同义词"-export dynamic"),则可执行文件中的全局符号也将用于解析动态加载库中的引用。
相关文章:
- 用符号版本替换对函数的所有调用
- 如何从二进制文件中的给定符号中获取调用程序图
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 如何动态加载和调用具有特定于库的类型作为函数参数的符号
- C++:在共享对象中调用抽象基类构造函数/未定义的符号
- G++ 错误:重载的"abs(无符号 int)"的调用不明确
- C++调用lua_dostring来加载具有"require('cjson')"的Lua Scrip引发错误:cjson.so:未定义的符号:lua_getfield
- 调用弱函数符号和强函数符号?
- ld:找不到体系结构x86_64 clang 的符号:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- GDB正在调试一个缺少特定调用堆栈的符号表的核心转储
- 如何从uint8_t的缓冲区读取带符号整数,而不调用未定义或实现定义的行为
- ld:1 个重复符号用于架构x86_64 clang: 错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- 在调用toupper()、tolower()等之前,是否需要转换为无符号字符
- 您如何在2个不同的共享库中调用具有相同符号的函数
- C++ 错误:对 '(std::string {aka std::basic_string}) (<char>无符号整数、字符)的调用不匹配
- 运行时共享库是否可以调用现有符号
- 调用 CString::FormatV 时"%"符号转义
- 错误:调用"开始(常量无符号 int&)"没有匹配函数|
- 符号引用调用模板类的成员函数时出现的错误
- 调用符号来自.so