fix VC perlglob.exe segv with wrong default libc
commit "win32: separate $Config{ccflags} and $Config{optimize}"
4be1bfd74 removed -Md and -MDd from $(OPTIMIZE), so perlglob.exe whose
build recipe is special in that it is compiled and linked in 1 step lost
the -Md flag, this causes "stdout" global var that is linked in from MSVC
libc to resolve to a broken symbol and segv since the FILE * is a pointer
to machine code instead to a FILE struct in the CRT DLL. This is with MSVC
2003 32b CC.
Disassembly shows that after that commit perlglob.exe is
push 8000h
mov edi, offset __imp____getmainargs
push edi ; File
call _fileno_0
which is a pointer to machine code instead of
mov eax, ds:__imp___iob
add eax, 20h
push 8000h ; int
push eax ; File
call ds:__imp___fileno
where _iob is a pointer to start of static global array of FH structs in
MS CRT.
-Md controls ".drectve" section in .obj file that contains
"/DEFAULTLIB:"MSVCRT"" (proper) or "/DEFAULTLIB:"LIBC"" (SEGV)
crash stack
ntdll.dll!_RtlpWaitForCriticalSection@4
ntdll.dll!_RtlEnterCriticalSection@4
msvcr71.dll!_lock_file
msvcr71.dll!fwrite
perlglob.exe!main
perlglob.exe!mainCRTStartup
kernel32.dll!_BaseProcessStart@4
The CS struct is gibberish because the FILE * is gibberish.