我已經生成了我的.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