Fix tls dll
This commit is contained in:
parent
6f9fbb2a7d
commit
0abeeaed28
@ -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"}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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
93
src/tlsdll/tlssup.cpp
Normal 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"
|
Loading…
Reference in New Issue
Block a user