我可以使 clang 可执行文件有多小?

I_l*_*hon 2 c++ clang

我只是测试一下我可以将这个 C++ 代码编写得有多小

#include <iostream>
using namespace std;

int main() {
    cout << "hi";
}
Run Code Online (Sandbox Code Playgroud)

使用此 zsh 命令:

g++ test.cpp -Os -g -o main
Run Code Online (Sandbox Code Playgroud)

但我能做到的最小是52 Kb,那么有什么办法可以让它更小呢?

chu*_*cik 6

使用 g++ 11.2 的代码和编译器标志,我得到了35,8kB可执行文件(可以通过使用不同的编译器版本或目标系统来解释不同的结果)。

  1. 删除该-g标志(GDB GNU 调试器或 LLDB Clang/LLVM 调试器的调试符号)会将输出文件的大小减小到16,3kB
  2. 您可以通过以下方式修改代码而不更改其功能(16,0kB):
#include <stdio.h>

int main(){
    fputs("hi", stdout);
    return 0;  // doesn't change the output, only here for completeness sake
}
Run Code Online (Sandbox Code Playgroud)
  1. 使用clang编译上述代码进一步将输出可执行文件的大小减少到15,9kB

  2. 添加-s标志(剥离调试信息):14,5kBclang (使用和得到相同的结果g++ 11.2

比较表(最佳结果以粗体显示):

代码 编译器 旗帜 尺寸
原来的 克++8.5.0 -Os-g 38 496 乙
-Os 16304乙
-Os -s 14 464 乙
克++11.2.0 -Os-g 35 848 乙 0
-Os 16 320 乙 1
-Os -s 14 464 乙
铿锵11.0.1 -Os-g 30 736 B
-Os 16304乙
-Os-g 14 552 乙
铿锵13.0.0 -Os-g 29 312 乙
-Os 16232乙
-Os -s 14 488 乙
修改的 克++8.5.0 -Os-g 18 552 乙
-Os 16 000 乙
-Os -s 14 464 乙
克++11.2.0 -Os-g 18616乙
-Os 16 000 乙 2
-Os -s 14 464 乙
铿锵11.0.1 -Os-g 16720乙
-Os 15960乙
-Os -s 14 528 乙
铿锵13.0.0 -Os-g 16640乙
-Os 15 888 乙 3
-Os -s 14 464 乙 4

  • 如果您还没有这样做,您还应该删除符号,即“-s”或“-Wl,-s”或对“strip”的调用。 (2认同)