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" kind "SharedLib"
language "C++" 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/**.*"} files {"./src/tlsdll/**.rc", "./src/tlsdll/**.hpp", "./src/tlsdll/**.cpp", "./src/tlsdll/resources/**.*"}
includedirs {"./src/tlsdll", "%{prj.location}/src"} 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 #define TLS_PAYLOAD_SIZE 0x2000
thread_local char tls_data[TLS_PAYLOAD_SIZE]; thread_local char tls_data[TLS_PAYLOAD_SIZE];
@ -5,3 +8,13 @@ __declspec(dllexport) void* get_tls_data()
{ {
return &tls_data[0]; 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 BEGIN
BLOCK "040904b0" BLOCK "040904b0"
BEGIN BEGIN
VALUE "CompanyName", "X Labs" VALUE "CompanyName", "momo5502"
VALUE "FileDescription", "TLS index allocation dll" VALUE "FileDescription", "TLS index allocation dll"
VALUE "FileVersion", "1.0.0.0" VALUE "FileVersion", "1.0.0.0"
VALUE "InternalName", "TLS DLL" 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"