Вопросы по процессу загрузки dll
От: tdiff  
Дата: 09.06.15 09:54
Оценка:
У меня тут несколько вопросов по работе 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

Отредактировано 09.06.2015 11:37 tdiff . Предыдущая версия . Еще …
Отредактировано 09.06.2015 11:33 tdiff . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.