如何从我的库中调用可执行文件中的函数?

mil*_*ilo 12 c linux dlopen

我有一个可执行文件和一个动态库(.so).该库成功导出一些符号和可执行调用.但我希望库调用可执行文件的功能.我试过在可执行文件中做以下操作:

//test
extern "C" void print(const char * str) {
    std::cout << str << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

这在图书馆:

extern "C" void print(const char *);
Run Code Online (Sandbox Code Playgroud)

但是当我调用dlopen可执行文件(加载库)时,它返回错误undefined symbol: print.我该怎么办呢?

nin*_*alj 13

在Linux/ELF中,您可以将-export-dynamic选项传递给链接器(-rdynamic在编译器驱动程序上gcc),以便将可执行文件中的符号导出到共享对象.

print的库中有一个虚拟实现,它会被可执行文件的实现所遮蔽,因为通常在共享对象之前搜索可执行文件以进行符号解析.

这样做的缺点是它不是很细,你最终可能会覆盖一些你不想要的符号.更细粒度的选项是创建要导出的符号列表:

{
    print;
    <other symbols>
};
Run Code Online (Sandbox Code Playgroud)

并将该列表传递给链接器,例如从gcc: -Wl,--dynamic-list=<file with list of symbols>