【问题标题】:Hide symbol during static and dynamic linking, expose to dlsym for dynamic loading在静态和动态链接期间隐藏符号,暴露给 dlsym 以进行动态加载
【发布时间】: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


【解决方案1】:

不,dlsym 和动态链接器共享实现,因此不可能在向另一个公开时隐藏符号。

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

【讨论】:

    猜你喜欢
    • 2021-12-29
    • 2010-09-15
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多