C++ 从二进制文件中删除未使用的函数

C++ 从二进制文件中删除未使用的函数,c++,arm,C++,Arm,我正在为嵌入式ARM微控制器编译一段代码,并试图优化二进制大小。为了实现这一点,我正在使用带有选项的arm-none-eabi-g++。看起来这会删除一些(但不是全部)未使用的函数,尤其是一些较重的函数 arm none eabi nm--打印大小--大小排序--基数=d给了我: [...] 00008412 00000084 T _raise_r 00004888 00000088 t restore_non_core_regs 00000172 00000092 t _ZN5USART5wr

我正在为嵌入式ARM微控制器编译一段代码,并试图优化二进制大小。为了实现这一点,我正在使用带有选项的
arm-none-eabi-g++
。看起来这会删除一些(但不是全部)未使用的函数,尤其是一些较重的函数

arm none eabi nm--打印大小--大小排序--基数=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”函数,因此这实际上是死代码


有没有办法把它从精灵身上移除?还是出于某种原因,它们是强制性的?我至少可以保存总二进制大小的1/4。

感谢@DarkFalcon、@gudok和@jaggedSpire的回答:解决方案是添加
-fno异常
以删除所有与展开相关的函数。现在,仍然添加在二进制文件中的所有代码都被有效地使用了。

您是否尝试过
-fno异常
?我怀疑展开函数上的地址注册在某个特殊的表中,这就是您没有看到直接调用的原因。如果您不需要异常,为什么不首先使用
-fno异常编译呢?@DarkFalcon@gudok谢谢,我不知道这个选项,它工作得非常好!所有的展开函数都消失了,我保存了27%的二进制大小。我在某个地方读到C++没有强制使用开销除非它被明确地使用,你知道为什么我必须手动禁用异常如果我不使用它们?现在我想,我正在导入STNDET.H和String。可能有些异常隐藏在标准库中,这就是编译器认为应该包含它们的原因。string确实使用异常