【发布时间】:2017-05-27 13:56:56
【问题描述】:
有没有办法只向dlsym 公开符号并在静态和动态链接期间隐藏它?
我想做的是允许无需修改即可用作共享库或插件的目标文件。如果目标文件将可用作库,则必须避免符号冲突。不幸的是,这意味着当用作插件时,dlsym 将用于初始化插件的函数名称对于每个插件必须不同。 CPython 通过将符号名称dlsym 与共享对象的文件名相关联来解决这个问题。这是一个不错的解决方案,但如果重命名共享对象,它就会中断。
相反,我希望插件向dlsym 公开一个通用初始化函数名称,但如果共享对象被动态链接,则该名称将被忽略。 (在这种情况下,可以通过其他方式进行初始化。)
编辑:我弄错了问题的前提。对于导出相同符号的动态库 A 和 B,如果程序链接到这两个库,则不会导致链接器错误。
【问题讨论】:
-
我认为不可能,唯一的解决方案是创建两个库。 stackoverflow.com/questions/2222162/….
-
最简单的解决方案是不链接你的图书馆。
-
@tofro 嗯?问题实际上是在问我如何允许这些库被链接。
-
@Praxeolitic 一个 dll 可以是在链接期间未链接的插件,也可以是(共享)库,然后它需要符合某些要求 - 没有重复的符号,例如.你想要 both 而这是不可能的。你可以做的是创建一个 linkable 库,作为一种加载插件的前端。这将符合这两个要求。
标签: c linux ld elf dynamic-loading