主程序和共享库在__static_initialization_and_destruction_0中初始化相同的静态变量

时间:2010-04-13 17:57:55

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

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

这是一个在符号表中出现错误名称错误的情况吗?

1 个答案:

答案 0 :(得分:7)

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

解决此问题的方法是在构建共享对象时使用链接编辑器的version command进行符号缩减。确保静态变量的符号不是全局的,您将获得您正在寻找的行为。