这个“覆盖”是什么?在 MinGW g++可执行的?

发布于 2024-12-06 16:48:03 字数 965 浏览 1 评论 0原文

我有这个 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

明月松间行 2024-12-13 16:48:03

-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?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文