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

C 在静态和动态链接期间隐藏符号,向dlsym公开以进行动态加载,c,linux,ld,elf,dynamic-loading,C,Linux,Ld,Elf,Dynamic Loading,是否有办法仅向dlsym公开符号,并在静态和动态链接期间隐藏它 我想做的是允许对象文件可以作为共享库或插件使用,而无需修改。如果要将对象文件用作库,则必须避免符号冲突。不幸的是,这意味着当用作插件时,dlsym将用于初始化插件的函数名称对于每个插件都必须不同。CPython通过将符号名dlsym将查找的符号名与共享对象的文件名相关联来解决此问题。这是一个正常的解决方案,但如果重命名共享对象,它将中断 相反,我更希望插件向dlsym公开一个公共初始化函数名,但如果共享对象被动态链接,则忽略该名称。

是否有办法仅向
dlsym
公开符号,并在静态和动态链接期间隐藏它

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

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


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

否,dlsym和动态链接器共享实现,因此在向另一个库公开符号时,无法向其中一个库隐藏符号


相反,在您的特定情况下,您可以为所有插件使用相同的函数名(或者更好的是,使用导出的字符串文字)。然后您可以迭代所有加载的共享库,并通过
dlsym(handle,common_name)
查询此函数。我认为这是不可能的,唯一的解决方案是创建两个库。最简单的解决方案是不要链接到您的库。@tofro-Huh?问题是我如何允许这些库被链接。@praxelitic一个dll可以是一个在链接期间没有被链接的插件,也可以是一个(共享)库,然后它需要符合某些要求-例如,没有重复的符号。你想要两者,但这是不可能的。你可以做的是创建一个可链接的库,作为加载插件的前端。这将符合这两项要求。