【问题标题】:How to load two versions of a library in the same process in Linux?如何在 Linux 的同一进程中加载​​两个版本的库?
【发布时间】:2020-12-30 07:31:24
【问题描述】:

我正在做一个项目,我需要在 Linux 的同一个应用程序中加载同一个库的两个版本。我发现为了能够成功地做到这一点而没有任何库冲突问题,我必须使用自己的导出映射对库的两个版本进行符号版本。看起来如果正在运行的应用程序有这种引用,“name@@nodename”,Linux 中的动态加载器将只在节点名中查找名称,而不是在其他地方。这就是我对两个库进行符号版本的原因得出的结论。这个推理正确吗?是否有任何其他选项可以在同一个应用程序中加载同一个库的两个版本而不会发生库冲突?

【问题讨论】:

    标签: linux dynamic symbols versioning loader


    【解决方案1】:

    如果您控制使用此库的代码,一个简单的操作过程就是升级/降级,因此您不必依赖同一个库的两个不同版本。如果您的项目的另一部分也依赖于该库,或者您对另一个第三方库有同样的问题,那么您将有更多的工作。这可能会减慢您的升级路径。

    如果这是一个大型项目并且两个端点不相关,您可能希望将它们拆分为单独的服务/进程,中间有一些进程间通信 (IPC) 层。例如消息队列、管道或套接字。这种方法被称为微服务架构。在某些方面,此解决方案的扩展性更好,您有 IPC 层引入的开销,但新结构可能更易于理解、调试和测试。

    另一种方法是自己实现这个第三方依赖的功能。您可以满足这两个版本的要求。如果库是开源的,那么一半的工作已经完成了。此选项提供了极大的灵活性,因为您可以根据自己的需要对其进行定制,但代价是开发人员的开销。

    您使用导出映射的解决方案是有效的,但可能难以维护,所以我不推荐它。对于大型库,如果没有脚本,它甚至可能不可行。当您想升级时会发生什么?

    【讨论】:

    • 感谢您的回复。第一个选项对我们来说是不可行的。有不同的用例,每个版本都解决了一组用例,但不是全部:-(。我们确实尝试了 IPC 选项,但它导致了很多性能下降,我们无法进一步进行。
    • @UpanitaGoswami IPC 有多种方法,具体取决于您的目标硬件。如果您受到性能限制,则可以查看共享内存方法。这需要手动同步,并且编写和维护起来很繁琐。我自己没有尝试过,因为通过管道/消息队列传递数据一直就足够了。
    猜你喜欢
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-23
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多