Return Styles: Pseud0ch, Terminal, Valhalla, NES, Geocities, Blue Moon. Entire thread

Fucking MingW

Name: Cudder !MhMRSATORI!fR8duoqGZdD/iE5 2012-11-04 9:11

#include <stdio.h>

int main() {
 printf("Hello world!\n");
 return 0;
}


Default MingW compilation+link size: 47KB
Best MingW compilation+link size: 8KB

Default MSVC compilation+link size: 40KB
Best MSVC compilation+link size: 1KB

After postprocessing:
MingW (using MS's linker and libs): 1594 bytes
MSVC: 624 bytes

What the fuck? Am I missing something here?

MingW optimised command line (compile only):
gcc -nostdlib -Os -c -s -o hello.obj hello.c -Wl,--gc-sections,--section-alignment,4096,--file-alignment,512

MingW link command line:
link hello.obj msvcrtlib mainstub.obj /align:4096 /filealign:512 /entry:main /merge:.rdata=.text /merge:.eh_fram=.text /merge:.text.st=.text /section:.text,EWR /stub:mzstub64.exe

mainstub.obj is a dummy __main because libming32.a which is supposed to contain it also contains __CTOR_LIST_ and some other C++ shit. I'm compiling a C program, with gcc, and they force you to link with a bunch of C++ shit? Are you kidding me?

(Why won't it merge the bloody .eh_fram and .text.st sections?!?! Maybe this is a bug of MS's linker since it merges fine with its own compiler output, but the compiler shouldn't be generating .eh_fram and .text.st anyway!)

Executables for your inspecting:
MingW: http://pastebin.com/vZn5WtMz
MSVC: http://pastebin.com/AV63Hr5x

Therefore, I challenge anyone to come up with a smaller Hello World using MingW, and post the commands you used to do it.

Name: Anonymous 2012-11-06 9:34

>>57
By pseudo-instruction I mean it doesn't really do what it says, it does not push just a byte on the stack, push imm8 and push reg32 (with reg32 == imm8) is the same as far as the cpu goes, it's not any more efficient over a dword push if that was your concern.

gcc at -O2 and higher are the same speed as msvc /Ox

Also the reason you see those double indirection for the msvcrt calls is bcause you're linking to the old msvcrt whereas your visual studio presumable uses msvcrt100.dll and have LTO enabled.
If you link your mingw code against the latest libc and add -flto I'm certain you'll get rid of all those .idata indirections.
This is also the reason you see all that .tls stuff, mingw has to insert its own thread safe code because the old msvcrt.dll (that shipped with like win2k) wasn't particular thread safe.

If you want to use latest gcc features that msvc doesn't have I recommend using gcc for the compiler and msvc link (or crinkler if you're into tiny exe's) as your linker.

Newer Posts
Don't change these.
Name: Email:
Entire Thread Thread List