在静态和动态链接期间隐藏符号,向dlsym公开动态加载

时间:2017-01-12 12:41:48

标签: c linux ld elf dynamic-loading

有没有办法只将符号公开给dlsym并在静态和动态链接中隐藏它?

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

相反,我更喜欢插件将公共初始化函数名称公开给dlsym,但是如果共享对象是动态链接的,则忽略此名称。 (在这种情况下,初始化将以其他方式完成。)

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

1 个答案:

答案 0 :(得分:3)

不,dlsym和动态链接器共享实现,因此在暴露给其他符号时不可能隐藏符号。

您可以在特定情况下执行的操作是,对所有插件使用相同的函数名称(或者更好的是,导出的字符串文字)。然后,您可以遍历所有加载的共享库,并通过dlsym(handle, common_name)查询此函数。