我有一个应用程序,该应用程序已通过静态链接编译了几个库。
并且此应用程序将在运行时通过dlopen加载插件。
但是似乎插件无法解析应用程序中的符号,我可以通过“ nm”找到它们。
那我该怎么办?将库重新编译为共享模式,并将其链接到插件?
链接应用程序时必须使用gcc标志-rdynamic
,该标志会导出应用程序的符号以与共享库进行动态链接。
从gcc文档:
在支持它的目标上,将标志-export-dynamic传递给ELF链接器。这指示链接器将所有符号(不仅是已使用的符号)添加到动态符号表中。对于dlopen的某些用途或为了从程序内部获取回溯,此选项是必需的。
这应该可以解决您的问题。
通常添加-rdynamic
的建议在实践中过于繁重,因为它会导致链接器将可执行文件中的all函数导出。这会减慢程序的启动速度(由于[C0]),更重要的是,最终会使应用程序和插件之间的接口变得太宽,因此将来将很难维护(例如,您将无法删除函数,担心某些未知的外部插件可能会使用它)。通常,您应该努力为插件作者提供一个最小且定义明确的API。
-Wl,--dynamic-list
中的示例用法。