MinGW gcc和Linux gcc的可执行文件大小差异问题

4
我写了这个小的C程序。
#include <stdio.h>

int main() {
    int i = 0;
    while (i < 10){
        printf("%i", i);
        i++;
    }

}

如果我使用MinGW gcc编译它,可执行文件大小为59kb,但如果我使用Linux gcc编译它,通过Ubuntu on Windows shell,可执行文件只有9kb。50kb似乎是额外的数据...为什么会这样呢?


好的,这两个程序的字符串长度是相同的;我最好的猜测是Mingw的stdio.h文件比微软的等效.h文件要大。+1因为我也很好奇。 - Tapper7
我使用反汇编器打开了这两个可执行文件,看起来MinGW添加了一堆额外的函数,151个对比17个!这里是一个函数名称的粘贴板:http://pastebin.com/4dK4FjaU - Nitro
哪个版本的MinGW? - M.M
1个回答

3
根据MinGW维基,可以包含与可执行文件链接的库中的调试信息。您可以使用gcc的“-s”选项或“strip”命令从可执行文件中排除调试信息。

"Gnu style"或"MS style"的printf格式在MinGW stdio和GNU C库stdio之间似乎是不同之处之一。


MinGW

#>  gcc --version
gcc.exe (GCC) 5.3.0

#>  gcc -o printf_gcc_mingw.exe printf.c
#>  gcc -s -o printf_gcc_strip_mingw.exe printf.c
#>  du -ch *.exe
59K     printf_gcc_mingw.exe
45K     printf_gcc_strip_mingw.exe

MinGW-w64

#>  gcc -o printf_gcc.exe printf.c
#>  gcc -s -o printf_gcc_strip.exe printf.c
#>  gcc --version
gcc (tdm64-1) 5.1.0
#>  dir *.exe    
           132,613 printf_gcc.exe
            16,896 printf_gcc_strip.exe     
#>objdump -x printf_gcc_strip.exe 
    DLL Name: msvcrt.dll
    vma:  Hint/Ord Member-Name Bound-To
    85ca       55  __C_specific_handler
    85e2       78  __dllonexit
    85f0       81  __getmainargs
    8600       82  __initenv
    860c       83  __iob_func
    861a       91  __lconv_init
    862a       97  __set_app_type
    863c       99  __setusermatherr
    8650      116  _acmdln
    865a      123  _amsg_exit
    8668      141  _cexit
    8672      252  _fmode
    867c      330  _initterm
    8688      438  _lock
    8690      610  _onexit
    869a      820  _unlock
    86a4     1031  abort
    86ac     1049  calloc
    86b6     1062  exit
    86be     1081  fprintf
    86c8     1088  free
    86d0     1099  fwrite
    86da     1146  malloc
    86e4     1154  memcpy
    86ee     1163  printf
    86f8     1184  signal
    8702     1205  strlen
    870c     1208  strncmp
    8716     1240  vfprintf

Visual Studio 2015

#>  cl /MD printf.c /link  /out:printf_vs.exe
#>  dir *.exe    
             9,728 printf_vs.exe

#>printf_vs.exe
0123456789   

1
你链接到了mingw-w64,它是一个独立于MinGW的项目。 - M.M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接