有谁知道为什么在 dlopen() 中初始化的库会初始化主程序拥有的静态变量。主程序和共享库都有一个静态变量的副本,但是由于某种原因,共享库重新初始化了主程序的静态变量副本并对其进行了破坏,从而在主程序尝试破坏它时导致了段错误。
这是符号表中名称错误的情况吗?
有谁知道为什么在 dlopen() 中初始化的库会初始化主程序拥有的静态变量。主程序和共享库都有一个静态变量的副本,但是由于某种原因,共享库重新初始化了主程序的静态变量副本并对其进行了破坏,从而在主程序尝试破坏它时导致了段错误。
这是符号表中名称错误的情况吗?
在这种情况下,运行时链接器只需要进程中符号的单个活动副本。如果共享对象和可执行文件都具有该符号的副本,则运行时链接器将解析对其中之一的所有引用。
解决此问题的方法是在构建共享对象时使用链接编辑器的版本命令使用符号缩减。确保静态变量的符号不是全局的,你会得到你正在寻找的行为。