从汇编角度识别与还原静态局部变量
msvc x86
.text:00468FC1 mov eax, large fs:2Ch ;这一段代码不知道有啥用,反正每次都会跳入00469033
.text:00468FC7 mov ecx, TlsIndex
.text:00468FCD mov byte ptr [ebp+var_4], 7
.text:00468FD1 mov ecx, [eax+ecx*4]
.text:00468FD4 mov eax, dword_5F0AE0
.text:00468FD9 cmp eax, [ecx+0Ch]
.text:00468FDF jg short loc_469033
.text:00469033 push offset dword_5F0AE0
.text:00469038 call __Init_thread_header
.text:0046903D add esp, 4
.text:00469040 cmp dword_5F0AE0, 0FFFFFFFFh
.text:00469047 jnz short loc_468FE1
.text:00469049 push 0 ; <<
.text:0046904B mov ecx, offset mainWindowHelper
.text:00469050 mov byte ptr [ebp+var_4], 8
.text:00469054 call sub_44DE60 ; 局部静态变量
.text:00469059 push offset sub_4A6EF0
.text:0046905E call _atexit ; <<
.text:00469063 push offset dword_5F0AE0
.text:00469068 mov byte ptr [ebp+var_4], 7
.text:0046906C call __Init_thread_footer
.text:00469071 add esp, 8
两个 << 之间就是静态局部变量初始化代码
dword_5F0AE0是判断是否初始化的标志,若dword_5F0AE0为0xFFFFFFFF则表示为初始化,所以在比较初始化标志的判断后是静态局部变量的初始化代码
在末尾会将dword_5F0AE0调用__Init_thread_footer初始化,所以00469063之前为静态局部变量的初始化代码