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

Why plugin dynamic library can't find the symbol in the application?

我有一个应用程序,它通过静态link编译了几个库。

并且这个应用程序在运行时会通过dlopen加载一个插件。

但是插件好像无法解析应用中的symbol,我可以通过"nm"找到他们。

那我该怎么办?将库重新编译为共享模式,然后 link 将它们添加到插件中?

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

来自 gcc 文档:

Pass the flag -export-dynamic to the ELF linker, on targets that support it. This instructs the linker to add all symbols, not only used ones, to the dynamic symbol table. This option is needed for some uses of dlopen or to allow obtaining backtraces from within a program.

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

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

因此我建议在链接时通过 -Wl,--dynamic-list 提供显式导出文件(参见 Clang sources 中的示例用法)。