转载本文请联系程序大师喵公众号。大家好,我是程序喵。众所周知,前两天,小破站再次上市,大方宣布要给员工加鸡腿。激动的苗哥一夜没睡好。万万美想起来,人不如天意,公司真的送鸡腿了,没错,就是你想的那样。鸡腿的事不想再想了,还是好好管文章吧。..前段时间在知乎上看到一个问题:Linux如何优化可执行程序的大小?在我们的日常工作中,一般对程序的大小都有严格的要求,有时仅仅因为代码段几个字节的大小或者运行时间多了几十毫秒,整个项目就达不到验收标准,甚至无法成功上线。这里我先提出几个想法。如果大家有好的优化策略欢迎在评论区留言。大致的思路是:把代码写好,减少代码段的大小,我们50行就可以搞定别人300个代码的逻辑,程序大小一定有机会变小。这就得考验开发者自己的编程能力了。如果是C++程序,可以尽量减少模板的使用。模板实例化可能会导致代码膨胀。使用strip而不引用无用的头文件。就像脱衣服一样,删除程序的所有符号。这也是很多开发者常用的方法。strip只清除普通符号,不清除动态符号表中的符号,有些动态符号其实可以隐藏,从而减小库的大小,可以使用-fvisibility=hidden命令巧妙利用.bss段,未初始化的全局变量而局部静态变量会存放在.bss段中,这些变量不占用程序空间inline-limit:过多的内联会导致代码段变大,可以使用这个优化选项来减少内联的次数和启用Os编译,这样会生成更小的代码体积优化选项适当使用编译选项-fdata-sections和-ffunction-sections考虑链接动态库而不是静态库以上是不是太笼统了?如果你考虑周到,我已经准备好了,谢谢~strip在linux下可以用manstrip查看strip的用法。Themostimportantthingistoremovethe-sparameterofallsymbols,whichisusedtoclearallsymbolinformation:strip-sxxxUsenmtoviewthesymbolinformationoftheexecutableprogrambeforeusingstrip:~/test$nma.out0000000000200da0d_DYNAMIC0000000000200fa0d_GLOBAL_OFFSET_TABLE_000000000000089bt_GLOBAL__sub_I__Z4funcPc0000000000000930R_IO_stdin_usedw_ITM_deregisterTMCloneTablew_ITM_registerTMCloneTable0000000000000852t_Z41__static_initialization_and_destruction_0ii00000000000007faT_Z4funcPc000000000000081cT_Z4funciU_ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4U_ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.40000000000201020B_ZSt4cout@@GLIBCXX_3.40000000000000934r_ZStL19piecewise_construct0000000000201131b_ZStL8__ioinitU_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCXX_3.40000000000000b24r__FRAME_END__0000000000000940r__GNU_EH_FRAME_HDR0000000000201010D__TMC_END__0000000000201010B__bss_startU__cxa_atexit@@GLIBC_2.2.5w__cxa_finalize@@GLIBC_2.2.50000000000201000D__data_start00000000000007b0t__do_global_dtors_aux0000000000200d98t__do_global_dtors_aux_fini_array_entry0000000000201008D__dso_handle0000000000200d88t__frame_dummy_init_array_entryw__gmon_start__0000000000200d98t__init_array_end0000000000200d88t__init_array_start0000000000000920T__libc_csu_fini00000000000008b0T__libc_csu_initU__libc_start_main@@GLIBC_2.2.50000000000201010D_edata0000000000201138B_end0000000000000924T_fini0000000000000688T_init00000000000006f0T_start0000000000201130bcompleted.76980000000000201000Wdata_start0000000000000720tderegister_tm_clones00000000000007f0tframe_dummy000000000000083dTmain0000000000000760tregister_tm_clones当前可执行程序的文件大小为8840字节:-rwxrwxrwx1aa8840Nov2914:54a.out使用strip清除符号信息:~/test$strip-sa.outstrip然后查看可执行文件的符号信息:~/test$nma.outnm:a.out:nosymbols发现没有符号了,但是strip之后的可执行程序文件大小还是6120字节:-rwxrwxrwx1aa6120Nov2914:54a.out具体可以参考我的文章:《Linux有一个命令你一定要知道》-fvisibility=hidden可以这样使用:$g++-fvisibility=hidden-clayer.cxx-olayer.o.bss部分的巧妙使用:参见以下代码:#include
