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

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

背景: 切换到 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 标识符字符串。

c++ windows gcc linker mingw
1个回答
0
投票

您看到的一些字符串只是 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
© www.soinside.com 2019 - 2024. All rights reserved.