我正在编译嵌入式ARM微控制器的代码,我正在尝试优化二进制大小。我正在使用arm-none-eabi-g++
选项-Os -ffunction-sections -fdata-sections -Wl,--gc-sections
来实现此目的。看起来这样会删除一些(但不是全部)未使用的函数,尤其是一些重函数。
arm-none-eabi-nm --print-size --size-sort --radix=d
给了我:
[...]
00008412 00000084 T _raise_r
00004888 00000088 t restore_non_core_regs
00000172 00000092 t _ZN5USART5writeENS_4PortEc.constprop.22
00005276 00000094 T __gnu_Unwind_RaiseException
00001644 00000094 t _ZN4GPIO16enablePeripheralERKNS_3PinE
536871016 00000096 d impure_data
00004592 00000096 t search_EIT_table
00000624 00000100 t _ZN5Flash9writePageEiPh
00005648 00000112 T __gnu_Unwind_Backtrace
536874336 00000128 b _ZN3USB8_bankEP0E
00000264 00000128 t _ZN5USART9availableENS_4PortE.constprop.20
00002500 00000140 t _Z17usbControlHandlerRN3USB11SetupPacketEPhRi
00004728 00000160 t get_eit_entry
00000464 00000160 t _ZN3USB15ep0SETUPHandlerEv
00005060 00000212 t unwind_phase2_forced
536871424 00000256 b _ZN3USB17_epRAMDescriptorsE
536871688 00000384 b _ZN3USB10_endpointsE
536874496 00000384 b _ZN4Core9isrVectorE
00001972 00000528 t _ZN3USB12ep0INHandlerEv
00006504 00000590 T _Unwind_VRS_Pop
00007612 00000674 T __gnu_unwind_execute
00005760 00000732 t __gnu_unwind_pr_common
00000752 00000892 t _ZN3USB16interruptHandlerEv
00002640 00001848 T main
536872096 00002144 b _ZN5USART5portsE
正如您所看到的,“放松”功能占用了很多空间。这些似乎与C ++异常有关,但我没有使用它们。我用objdump -d
查看了ELF,看起来没有从我的任何函数调用“unwind”函数,所以这将是有效的死代码。
有没有办法将它从ELF中删除?或者由于某种原因他们是强制性的?我可以节省至少二进制文件总量的1/4。
答案 0 :(得分:1)
感谢@DarkFalcon,@ gudok和@jaggedSpire的答案:解决方案是添加-fno-exceptions
以删除所有与展开相关的函数。现在,有效地使用了仍然添加到二进制文件中的所有代码。