现代C/C++编译器为何生成额外冗余段?能否让GCC/LLVM取消?
现代编译器生成额外段的问题与疑问
我是一名底层开发人员兼逆向工程师,在分析恶意软件及Windows平台下LLVM、GCC/G++等编译器编译的软件时,发现现代编译器会向输出的二进制文件中添加大量未被实际使用的额外段,导致文件体积大幅增加。
GCC编译示例
使用以下命令编译并精简二进制:
gcc -fPIC -march=native -O3 cleaner.c strip a.exe
编译后生成的a.exe中存在诸多额外段,但程序实际仅用到.text和.data段,最终文件大小约为40KB(段预览显示包含多个非必要段)。
TCC编译对比
使用Tiny C Compiler编译同一程序:
tcc.exe -lpsapi cleaner.c
生成的二进制功能完全一致,但文件大小仅2.5KB,且不存在那些额外段(段预览仅包含必要的核心段)。
核心疑问
- 为何现代编译器会生成这些看似臃肿的额外段?
- 能否让LLVM、GCC/G++停止生成这类未被使用的额外段?
我原本期望简单程序的二进制仅包含.text和.data段,但实际编译产物中还存在.rdata、.tls、.reloc等段,它们显著增大了文件体积却未被程序实际调用。
UPDATE:有评论称这些额外段十分重要且被程序使用,但通过IDA或十六进制编辑器查看时,能看到段内存在大量零字节及占用空间的无用内容——程序实际运行仅依赖
.text中的代码和.data中的静态数据(十六进制dump显示段内存在大量填充的零字节)。
内容的提问来源于stack exchange,提问作者acessor
相关产品推荐
相关产品推荐

