You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

静态链接stdc++fs的SO偶发filesystem::path析构崩溃问题排查

静态链接stdc++fs的SO偶发filesystem::path析构崩溃问题

我用GCC 8.4编译了Linux共享对象libmyso.so,其中静态链接了stdc++fs。这个SO在装有更新版stdc++运行时的系统上运行时表现不稳定:有时正常工作,有时会在filesystem::path析构时崩溃。

我已明确符号版本不兼容是崩溃根源,但困惑于问题的偶发性——后来发现,只要让另一个C++共享对象先于我的SO加载,就能稳定复现崩溃。

正常加载场景

通过JNI加载libmyso.so时,Java程序捕获的符号绑定日志如下:

binding file /lib64/libstdc++.so.6 [0] to /lib64/libstdc++.so.6 [0]: normal symbol `_ZNSt10filesystem4path14_M_split_cmptsEv' [GLIBCXX_3.4.26]
//later on
binding file libmyso.so [0] to libmyso.so [0]: normal symbol `_ZNSt10filesystem4path14_M_split_cmptsEv'

此时libmyso.so使用自身静态链接的_ZNSt10filesystem4path14_M_split_cmptsEv符号,运行无异常。

异常加载场景

通过LD_PRELOAD强制先加载LLVM(模拟其他C++库优先加载的场景)时,符号绑定日志变为:

binding file /lib64/libstdc++.so.6 [0] to /lib64/libstdc++.so.6 [0]: normal symbol `_ZNSt10filesystem4path14_M_split_cmptsEv' [GLIBCXX_3.4.26]
//later on
binding file libmyso.so [0] to /lib64/libstdc++.so.6 [0]: normal symbol `_ZNSt10filesystem4path14_M_split_cmptsEv'

此时libmyso.so绑定到了系统libstdc++.so.6中的同名符号,随后触发filesystem::path析构崩溃。

核心疑问

为什么在异常场景下,libmyso.so没有使用自身静态链接的_ZNSt10filesystem4path14_M_split_cmptsEv符号,反而会绑定到系统库的版本?


内容的提问来源于stack exchange,提问作者Philip Miller

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 12:33:13