[Bug target/101933] Unloaded dll with global std::mutex causes exe to crash on exit
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101933 Paul Jackson changed: What|Removed |Added Resolution|--- |INVALID Status|UNCONFIRMED |RESOLVED --- Comment #4 from Paul Jackson --- I debugged it a bit more, and I found out that: 1. It's happening when exceptions are involved. 2. It's actually a bug of TDM-GCC. For details, please see my second comment in the GitHub issue: https://github.com/jmeubank/tdm-gcc/issues/38#issuecomment-912876481
[Bug target/101933] Unloaded dll with global std::mutex causes exe to crash on exit #38
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101933 --- Comment #3 from Paul Jackson --- Maybe I'm missing something, but even this dll crashes for me now. So it seems like it has nothing to do with global variables or static storage. That sucks, it means that I just can't use C++ in dlls. Or is it? How come nobody noticed it before? I hope that I'm missing something here. ``` #include void x() { std::vector v; v.push_back(2); } ```
[Bug target/101933] Unloaded dll with global std::mutex causes exe to crash on exit #38
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101933 --- Comment #2 from Paul Jackson --- I tried to work around the problem, and it's even worse than I expected. You can replace dll.cc with the following and observe the same crash. That means that even if I want to do manual memory management with raw pointers, I can't. Please, consider fixing at least this. ``` #include struct { std::vector v; } *test; void x() { if (test) { test->v.push_back(2); } } ```
[Bug c++/101933] New: Unloaded dll with global std::mutex causes exe to crash on exit #38
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101933 Bug ID: 101933 Summary: Unloaded dll with global std::mutex causes exe to crash on exit #38 Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: mailnew4ster at gmail dot com Target Milestone: --- Reproduction on Windows: Create and compile dll.cc as following: ``` #include std::mutex x; ``` g++.exe dll.cc -shared -o test.dll Create and compile exe.cc as following: ``` #include int main() { auto x = LoadLibrary("test.dll"); MessageBox(0,0,0,0); FreeLibrary(x); MessageBox(0,0,0,0); return 0; } ``` g++.exe exe.cc -o test.exe Run test.exe and observe a crash after seeing both message boxes. The crash happens in msvcrt.doexit, which tries to call a cleanup function inside the dll which was already freed. I'm using TDM-GCC, and I also reported the issue there: https://github.com/jmeubank/tdm-gcc/issues/38 I'm not sure whether it's specific to TDM-GCC, it applies some patches on GCC, but they are very small and I think they probably don't affect this issue.