I'm compiling a software project for windows and linux, using mingw and gcc.  Platform-specific code is very minimal.  The app has no resources to speak of, the executable is essentially 100% code.  What I find when I finish the compile is the following executable sizes

linux release executable:  1,766,572 bytes
linux debug executable: 16,613,930 bytes
win32 release executable: 2,726,912 bytes
win32 debug executable: 98,052,647 bytes !!!!

I find it very difficult to believe that a 2.7 MB executable needs an additional 95 MB (!) of debugging symbols to be useful in gdb.  This is not a difference between debug and release as far as compiled in code.  After i586-mingw32-strip of the win32 debug executable, it's left as a 2,144,768 byte executable. That tells me that there are in fact 95M of debug symbols in there.  Am I missing some sort of strange -g option that causes it to emit an executable with sane debug symbols?  Any advice about ways of getting this under control?

Command options for the various make stages of the build process I'm using are as follows:

i586-mingw32-gcc -pipe -O -mthreads -D_WIN32 -c -o x.o x.cpp
i586-mingw32-ar -cr y.a x.o
i586-mingw32-gcc -pipe -s -O -mthreads -D_WIN32 -o z.exe blahblahblah

i586-mingw32-gcc -pipe  -g -D_DEBUG -mthreads -D_WIN32 -c -o x.o x.cpp
i586-mingw32-ar -cr y.a x.o
i586-mingw32-gcc -pipe -g -D_DEBUG -mthreads -D_WIN32 -o z.exe blahblahblah

i386-redhat-linux-gcc -pipe -O -pthread -D_REENTRANT -D_LINUX -c -o x.o x.cpp
i386-redhat-linux-ar -cr y.a x.o
i386-redhat-linux-gcc -pipe -s -O -pthread -D_REENTRANT -D_LINUX -o z.exe blahblahblah

i386-redhat-linux-gcc -pipe -g -D_DEBUG -pthread -D_REENTRANT -D_LINUX -c -o x.o x.cpp
i386-redhat-linux-ar -cr y.a x.o
i386-redhat-linux-gcc -pipe -g -D_DEBUG -pthread -D_REENTRANT -D_LINUX -o z.exe blahblahblah