gpt4 book ai didi

c++ - 结合使用 -fno-unwind-tables 和 -fno-exceptions

转载 作者:可可西里 更新时间:2023-11-01 18:38:20 35 4
gpt4 key购买 nike

除了 -fno-exceptions 之外,使用 -fno-unwind-tables 有什么好处——尤其是在(独立的)C++ 嵌入式系统上?

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

It is possible to forbid usage of throw statements by providing certain options to the compiler. For GNU compiler (gcc) please use -fno-exceptions in conjunction with -fno-unwind-tables options.

但是没有解释 -fno-unwind-tables 究竟做了什么。

最佳答案

根据 the GCC documentation ,它抑制了静态展开表的生成(与完整的异常处理代码相反),其主要好处可能是由于不包含该数据而导致目标文件更小。请注意,即使在没有完整的异常处理(例如在 C 代码中)的情况下,此类表也可能用于诸如用于回溯生成的堆栈遍历代码之类的事情。

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


对一些倒霉的 C++ 项目(已经使用 -fno-exceptions)的 makefile 进行了破解,以 3 种方式交叉编译它,很明显我的特定工具链默认采用哪种方式:

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

表格本身位于后者的附加 .ARM.extab ELF 部分中 - 当然,对于嵌入式项目,您可能有一个经过微调的链接器脚本,它最终会丢弃它无论如何,但是,嘿,最好不要首先浪费时间和精力来生成它。

关于c++ - 结合使用 -fno-unwind-tables 和 -fno-exceptions,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39455712/

35 4 0