有没有办法只将符号公开给dlsym
并在静态和动态链接中隐藏它?
我想要做的是允许目标文件可以作为共享库或插件使用而无需修改。如果目标文件可用作库,则必须避免符号冲突。不幸的是,这意味着当用作插件时,dlsym
将用于初始化插件的函数的名称对于每个插件必须是不同的。 CPython通过将符号名称dlsym
相关联来解决此问题,将查找共享对象的文件名。这是一个很好的解决方案,但如果重命名共享对象则会中断。
相反,我更喜欢插件将公共初始化函数名称公开给dlsym
,但是如果共享对象是动态链接的,则忽略此名称。 (在这种情况下,初始化将以其他方式完成。)
编辑:我误解了这个问题的前提。使用导出相同符号的动态库A和B,如果程序链接到它们,则不会导致链接器错误。
答案 0 :(得分:3)
不,dlsym和动态链接器共享实现,因此在暴露给其他符号时不可能隐藏符号。
您可以在特定情况下执行的操作是,对所有插件使用相同的函数名称(或者更好的是,导出的字符串文字)。然后,您可以遍历所有加载的共享库,并通过dlsym(handle, common_name)
查询此函数。