gpt4 book ai didi

linux - 第二次插件崩溃时再次引用代码段

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:04:19 26 4
gpt4 key购买 nike

在我处理的问题案例中,我想了解 Linux 机器上的动态链接器/加载器行为。

我们崩溃的代码作为插件加载 (dlopen(libwrapper.so, RTLD_GLOBAL))。 libwrapper.so 只是一个薄层,它加载了另一个插件来完成真正的工作。这些插件可以命名为:P1 和 P2,它们中的每一个都依赖于名为 F 的公共(public)库(所有这些都非常简化)。

Wrapper (libwrapper.so) 被引入以允许在没有 RTLD_GLOBAL 的情况下加载 Pn,因为该标志集会导致加载 Pns 时出现明显的链接问题(它们具有相同的 API)。 RTLD_DEEPBIND 不是一个选项,因为目标平台太旧 - 不支持它。

令我们惊讶的是,问题在 P2 加载时出现在 F 库中(当 P1 已经加载(并初始化)并且 F 作为其隐式依赖项时)。在显式加载 P2 时 (dlopen(libP2.so, RTLD_LOCAL | RTLD_NOW)),动态链接器报告没有问题,但是调用 F 中的代码以实例化 F 中定义的某些类型实例(再次)导致在各个地方出现段错误(万一一个被跳过/注释掉,它会在另一个地方崩溃——因此没有花时间调查可能有问题的代码模式,因为怀疑有更普遍的问题/误解)。没有使用内联函数,代码与 -Wl、-E 链接,默认可见性,GCC 是 3.4.4..F 代码非常稳定,在独立应用程序中使用或过去作为插件的一部分。

我想将 F 链接为静态库以解决动态链接器可能存在的任何问题,但结果是一样的。

我对这个话题的看法:

  • 将 F 链接为动态库导致动态链接器“知道”F 在第二次加载 P2 时被引用并且只是递增引用计数器并且不调用静态初始化器(这没问题),但会进行重定位(再次,这似乎有问题)。
  • 将 F 链接为静态库会导致动态链接器加载 F 代码作为 P2 (P2F) 的静态链接部分,并在 P2F 中进行重定位。然而,“不知何故”来自 F 的常用符号被 P1F 代码实例弄乱了。

关于使代码至少工作的解决方法的假设:

  • 在单个共享库(单个插件)中链接 P1 ... Pn,F 是否共享/静态无关紧要。这样,任何搬迁都只进行一次。

如果我对这个主题的看法有误/过于简化/遗漏重要部分,我将不胜感激?这是过去已知的 GCC/binutils 错误吗?

最佳答案

My view on the topic:

你对题目的看法是错误的;但没有办法向您证明这一点。

编写一个最小的测试用例来模拟您的系统所做的事情,并且仍然以类似的方式崩溃。用实际损坏的代码更新您的问题;然后我们可以确切地告诉您问题出在哪里。

还有一个很好的机会,将问题简化为最小的例子,您自己就会发现问题所在。

无论哪种方式,您都会理解问题,并且会学到新东西。

关于linux - 第二次插件崩溃时再次引用代码段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15625445/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com