【发布时间】:2023-03-29 03:05:02
【问题描述】:
有谁知道为什么在 dlopen() 中初始化的库会初始化主程序拥有的静态变量。主程序和共享库都有静态变量的副本,但由于某种原因,共享库重新初始化了主程序的静态变量副本并对其进行了破坏,导致主程序尝试破坏时出现段错误。
这是符号表中名称错误的情况吗?
【问题讨论】:
标签: shared-libraries segmentation-fault symbols static-variables dlopen
有谁知道为什么在 dlopen() 中初始化的库会初始化主程序拥有的静态变量。主程序和共享库都有静态变量的副本,但由于某种原因,共享库重新初始化了主程序的静态变量副本并对其进行了破坏,导致主程序尝试破坏时出现段错误。
这是符号表中名称错误的情况吗?
【问题讨论】:
标签: shared-libraries segmentation-fault symbols static-variables dlopen
在这种情况下,运行时链接器只需要进程中符号的单个活动副本。如果共享对象和可执行文件都具有该符号的副本,则运行时链接器将解析对其中之一的所有引用。
您可以做的是在构建共享对象时使用链接编辑器的version command 使用符号缩减来解决此问题。确保静态变量的符号不是全局的,你会得到你正在寻找的行为。
【讨论】:
VERSION { { global: ...; local *; }; },然后我只是在链接器命令行上使用该文件的文件名。