【问题标题】:Main Program and Shared Library initializes same static variable in __static_initialization_and_destruction_0主程序和共享库在 __static_initialization_and_destruction_0 中初始化相同的静态变量
【发布时间】:2023-03-29 03:05:02
【问题描述】:

有谁知道为什么在 dlopen() 中初始化的库会初始化主程序拥有的静态变量。主程序和共享库都有静态变量的副本,但由于某种原因,共享库重新初始化了主程序的静态变量副本并对其进行了破坏,导致主程序尝试破坏时出现段错误。

这是符号表中名称错误的情况吗?

【问题讨论】:

    标签: shared-libraries segmentation-fault symbols static-variables dlopen


    【解决方案1】:

    在这种情况下,运行时链接器只需要进程中符号的单个活动副本。如果共享对象和可执行文件都具有该符号的副本,则运行时链接器将解析对其中之一的所有引用。

    您可以做的是在构建共享对象时使用链接编辑器的version command 使用符号缩减来解决此问题。确保静态变量的符号不是全局的,你会得到你正在寻找的行为。

    【讨论】:

    • Hrm,我似乎在实现版本脚本并将其传递给链接器时遇到了问题。它抱怨语法错误。这是我使用的脚本文件:“{ global: local: *; }” 有什么想法吗?我找了一些例子,但它们似乎都没有通过语法检查。还是直接把asm指令放在源码中更好?
    • @Paul - 我的脚本看起来像 VERSION { { global: ...; local *; }; },然后我只是在链接器命令行上使用该文件的文件名。
    • @Samuel - 非常感谢,在完成版本脚本并向全局上下文添加几个符号后,它现在可以工作了!
    • @samuel:哇,我不知道!我有一个类似的问题。您知道动态链接器如何选择一个符号而不是另一个符号吗?或者关于它的任何好的链接?谢谢。
    • 我不明白。同一个变量怎么会有两个副本?什么变量被实例化了两次,一次在主可执行文件中,一次在 SO 中?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 2011-01-31
    • 2010-09-17
    相关资源
    最近更新 更多