如何从我的库中调用可执行文件中的函数?
- 2024-10-30 08:35:00
- admin 原创
- 186
问题描述:
我有一个可执行文件和一个动态库 (.so)。该库导出一些符号,可执行文件成功调用它。但我想让库调用可执行文件的函数。我尝试在可执行文件中执行以下操作:
//test
extern "C" void print(const char * str) {
std::cout << str << std::endl;
}
这是图书馆里的:
extern "C" void print(const char *);
但是当我调用dlopen
可执行文件(加载库)时,它返回错误undefined symbol: print
。我该如何修复它?
解决方案 1:
在 Linux/ELF 中,您可以将-export-dynamic
选项传递给链接器(-rdynamic
在编译器驱动程序上gcc
),以便将可执行文件中的符号导出到共享对象。
您的库中会有一个虚拟print
实现,它将被可执行文件上的实现所掩盖,因为通常在共享对象之前搜索可执行文件以进行符号解析。
这种方法的缺点是粒度不够细,你可能最终会覆盖一些你不想要的符号。更细粒度的选项是创建一个要导出的符号列表,如下所示:
{
print;
<other symbols>
};
并将该列表传递给链接器,例如从 gcc:-Wl,--dynamic-list=<file with list of symbols>
解决方案 2:
实现此目的的一个更简单的方法是让可执行文件注册一个函数以供库稍后使用,库存储指向该函数的指针,并可能在稍后调用它。
相关推荐
热门文章
项目管理软件有哪些?
热门标签
云禅道AD