为什么EXE二进制文件中有这么多重复的字符串?

时间:2017-05-06 12:50:41

标签: c++ windows gcc linker mingw

后台:切换到CMake后,我发现可执行文件的大小增加了三倍,达到1.3 MiB。 (在使用MinGW64的Windows上)使用工具浏览EXE我通过查看包含的字符串注意到一些明显的错误,例如意外使用调试模式和静态链接其中一个库。在与-s链接后,它降至可接受的200 KiB。

问题:但是我仍然看到很多重复的字符串。例如: GCC: (x86_64-posix-seh-rev0, Built by MinGW-W64 project) 5.2.0 为什么重复50次,不能只共享相同的字符串而不是重复它?

让我更加好奇的是许多奇怪的字符串也是重复的,例如:

([^_]
X[^_]A\A]
fffff.
UWVSH
AWAVAUATUWVSH

此处的完整列表:https://pastebin.com/YBdhau0Y有关这些字符串来自何处以及它们用于何种内容的任何想法?其中一些是另一个的后缀版本,例如UWVSHAWAVAUATUWVSH的最后一部分。它们没有出现在任何头文件中,但我在对象文件中找到了一个只对矩形进行了数学运算的类。

问题:

  • 为什么不能在文件中共享这些字符串?或者我该如何制作它们?
  • 包含编译器信息的目的是什么?
  • 我看到的所有奇怪的字符串是什么?

注意:我估计通过删除重复数据可以节省大约5 KiB,所以我只是很好奇。

UPDATE1: 使用int main(){}编译gcc -Os -s -fno-ident会得到一个17 KiB可执行文件,其中包含两次字符串AUATUWVSH。它还包含GCC标识符字符串26次。

0 个答案:

没有答案