Re: Windows Vista での不具合2007年01月23日 00時39分39秒

-lmsvcr71をつければ単純なプログラムでは問題が解決しました。
しかし、namazu.exe の場合は

C:\> objdump -p namazu.exe | grep dll
DLL Name: KERNEL32.dll
DLL Name: msvcrt.dll
DLL Name: msvcr71.dll
DLL Name: msvcrt.dll

のように msvcrt.dll もリンクされてしまっています。
gcc のspecsファイルを書き換えても msvcrt.dll がリンクされてしまいます。

両方リンクされていると、spawn で(メモリ関係の)不具合が生じるようで、実行途中で落ちました。

それではということで、MinGw でコンパイルするのをあきらめ、VC++ でコンパイルすることを考えています。

そこで、次のような単純なプログラムをVC++でコンパイルしてテストしてみました。
(ワイルドカード展開するには setargv.obj をリンクします。)

#include <stdio.h>
#include <stdlib.h>

main(int argc, char *argv[])
{
int i;

for (i = 0; i < argc; i++) {
fprintf(stdout, "%d [%s]\n", i, argv[i]);
}
}

すると VC++ 2005 だと msvcr80.dll とリンクされるためか、Windows Vista でなくても、期待する正しい動作はしないことがわかりました。
仕方がないので VC++ 6.0 でコンパイルすると、Windows Vista でも期待する動作となりました。

どうやら、msvcr80.dll 辺りの仕様変更(か、バグ)が今回の原因のようです。

ということで、次は namazu.exe を VC++ 6.0 でコンパイルして試してみようと思います。