我已经生成了我的.C
源文件的汇编列表。而在C源代码我已经实现TLS是这样的:MASM无法识别我的TLS回调
char *msg = "callback";
void NTAPI tls_callback(PVOID DllHandle, DWORD dwReason, PVOID lpVd)
{
MessageBoxA(0,msg,msg,0);
}
#ifdef _WIN64
#pragma comment (linker, "/INCLUDE:_tls_used")
#pragma comment (linker, "/INCLUDE:tls_callback_func")
#else
#pragma comment (linker, "/INCLUDE:__tls_used")
#pragma comment (linker, "/INCLUDE:_tls_callback_func")
#endif
#ifdef _WIN64
#pragma const_seg(".CRT$XLF")
EXTERN_C const
#else
#pragma data_seg(".CRT$XLF")
EXTERN_C
#endif
PIMAGE_TLS_CALLBACK tls_callback_func = tls_callback;
#ifdef _WIN64
#pragma const_seg()
#else
#pragma data_seg()
#endif
__declspec(thread) char *tlsData = "tls static data";
我公司生产的这款C文件的汇编列表,和TLS现在这个样子:
PUBLIC [email protected]
PUBLIC _tls_callback_func
PUBLIC _tlsData
_TLS SEGMENT
_tlsData
DB 00H
DB 00H
DB 00H
DB 00H
DB 00H
DB 40H
DB 30H
DB 80H
_TLS ENDS
CRT$XLF SEGMENT
_tls_callback_func DD FLAT:[email protected]
CRT$XLF ENDS
_TEXT SEGMENT
_DllHandle$ = 8 ; size = 4
_dwReason$ = 12 ; size = 4
_lpVd$ = 16 ; size = 4
[email protected] PROC ; COMDAT
push ebp
mov ebp, esp
mov edx, DWORD PTR _msg
push 0
push edx
push edx
push 0
call DWORD PTR [email protected]
; Line 34
pop ebp
ret 12 ; 0000000cH
[email protected] ENDP
_TEXT ENDS
我不明白的是,然而TLS模式产生的,我在IDA抬头PRO模式应该是:
.rdata:004921A8 __tls_used dd offset __tls_start
.rdata:004921AC TlsEnd_ptr dd offset __tls_end
.rdata:004921B0 TlsIndex_ptr dd offset __tls_index
.rdata:004921B4 TlsCallbacks_ptr dd offset _tls_callback_func
.rdata:004921B8 TlsSizeOfZeroFill dd 0
.rdata:004921BC TlsCharacteristics dd 100000h
那么,我需要定义一个新的TLS段,并把这些行话在那里?或者它应该在数据部分?
我编译它是这样的:
ml.exe listing.asm /coff
我已经看过了内部国际开发协会专业生产文件,我看到TLS目录并没有产生可言,我怎么告诉MASM或其链接制作目录?
我无法找到链接器或汇编程序生成TLS目录的任何选项。可能最快的解决方法是将TLS结构放在某个段(即段)中,让链接器生成一个符号映射并编写一个脚本来读取映射文件并修补可执行文件。 –
千万不要尝试装配和使用Microsoft C/C++编译器的汇编输出。我不知道这是否是这种情况,但通常由Microsoft C/C++编译器生成的程序集输出不完整且不正确。你的目标是拥有一个称为TLS回调的程序集或C++函数吗? –
@RossRidge从程序集中使用tls使用masm – YakibutaRamen