以下是引用TonyDeng在2012-12-23 21:30:10的发言:
VC编译的.exe文件小,是因为它实际上调用的是VC运行库.DLL,大量的函数不是在.exe中的,而gcc编译出来的.exe是把所有用到的机器码都嵌入在.exe中。那是传统的内嵌本机代码,一切可执行码都在一个文件中,亦即两个.exe用到printf()函数,那么printf()函数的可执行码就有两份,分别占用磁盘空间,而使用动态运行库的程序,只有一份printf()可执行码存在于磁盘上。在安装时,一次过把VC的运行库都放在磁盘上,看起来占了很多空间,不及传统用多少抽取多少包装的文件小,但却忘记了如果有大量这种程序的话,累计起来占用的磁盘空间就远远超过动态运行库只占一次那些了,何况,如果某个公共函数改码,就必须所有发行程序都跟着重新发行一次。
程序代码:
//gcc -Wall a.c
#include <stdio.h>
int main(void)
{
printf("gcc没你想的那么笨\n");
return 0;
}
004013B0
55
PUSH EBP
004013B1
89E5
MOV EBP,ESP
004013B3
83E4 F0
AND ESP,FFFFFFF0
004013B6
83EC 10
SUB ESP,10
004013B9
E8 D2050000
CALL a.00401990
004013BE
C70424 64304000 MOV DWORD PTR SS:[ESP],a.00403064
; gcc没你想的那么笨
004013C5
E8 36080000
CALL <JMP.&msvcrt.puts>
004013CA
B8 00000000
MOV EAX,0
004013CF
C9
LEAVE
004013D0
C3
RETN
00401BF8
- FF25 28614000
JMP DWORD PTR DS:[<&msvcrt.signal>]
; msvcrt.signal
00401BFE
90
NOP
00401BFF
90
NOP
00401C00
- FF25 24614000
JMP DWORD PTR DS:[<&msvcrt.puts>]
; msvcrt.puts
00401C06
90
NOP
00401C07
90
NOP
00401C08
- FF25 1C614000
JMP DWORD PTR DS:[<&msvcrt.fwrite>]
; msvcrt.fwrite
77C118D5 >
6A 18
PUSH 18
77C118D7
68 0047BE77
PUSH msvcrt.77BE4700
77C118DC
E8 3F5BFFFF
CALL msvcrt.77C07420
77C118E1
834D E0 FF
OR DWORD PTR SS:[EBP-20],FFFFFFFF
77C118E5
BE A0FCC277
MOV ESI,msvcrt.77C2FCA0
77C118EA
56
PUSH ESI
77C118EB
6A 01
PUSH 1
77C118ED
E8 22A0FFFF
CALL msvcrt.77C0B914
77C118F2
59
POP ECX
77C118F3
59
POP ECX
win平台下C是调用的微软的运行时的
可执行模块, 条目 1
基址=77BE0000
大小=00058000 (360448.)
入口=77BEF2A1 msvcrt.<模块入口点>
名称=msvcrt
(系统)
文件版本=7.0.2600.5512 (xpsp.080413-2111
路径=C:\WINDOWS\system32\msvcrt.dll