为什么现代 C/C++ 编译器将额外未使用的数据放入输出二进制文件中?

问题描述 投票:0回答:1

我是一名低级开发人员和逆向工程师。在调查使用不同编译器(例如适用于 Windows 的 LLVM GCC/G++)编译的恶意软件和软件时,我发现现代编译器将额外的未使用部分添加到已编译的二进制文件中,从而大大增加了其大小。示例:

gcc -fPIC -march=native -O3 cleaner.c
strip a.exe

在输出二进制文件中,我们看到这些部分,而实际上程序真正使用的只有 .data 和 .text。因此,程序大小约为 40 kb。

Sections preview for GCC

但是,如果我们使用 TCC(Tiny C 编译器)编译相同的程序,我们会得到一个工作原理完全相同的二进制文件,但它的大小只有 2.5 kb,并且没有那些额外的部分。

tcc.exe -lpsapi cleaner.c

Sections preview for TCC

所以问题是 - 为什么现代编译器如此臃肿,是否有可能使 LLVM GCC/G++ 编译器停止创建这些编译器?

通过编译一个简单的二进制文件,我希望它只有 .text 和 .data 部分,但它也有 .rdata、.tls、.reloc 和其他部分,这些部分增加了可执行文件的大小,但并没有真正在程序本身。

c gcc linker llvm portable-executable
1个回答
0
投票

这是退化,兄弟。现在每个人都对性能和大小优化变得如此漠不关心,以至于将 helloworld.py 和 python.exe 粘合在一起以获得需要 TB RAM 的繁琐程序集被认为是常态 💀

© www.soinside.com 2019 - 2024. All rights reserved.