【问题标题】:symbol versioning and dlsym符号版本控制和 dlsym
【发布时间】:2011-04-07 21:12:31
【问题描述】:

我使用dlopen 在我的程序中加载pthread 库,并使用dlsym 获取pthread_createpthread_join 的处理程序。

如何确保两个处理程序的版本兼容?我不在乎符号是新版本还是旧版本。我只希望我使用的任何pthread_create 都能与我得到的pthread_join 一起工作。

我知道有一个 dlvsym 可以向其传递明确的版本号,但我不关心确切的版本号,因为我希望我的代码独立于库版本。

【问题讨论】:

  • 我相信您可以放心地假设 same 库提供的 pthread_create 和 pthread_join 将是兼容的。
  • 问题是 dlsym 会返回兼容的符号。我没有在命令行链接库,而是使用 dlopen 和 dlsym 来获取处理程序。
  • 迟到了,但是阅读以上内容,我想知道 - 我不明白使用 dlopen 而不是将其留给传统的隐式动态链接,与Erik 的评论——如果您使用 dlopen 来获取您选择的库的句柄,请放心,_join_create 几乎可以保证相互协作,因为它们是同一个动态库的一部分从源代码构建的对象,它们被设计为相互协作?
  • 可能已经晚了,但您应该知道 libpthread 是一种特殊的野兽:如果您的程序最初是在没有 libpthread 的情况下编译/链接的,那么如果您尝试使用 libpthread 运行时(例如来自插件或使用 dlopen/dlsym)。

标签: c linker shared-libraries


【解决方案1】:

版本控制存在的唯一原因是在 ABI 兼容性方面的尝试与针对 ancient 版本的 glibc 编译的程序的 ABI 兼容性不佳,这实际上无论如何都不会工作。 (据我所知,他们已经默默地破坏了 ABI 至少一次,无法兼容。)请忽略它。

【讨论】:

    【解决方案2】:

    听起来您需要“dladdr - 查找包含给定地址的共享对象”。

    但是由于您没有说明您使用的是什么平台,所以它可能不可用。

    看看吧..

    【讨论】:

    • 谁能帮我在dlvsym中传递“版本”
    猜你喜欢
    • 2011-06-28
    • 2016-09-26
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    相关资源
    最近更新 更多