MinGW g ++可执行文件中的这个“叠加”是什么?

时间:2011-09-26 14:46:08

标签: g++ size executable

我有这个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 man page

  

“覆盖”表示在可执行文件的逻辑结束之后缓存的辅助数据,它通常包含特定于应用程序的数据(这是避免额外数据文件的常见做法,尽管使用资源部分会更好)。

我找不到任何更具体的信息,并留下以下问题:

- 这个叠加到底是什么?

- 剥离是否安全?

- 如果是,为什么g ++不这样做,即使是-Os?

背景信息:

  • Windows 7 Home Premium SP1 64位
  • 使用TDM-GCC
  • 安装的MinGW
  • g ++ version 4.5.2
  • 使用g++ -Os test.cpp
  • 进行编译

1 个答案:

答案 0 :(得分:2)

-Os优化生成的代码的大小,它没有说明可执行文件中的其他非代码段。

您是否尝试使用-s链接器选项去除调试符号,建议here