在静态和动态链接期间隐藏符号,暴露给 dlsym 以进行动态加载

Hide symbol during static and dynamic linking, expose to dlsym for dynamic loading

有没有办法只向 dlsym 公开符号并在静态和动态链接期间隐藏它?

我想做的是允许目标文件无需修改即可用作共享库或插件。如果目标文件要用作库,则必须避免符号冲突。不幸的是,这意味着当用作插件时,dlsym 将用于初始化插件的函数名称对于每个插件来说必须不同。 CPython 通过将要查找的符号名称 dlsym 与共享对象的文件名相关联来解决此问题。这是一个不错的解决方案,但如果重命名共享对象,它就会中断。

相反,我更希望插件向 dlsym 公开一个通用的初始化函数名称,但如果动态链接共享对象,则忽略此名称。 (在那种情况下,初始化将以其他方式完成。)

编辑: 我搞错了问题的前提。对于导出相同符号的动态库 A 和 B,如果程序链接到这两个库,则不会导致链接器错误。

不,dlsym 和动态链接器共享实现,因此无法在向其他人公开时隐藏符号。

在您的特定情况下,您可以做的是对所有插件使用相同 函数名称(或者,更好的是,导出的字符串文字)。然后你可以迭代 all 加载的共享库并通过 dlsym(handle, common_name).

查询这个函数