什么是使用的好处-fno-unwind-tables在addtion来-fno-exceptions-尤其是在(独立)C++嵌入式系统?
根据Bare Metal C++实用指南 - §例外,应该使用:
通过向编译器提供某些选项,可以禁止使用throw语句.对于GNU编译器(gcc),请
-fno-exceptions与-fno-unwind-tables选项一起使用.
然而,没有任何解释是什么实际的-fno-unwind-tables.
根据GCC 文档,它抑制了静态展开表的生成(与完整的异常处理代码相反),其主要好处可能是由于不包含该数据而导致目标文件更小。请注意,即使在没有成熟的异常处理(例如在 C 代码中)的情况下,此类表也可用于诸如用于生成回溯的堆栈遍历代码之类的情况。
我不确定,但我想在默认情况下已经禁用完整异常处理代码但启用静态展开表的情况下,-fno-exceptions可能不会影响后者,因此使用这两个选项涵盖所有基地。换句话说,编译器可能想要生成其中之一,但是当大小和效率很重要时,您肯定希望它两者都不做。
在修改了一些不幸的 C++ 项目的 makefile(已经使用-fno-exceptions)以 3 种方式交叉编译它之后,很明显我的特定工具链默认采用哪种方式:
default : 576KB
CPPFLAGS += -fno-unwind-tables : 576KB
CPPFLAGS += -funwind-tables : 580KB
Run Code Online (Sandbox Code Playgroud)
.ARM.extab这些表本身驻留在后者的附加ELF 部分中 - 当然,对于嵌入式项目,您很可能有一个经过微调的链接器脚本,无论如何它最终都会丢弃它,但是,嘿,还是最好不要浪费时间和精力来生成首先。
| 归档时间: |
|
| 查看次数: |
3636 次 |
| 最近记录: |