【问题标题】:how to call function in executable from my library?如何从我的库中调用可执行文件中的函数?
【发布时间】:2011-06-09 12:04:00
【问题描述】:

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

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

这个在图书馆里:

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

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

【问题讨论】:

    标签: c linux dlopen


    【解决方案1】:

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

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

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

    {
        print;
        <other symbols>
    };
    

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

    【讨论】:

    • @milo:我添加了一种从可执行文件中导出符号的更细粒度的方法。
    • 非常感谢!我想我最好阅读“dso howto”以获得更多关于共享对象的综合知识。
    • 向其他主要平台说几句话就好了。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-10-21
      • 1970-01-01
      • 2020-07-16
      • 1970-01-01
      • 1970-01-01
      • 2017-04-27
      • 1970-01-01
      • 2019-01-23
      相关资源
      最近更新 更多