【问题标题】:Is there an alternative to RTLD_DEEPBIND flag in dlopen() function for platforms that don't support RTLD_DEEPBIND?对于不支持 RTLD_DEEPBIND 的平台,在 dlopen() 函数中是否有 RTLD_DEEPBIND 标志的替代方法?
【发布时间】:2013-02-07 22:25:19
【问题描述】:

我遇到了第三方库(例如,TP.so)使用不正确的库版本(例如,GenericV1.so)而不是使用它应该使用的库版本(例如,GenericV2.so)的问题。额外的库包含在我的程序中使用。

对此的直接解决方案(在 SO 上有详细记录)是使用带有 RTLD_DEEPBIND 标志的 dlopen()。但该标志仅在 Linux 上有效,在 HP-UX、Solaris、AIX 等其他平台上无效。

在这些非 Linux 平台上使用 RTLD_DEEPBIND 是否有替代方案?

感谢您的回复

【问题讨论】:

  • 我认为问题应该是“如何以兼容 POSIX 的方式替换 RTLD_DEEPBIND?”这将导致您的问题独立于平台实现。

标签: c++ shared-libraries cross-platform posix loading


【解决方案1】:

在我看来,您根本不需要 RTLD_DEEPBIND。您只需要确保具有竞争符号的库以正确的顺序加载。

一些想法:

  1. 您可以使用 LD_PRELOAD 确保在任何其他库之前加载正确的库 (GenericV2.so)。

  2. 您可以创建一个按正确顺序打开库的函数:GenericV2.so,然后是 TP.so。

  3. 是否可以确保 GenericV1.so 永远不会被加载?你需要这个图书馆的任何东西吗?

【讨论】:

    猜你喜欢
    • 2016-05-07
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-24
    • 2023-03-04
    • 1970-01-01
    • 2012-10-31
    • 2019-09-18
    相关资源
    最近更新 更多