У меня тут несколько вопросов по работе dll.
1. Я в курсе, что в С++ нет порядка инициализации статических переменных. Тогда, раз конструкторы статических объектов вызываются под loader lock (на msvc это внутри _CRT_INIT), значит, dll загружаются в случайном порядке?
2. Почему в dll плохо иметь глобальные статические переменные, конструктор которых, например, обращается к malloc?
Может оказаться, что crt ещё не загружена? Система не может догадаться, что в этом случае надо сначала загрузить crt, а потом уже библиотеку? Или есть какая-то фаза "инициализации CRT", которая происходит отдельно от её загрузки?
3. Если мы загружаем библиотеку в run-time, то проблема может возникнуть только если мы её загружаем в процесс, который использует другую crt или вообще её не использует?
4. Деструкторы глобальных статических объектов в dll имеют все те же проблемы?
5. Есть ли какая-то разница в этом вопросе между linux/windows?
6. Как правильно реализовать в dll функциональность, аналогичную глобальной переменной
static thread_local std::string some_dll_global_string;
?
UPD (про windows):
http://stackoverflow.com/questions/27383635/crt-initialization-and-dllmain
вот примерно такие же размышления, что и у меня. Пишут, что п.2 возможен, если мы принудительно поменяем dll entrypoint руками, то есть это довольно специфичный случай, случайно не получится.
Ещё не очень понятно зачем:
"The _DllMainCRTStartup function does several things, including calling _CRT_INIT, which initializes the C/C++ run-time library
"
если
The dynamic CRT's own runtime state is initialized by the CRT DLL's own entrypoint, the Windows loader ensures it runs first