回复:27楼
PCXPRJ的gcc-4.6.x又发现一个很严重的问题, 编译成dll后, 如果加载时需要重定位, 会导致不正确, 跟踪发现是这里(DLL初始化代码):
10001410 /$>push ebp
10001411 |.>mov ebp,esp
10001413 |.>push ebx
10001414 |.>sub esp,14
10001417 |.>mov ebx,[<&KERNEL32.GetModuleHandleA>] ; |kernel32.GetModuleHandleA
1000141D |.>mov dword ptr [esp],1010A000 ; |ASCII "libgcc_s_dw2-1.dll"
10001424 |.>call ebx ; \GetModuleHandleA
10001426 |.>mov edx,0 ; 这里的0是会重定位的值,如果重定位就不是0,导致下面call edx不正常
1000142B |.>sub esp,4
1000142E |.>test eax,eax ; |
10001430 |.>je short 10001448 ; 这里会跳转 ; |
10001432 |.>mov dword ptr [esp+4],1010A013 ; |ASCII "__register_frame_info"
1000143A |.>mov [esp],eax ; |
1000143D |.>call [<&KERNEL32.GetProcAddress>] ; \GetProcAddress
10001443 |.>sub esp,8
10001446 |.>mov edx,eax
10001448 |>>test edx,edx
1000144A |.>je short 1000145D ; 重定位时edx不是0
1000144C |.>mov dword ptr [esp+4],1012E004
10001454 |.>mov dword ptr [esp],1011A000
1000145B |.>call edx