Fix tls dll

This commit is contained in:
Maurice Heumann 2022-12-03 21:12:08 +01:00
parent 6f9fbb2a7d
commit 0abeeaed28
4 changed files with 114 additions and 1 deletions

View File

@ -310,6 +310,13 @@ project "tlsdll"
kind "SharedLib"
language "C++"
symbols 'Off'
exceptionhandling "Off"
flags {"NoRuntimeChecks", "NoBufferSecurityCheck", "OmitDefaultLibrary"}
buildoptions {"/Zc:threadSafeInit-"}
removebuildoptions {"/GL"}
linkoptions {"/NODEFAULTLIB", "/IGNORE:4210"}
files {"./src/tlsdll/**.rc", "./src/tlsdll/**.hpp", "./src/tlsdll/**.cpp", "./src/tlsdll/resources/**.*"}
includedirs {"./src/tlsdll", "%{prj.location}/src"}

View File

@ -1,3 +1,6 @@
#define WIN32_LEAN_AND_MEAN
#include "Windows.h"
#define TLS_PAYLOAD_SIZE 0x2000
thread_local char tls_data[TLS_PAYLOAD_SIZE];
@ -5,3 +8,13 @@ __declspec(dllexport) void* get_tls_data()
{
return &tls_data[0];
}
int WINAPI _DllMainCRTStartup(const HMODULE module, const unsigned long reason, void*)
{
if (reason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(module);
}
return 1;
}

View File

@ -60,7 +60,7 @@ BEGIN
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", "X Labs"
VALUE "CompanyName", "momo5502"
VALUE "FileDescription", "TLS index allocation dll"
VALUE "FileVersion", "1.0.0.0"
VALUE "InternalName", "TLS DLL"

93
src/tlsdll/tlssup.cpp Normal file
View File

@ -0,0 +1,93 @@
/***
*tlssup.cpp - Thread Local Storage run-time support module
*
* Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*
****/
#undef CRTDLL
#undef MRTDLL
#pragma section(".CRT$XLA", long, read) // First Loader TLS Callback
#pragma section(".CRT$XLC", long, read) // CRT TLS Constructor
#pragma section(".CRT$XLD", long, read) // CRT TLS Terminator
#pragma section(".CRT$XLZ", long, read) // Last Loader TLS Callback
#pragma section(".rdata$T", long, read)
#define _CRTALLOC(x) __declspec(allocate(x))
//#include <internal_shared.h>
#include <Windows.h>
extern "C" {
/* Thread Local Storage index for this .EXE or .DLL */
ULONG _tls_index = 0;
ULONG _tls_array = 0;
/* Special symbols to mark start and end of Thread Local Storage area. */
#pragma data_seg(".tls")
#if defined(_M_X64)
_CRTALLOC(".tls")
#endif /* defined (_M_X64) */
char _tls_start = 0;
#pragma data_seg(".tls$ZZZ")
#if defined(_M_X64)
_CRTALLOC(".tls$ZZZ")
#endif /* defined (_M_X64) */
char _tls_end = 0;
#pragma data_seg()
/* Start section for TLS callback array examined by the OS loader code.
* If dynamic TLS initialization is used, then a pointer to __dyn_tls_init
* will be placed in .CRT$XLC by inclusion of tlsdyn.obj. This will cause
* the .CRT$XD? array of individual TLS variable initialization callbacks
* to be walked.
*/
_CRTALLOC(".CRT$XLA") PIMAGE_TLS_CALLBACK __xl_a = 0;
/* NULL terminator for TLS callback array. This symbol, __xl_z, is never
* actually referenced anywhere, but it must remain. The OS loader code
* walks the TLS callback array until it finds a NULL pointer, so this makes
* sure the array is properly terminated.
*/
_CRTALLOC(".CRT$XLZ") PIMAGE_TLS_CALLBACK __xl_z = 0;
#ifdef _WIN64
_CRTALLOC(".rdata$T")
extern const IMAGE_TLS_DIRECTORY64 _tls_used = {
(ULONGLONG)&_tls_start, // start of tls data
(ULONGLONG)&_tls_end, // end of tls data
(ULONGLONG)&_tls_index, // address of tls_index
(ULONGLONG)(&__xl_a + 1), // pointer to call back array
(ULONG)0, // size of tls zero fill
(ULONG)0 // characteristics
};
#else /* _WIN64 */
_CRTALLOC(".rdata$T")
extern const IMAGE_TLS_DIRECTORY _tls_used = {
(ULONG)(ULONG_PTR)&_tls_start, // start of tls data
(ULONG)(ULONG_PTR)&_tls_end, // end of tls data
(ULONG)(ULONG_PTR)&_tls_index, // address of tls_index
(ULONG)(ULONG_PTR)(&__xl_a + 1), // pointer to call back array
(ULONG)0, // size of tls zero fill
(ULONG)0 // characteristics
};
#endif /* _WIN64 */
} // extern "C"