这个“覆盖”是什么?在 MinGW g++可执行的?
我有这个 C++ 文件:
#include <iostream>
int main(int argc, char *argv[]) {
std::cout << "Hello world!\n";
return 0;
}
用 g++ 编译后,我得到一个 913KiB 的大可执行文件。我很惊讶,因为我认为 g++ 足够聪明,不会包含 STL 中程序未使用的任何代码或数据。
接下来,我使用 UPX 进行以下设置:upx --overlay=strip
。此后,可执行文件大小减少至 142KiB,减少了 85%,且速度没有损失(我使用更复杂的数学程序对此进行了测试)。
根据 upx 手册页:
“覆盖”是指在可执行文件的逻辑末尾附加的辅助数据,它通常包含应用程序特定的数据(这是避免额外数据文件的常见做法,尽管最好使用资源部分)。
我找不到任何更具体的信息,并留下了以下问题:
- 这个覆盖层到底是什么?
- 脱衣安全吗?
- 如果是,为什么 g++ 不这样做,即使使用 -Os?
上下文信息:
- Windows 7 Home Premium SP1 64 位
- MinGW 安装有 TDM-GCC
- g++ 版本 4.5.2
- 使用
g++ -Os test.cpp
编译
I have this C++ file:
#include <iostream>
int main(int argc, char *argv[]) {
std::cout << "Hello world!\n";
return 0;
}
After compiling with g++ I get a 913KiB big executable. I was astonished, because I thought g++ would be smart enough to not include any code or data not used by the program from the STL.
Next I used UPX with these settings: upx --overlay=strip
. After this the executable size was reduced to 142KiB
, a reduction of 85% with no speed penalty (I tested this with more complex, mathematical programs).
According to the upx man page:
An "overlay" means auxillary data atached after the logical end of an executable, and it often contains application specific data (this is a common practice to avoid an extra data file, though it would be better to use resource sections).
I couldn't find any info that was more specific and was left with the following questions:
- What exactly is this overlay?
- Is it safe to strip?
- If yes, why doesn't g++ do it, even with -Os?
Contextual information:
- Windows 7 Home Premium SP1 64 bit
- MinGW installed with TDM-GCC
- g++ version 4.5.2
- Compiling with
g++ -Os test.cpp
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
-Os
优化生成的代码的大小,它没有说明可执行文件中的其他非代码段。您是否尝试过使用
-s
链接器选项来去除调试符号,此处?-Os
optimises the generated code for size, it doesn't say anything about other non-code segments in the executable file.Did you try the
-s
linker option to strip debug symbols, suggested here?