【发布时间】:2021-06-11 00:45:56
【问题描述】:
我有一个静态链接 glib 库并动态链接 共享库 的程序,该共享库反过来也静态链接相同的 glib 库。当我运行程序时,我得到一个段错误。在gdb 中调试后,我发现glib 中定义了一个global static 变量,该变量正在设置中,并且它在一个调用跟踪和以后的调用跟踪中具有不同的值。然后我注意到变量地址也不同。所以看起来global static 变量有两个副本?可执行文件不应该覆盖共享库中的符号,以便在动态链接期间可执行文件中只有一个全局静态变量吗?
故事的另一部分是另一个可执行文件与上述相同,它的行为似乎正常,即没有段错误(尚未调试以查看不同的代码路径是否加载相同的静态变量)。所以也许这种行为不是确定性的。
Linux 上的gcc (8.3.1) (centos 7) 出现以下问题。
executableA (segfault) executableB (no segfault)
| \ | \
| (static) \(shared) |(static) \(shared)
| \ | \
libglib-2.0.a libA.so libglib-2.0.a libA.so
| |
| (static) |(static)
| |
libglib-2.0.a libglib-2.0.a
【问题讨论】:
-
请注意,共享库是我从源代码构建的第三方库。
标签: gcc linker static-linking dynamic-linking