Краш в TLS в релизной сборке

Тема в разделе "WASM.BEGINNERS", создана пользователем HoShiMin, 12 апр 2017.

  1. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.477
    Адрес:
    Россия, Нижний Новгород
    Добрый день. Есть TLS-каллбэк с printf'ом. В Debug-сборке printf работает, в Release - падает. Почему?
    Код (C++):
    1.  
    2. VOID WINAPI TlsCallback(PVOID Module, DWORD Reason, PVOID Context);
    3.  
    4. #ifdef _WIN64
    5. #pragma comment (linker, "/include:_tls_used")
    6. #pragma comment (linker, "/include:_XLB")
    7. #pragma const_seg(".CRT$XLB")
    8. extern "C" const PIMAGE_TLS_CALLBACK _XLB = TlsCallback;
    9. #pragma const_seg()
    10. #else
    11. #pragma comment (linker, "/include:__tls_used")
    12. #pragma comment (linker, "/include:__XLB")
    13. #pragma data_seg(".CRT$XLB")
    14. extern "C" PIMAGE_TLS_CALLBACK _XLB = TlsCallback;
    15. #pragma data_seg()
    16. #endif
    17.  
    18. VOID WINAPI TlsCallback(PVOID Module, DWORD Reason, PVOID Context) {
    19.     printf("[TLS]: Message from TLS"); // Здесь падаем в Release где-то в недрах EnterCriticalSection
    20. }
    21.  
     
  2. HoShiMin

    HoShiMin Well-Known Member

    Публикаций:
    5
    Регистрация:
    17 дек 2016
    Сообщения:
    1.477
    Адрес:
    Россия, Нижний Новгород
    Разобрался: с /MT CRT инициализируется в EntryPoint, до которого ещё выполнение не дошло