【发布时间】:2021-05-01 14:55:18
【问题描述】:
我正在 Mac 上编译一些二进制文件,但使用更新的编译器(从之前的 ~5MB 增加到 ~20MB),编译后的大小变得很大。我认为这与之前未激活的 LTO(链接时间优化)有关。我没有在 linux 上观察到这个文件膨胀。
在玩过strip 之后(实际上没有减小大小,尽管尝试了基于标志-S -x 并且也没有标志的Xcode,并且由带有标志-s 的自制binutils 配方提供的GNU libtools 条带,所有这些似乎达到同样的效果)我找到了这个工具:https://github.com/google/bloatyBloaty McBloated,当在我的二进制文件上运行时,它会产生这个输出:
FILE SIZE VM SIZE
-------------- --------------
53.9% 9.72Mi 53.8% 9.72Mi __GNU_LTO,__wrapper_sects
32.5% 5.86Mi 32.4% 5.86Mi __GNU_DWARF_LTO,__debug_info
6.2% 1.11Mi 6.2% 1.11Mi __TEXT,__text
2.2% 403Ki 2.2% 403Ki __TEXT,__eh_frame
1.6% 298Ki 1.6% 298Ki __GNU_LTO,__wrapper_names
1.0% 177Ki 1.0% 177Ki Export Info
0.7% 131Ki 0.7% 131Ki Weak Binding Info
0.4% 77.0Ki 0.4% 77.0Ki __GNU_DWARF_LTO,__debug_str
0.4% 75.8Ki 0.4% 75.8Ki __DATA,__gcc_except_tab
0.2% 44.6Ki 0.2% 44.6Ki __GNU_LTO,__wrapper_index
0.2% 39.4Ki 0.2% 39.4Ki __DATA_CONST,__const
0.2% 33.1Ki 0.2% 33.1Ki __GNU_DWARF_LTO,__debug_abbrev
0.1% 26.4Ki 0.1% 26.4Ki __GNU_DWARF_LTO,__debug_line
0.1% 21.7Ki 0.1% 23.6Ki [20 Others]
0.1% 19.0Ki 0.1% 19.0Ki __TEXT,__text_cold
0.1% 18.1Ki 0.1% 18.1Ki __TEXT,__const
0.0% 8.82Ki 0.0% 8.82Ki __TEXT,__text_startup
0.0% 8.60Ki 0.0% 8.60Ki __TEXT,__cstring
0.0% 0 0.0% 7.18Ki __DATA,__pu_bss5
0.0% 0 0.0% 6.88Ki __DATA,__bss5
0.0% 5.87Ki 0.0% 5.87Ki __DATA,__la_symbol_ptr
100.0% 18.1Mi 100.0% 18.1Mi TOTAL
那么谁能告诉我这些巨大的*_LTO 部分的用途,以及我如何通过后处理或向我的构建链添加编译标志来摆脱它们。
OS 是 MacOS,我使用的是 g++ 10,这里有完整的跟踪: https://github.com/yanntm/testGithbuActions/runs/1778387086?check_suite_focus=true
我正在尝试尽可能多地编译静态以获得更好的可移植性。然而,二进制文件仍然动态链接到 /usr/lib/libSystem.B.dylib (我不能静态链接这个显然与 libtool)。
我不想要任何调试符号,因为这是面向最终用户的生产二进制文件。
【问题讨论】:
-
您尝试过哪些剥离选项?
-
@AlanBirtles 我编辑添加了我尝试过的内容,包括 xcode 条和 gnu 版本(因为它们有不同的标志)。第一个条形调用确实从 19MB 变为 18MB,所以它确实做了something。但是二进制大小不是符号,因为膨胀的转储显示。
-
Xcode 的哪个版本?您的源代码的编译标志是什么?您的链接器的链接标志是什么?
g++ --version输出什么?很好奇,为什么不禁用 LTO? -
@Eljay 所以这是 Github 操作提供的标准容器。 Xcode_12.2,来自 brew 10.2.0_2 的 g++。编译时的标志是
-DNDEBUG -O3,链接时的标志是-O3 -all-static -static-libgcc -static-libstdc++。我尝试在编译和链接中添加“-flto”和“-fno-lto”。在两种情况中,带有这些 LTO 部分的二进制文件仍然是 19MB,我觉得由于某些环境配置,它忽略了这些标志。
标签: c++ macos compilation lto