4

我有一个非常小的 C 程序可以反转文件。它在 Windows 上编译exe为大小为 28,672 字节的文件。

  • 减小文件大小的最佳方法是什么?
  • 有没有什么工具可以告诉我什么占用的空间最多?(包括库)
  • 对于这么简单的程序,这个大小正常吗?
  • 我应该使用哪些编译器标志来减小文件大小(/O1并且/Os似乎没有任何效果)?

顺便说一句 - 编译时gcc我得到大约 50Kb 的文件,编译时cl我得到 28Kb。

编辑:这是代码

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

int main(int argc, char *argv[])
{
   FILE *fi, *fo;

   char *file1, file2[1024];
   long i, length;
   int ch;

   file1 = argv[1];

   file2[0] = 0;
   strcat(file2, file1);
   strcat(file2, ".out");

   fo = fopen(file2,"wb");
   if( fo == NULL )
   {
      perror(file2);
      exit(EXIT_FAILURE);
   }

   fi = fopen(file1,"rb");
   if( fi == NULL )
   {
      fclose(fo);
      return 0;
   }

   fseek(fi, 0L, SEEK_END);
   length = ftell(fi);
   fseek(fi, 0L, SEEK_SET);

   i = 0;
   while( ( ch = fgetc(fi) ) != EOF ) {
      fseek(fo, length - (++i), SEEK_SET);
      fputc(ch,fo);
   }

   fclose(fi);
   fclose(fo);
   return 0;
}

更新:

  • 编译/MD产生一个 16Kb 的文件。
  • tcc(Tiny C Compiler) 编译产生一个 2Kb 的文件。
  • 编译gcc -s -O2产生了一个 8Kb 的文件。
4

4 回答 4

6

尝试使用 tcc 编译它:http: //bellard.org/tcc/

于 2012-11-20T15:19:46.843 回答
3
#include <stdio.h>

让实现了自己版本的 stdio 函数的人说:它们很大,而且有些相互依赖。链接其中一个会自动链接到其他几个。

由于这是一次性成本,并且在大型应用程序的范围内无关紧要,因此大多数库都不会费心优化它。

话虽如此,编译成动态链接的可执行文件而不是静态的可执行文件通常是要走的路。如果您必须有一个静态链接的可执行文件,您可能需要查看为嵌入式环境优化的库之一,因为它们更专注于像这样的小尺寸优化。

于 2012-11-20T15:24:04.990 回答
1

您使用哪些库?除了标准库之外,您不需要任何库来反转 C 中的文件。那么你的可执行文件应该不超过 2kb。

但是,如果我编译:

int main()
{
    return 0;
}

使用 MinGW,可执行文件的大小等于 48kb。但我没有使用任何优化标志。

编辑:使用 -s 标志,它减少到 7,5 kb。

于 2012-11-20T15:22:55.837 回答
1

查看-sgcc 标志:

-s 从可执行文件中删除所有符号表和重定位信息。

我正在开发的小型 C 程序测试:

没有-s: 120,2 Kib

-s含:58,3 基布

通过从可执行文件中删除死代码:

通过使用-fdata-sections -ffunction-sections,编译器会将未使用的函数放入分隔部分,通过使用-Wl,--gc-sections将被链接删除。

现在的文件大小是:50,2 Kib

经过-O2

做很多优化,但不增加文件大小,通常,不像。

现在的文件大小是:42,1 KiB

gcc 有太多-O*的优化有利于文件大小。

于 2012-11-20T15:38:12.600 回答