将-fno-unwind-tables与-fno-exceptions结合使用

时间:2016-09-12 17:32:30

标签: c++ gcc embedded

-fno-unwind-tables中添加-fno-exceptions有什么好处 - 特别是在(独立式)C ++嵌入式系统上?

根据Practical Guide to Bare Metal C++ — § Exceptions,应该使用:

  

可以通过向编译器提供某些选项来禁止使用throw语句。对于GNU编译器(gcc),请将-fno-exceptions-fno-unwind-tables选项结合使用。

然而,-fno-unwind-tables实际上没有解释。

1 个答案:

答案 0 :(得分:2)

Per the GCC documentation,它抑制了静态展开表的生成(与完整的异常处理代码相反),由于不包含该数据,其主要好处可能是较小的目标文件。请注意,即使在没有完整的异常处理的情况下(例如在C代码中),这样的表也可能用于堆栈行走代码以进行回溯生成。

我不确定,但我想如果默认情况下已经禁用完整的异常处理代码但启用了静态展开表,-fno-exceptions可能不会影响后者因此使用两种选择涵盖所有基础。换句话说,编译器可能想要生成一个或另一个,但是当大小和效率很重要时,你肯定希望它不会这样做。

攻击了一些不幸的C ++项目的makefile(已经使用-fno-exceptions)以3种方式进行交叉编译,很明显我的特定工具链默认是哪种方式:

default                        : 576KB
CPPFLAGS += -fno-unwind-tables : 576KB
CPPFLAGS += -funwind-tables    : 580KB

表格本身位于后者的另一个.ARM.extab ELF部分中 - 当然,对于嵌入式项目,您可能会有一个精心调整的链接描述文件,最终会丢弃它,但是,嘿,仍然最好不要浪费时间和精力来产生它。