背景: 切换到 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对这些字符串的来源和用途有什么想法吗?其中一些是另一个版本的后缀版本,例如
UWVSH
是 AWAVAUATUWVSH
的最后一部分。它们没有出现在任何头文件中,但我在一个刚刚对矩形进行一些数学运算的类的目标文件中找到了它们。
问题:
注意:我估计通过删除重复项可以节省大约 5 KiB,所以我主要只是好奇。
更新1: 使用
int main(){}
编译 gcc -Os -s -fno-ident
会得到一个 17 KiB 的可执行文件,其中包含字符串 AUATUWVSH
两次。它还包含 26 次 GCC 标识符字符串。
您看到的一些字符串只是 x64 代码。例如“AWAVAUATUWVSH”实际上是将一些寄存器压入堆栈的可执行代码。它反汇编成这样(左列是该“字符串”的十六进制表示形式):
4157 push r15
4156 push r14
4155 push r13
4154 push r12
55 push rbp
57 push rdi
56 push rsi
53 push rbx