13

我有一个可执行文件和一个动态库(.so)。该库导出一些符号并且可执行文件成功调用它。但我想让库调用可执行文件的功能成为可能。我试图在可执行文件中执行以下操作:

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

这在图书馆:

extern "C" void print(const char *);

但是当我调用dlopen可执行文件(加载库)时,它返回错误undefined symbol: print。我该如何解决?

4

2 回答 2

14

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

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

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

{
    print;
    <other symbols>
};

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

于 2011-06-09T19:52:28.137 回答
4

实现这一点的一种更简单的方法是让可执行文件注册一个函数供库稍后使用,库存储指向该函数的指针,并且可以在以后调用它。

于 2011-06-09T12:11:29.170 回答