GCC 输出文件的大小似乎太大

Posted

技术标签:

【中文标题】GCC 输出文件的大小似乎太大【英文标题】:GCC output file's size seems too big 【发布时间】:2018-03-22 03:12:35 【问题描述】:

我有以下代码(file.c):

int main() 

我去gcc file.c,输出文件file.exe26.5KB 我也尝试了-O2-Ofast-Os,但大小保持不变。我没有包含任何标题,什么都没有;我什至尝试输入int main(void)

输出文件不应该是大约1KB吗? [我使用的是 Windows 10 - GCC 4.8.1]


上下文:

我正在尝试了解 PE 文件在 windows 中的工作方式,到目前为止,我认为我已经很好地掌握了这个概念,所以我想运行一些测试,因为我希望能够从另一个文件中获取代码,假设是file2.exe,并尝试使用OllyDBG 将其潜入file.exe。但是由于这段几乎为 NULL 的代码产生了一个可怕的 26.5KB,我真的不知道该怎么办......

【问题讨论】:

不要添加--static;你真的会吓坏的。 它什么也没做,我猜是因为我没有包含任何库 好吧,如果你对 PE 文件及其格式有很好的(或者更确切地说,非常出色的)知识,你总是可以尝试类似于this hack for ELF 的东西。我不推荐它,只是出于好奇。 我会检查一下,但是这个问题(看似过大的输出文件)已经困扰我多年了,直到现在我才有实际理由更彻底地寻找答案 顺便说一句,如果你想“偷偷”一些有效载荷到可执行文件中,检测原始文件是否更小不是更容易,因为这将是一个(相对)大的变化大小? 【参考方案1】:

有很多项被添加到文件中以使其可执行。

在以下示例中,在 Linux 16.04 上

gcc 版本:gcc (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609

我在一个 文件名为 untitled2.c

int main(void)



然后编译成untitled2.o

gcc -ggdb  -Wall -Wextra  -Wconversion -std=gnu11 -pedantic -Wmissing-prototypes  -c untitled2.c   -o untitled2.o -I. 

然后将其链接到 untitleed2

gcc -ggdb  -std=gnu11 -o untitled2 untitled2.o  

这是结果。

-rw-r--r-- 1 rkwill root      22 Mar 21 20:41 untitled2.c
-rw-rw-r-- 1 rkwill rkwill  2608 Mar 21 20:41 untitled2.o
-rwxrwxr-x 1 rkwill rkwill 16904 Mar 21 20:41 untitled2

I.E.原始源文件为 22 字节。编译文件为2608字节(无优化参数)可执行文件为16904字节

strip文件(删除调试信息)会稍微减小文件大小,但不足以消除大小的显着差异。

【讨论】:

在编译行中使用-v 会告诉你更多关于正在发生的事情——特别是关于链接阶段使用的额外文件。

以上是关于GCC 输出文件的大小似乎太大的主要内容,如果未能解决你的问题,请参考以下文章

如何解决OBS屏幕录制输出的视频文件太大问题

文件大小过多的 Java

用 gcc 编译 C 程序;无法打开输出文件 _.exe:没有这样的文件或目录

改变图形大小(Rstudio、Rmarkdown、Shiny)

GCC 中 -x 标志的输入和输出“语言”是啥意思?

如何从GCC /铿锵声组件输出中消除“噪音”?