为什么插件动态库在应用程序中找不到符号?

问题描述 投票:3回答:2

我有一个应用程序,该应用程序已通过静态链接编译了几个库。

并且此应用程序将在运行时通过dlopen加载插件。

但是似乎插件无法解析应用程序中的符号,我可以通过“ nm”找到它们。

那我该怎么办?将库重新编译为共享模式,并将其链接到插件?

c dlopen
2个回答
3
投票

链接应用程序时必须使用gcc标志-rdynamic,该标志会导出应用程序的符号以与共享库进行动态链接。

从gcc文档:

在支持它的目标上,将标志-export-dynamic传递给ELF链接器。这指示链接器将所有符号(不仅是已使用的符号)添加到动态符号表中。对于dlopen的某些用途或为了从程序内部获取回溯,此选项是必需的。

这应该可以解决您的问题。


3
投票

通常添加-rdynamic的建议在实践中过于繁重,因为它会导致链接器将可执行文件中的all函数导出。这会减慢程序的启动速度(由于[C​​0]),更重要的是,最终会使应用程序和插件之间的接口变得太宽,因此将来将很难维护(例如,您将无法删除函数,担心某些未知的外部插件可能会使用它)。通常,您应该努力为插件作者提供一个最小且定义明确的API。

因此,我建议在链接时通过increased time for relocation processing提供显式导出文件(请参阅-Wl,--dynamic-list中的示例用法。
© www.soinside.com 2019 - 2024. All rights reserved.