在静态和动态链接期间隐藏符号,暴露给 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)
.
查询这个函数
有没有办法只向 dlsym
公开符号并在静态和动态链接期间隐藏它?
我想做的是允许目标文件无需修改即可用作共享库或插件。如果目标文件要用作库,则必须避免符号冲突。不幸的是,这意味着当用作插件时,dlsym
将用于初始化插件的函数名称对于每个插件来说必须不同。 CPython 通过将要查找的符号名称 dlsym
与共享对象的文件名相关联来解决此问题。这是一个不错的解决方案,但如果重命名共享对象,它就会中断。
相反,我更希望插件向 dlsym
公开一个通用的初始化函数名称,但如果动态链接共享对象,则忽略此名称。 (在那种情况下,初始化将以其他方式完成。)
编辑: 我搞错了问题的前提。对于导出相同符号的动态库 A 和 B,如果程序链接到这两个库,则不会导致链接器错误。
不,dlsym 和动态链接器共享实现,因此无法在向其他人公开时隐藏符号。
在您的特定情况下,您可以做的是对所有插件使用相同 函数名称(或者,更好的是,导出的字符串文字)。然后你可以迭代 all 加载的共享库并通过 dlsym(handle, common_name)
.