在ARM平台上面,需要gcc 编译的时候打开如下选项
-fno-omit-frame-pointer
在 GCC (GNU Compiler Collection) 中,编译选项 -fno-omit-frame-pointer 的含义是禁止省略函数调用的框架指针。这个选项影响编译器在生成目标代码时是否优化掉函数的框架指针。
框架指针(Frame Pointer)是一个在函数调用栈中指向当前函数的调用帧(函数栈帧)的指针。它通常用于帮助调试器定位栈帧并在函数调用层次中查找变量和调用信息。在调试程序时,这个框架指针非常有用,因为它可以在堆栈跟踪中提供准确的信息,以便正确还原函数调用链。
GCC 默认情况下会尝试优化代码,其中包括省略框架指针以减少函数调用的开销。在优化等级较高时(例如 -O2 或 -O3),GCC 通常会尝试通过其他方法来访问局部变量和参数,而不使用传统的基于框架指针的访问方式。这样做可能会导致调试信息不完整,从而在调试程序时使得栈帧链的追踪更加困难。
使用编译选项 -fno-omit-frame-pointer 可以告诉 GCC 不要省略函数的框架指针,这样在生成的目标代码中将保留对框架指针的使用。这样做会增加一些额外的开销,但对于调试和堆栈跟踪等目的来说,这是非常有用的。因此,在进行调试或需要精确的堆栈跟踪时,建议使用这个选项。
总结一下,-fno-omit-frame-pointer 是一个编译选项,用于阻止 GCC 在优化时省略函数调用的框架指针,以便更好地支持调试和堆栈跟踪。
-funwind-tables
在 GCC 中,编译选项 -funwind-tables 是用于生成异常处理(Exception Handling)相关的信息表。这个选项主要与异常处理框架,例如 C++ 异常处理和其他编程语言中的异常处理机制,有关。
异常处理是一种在程序执行期间处理错误和异常情况的机制。当异常发生时,程序会跳转到相应的异常处理代码块,以便进行错误处理或异常恢复。在异常处理过程中,需要进行栈展开(stack unwinding),即逐级回溯调用栈以查找合适的异常处理代码块。
使用 -funwind-tables 编译选项,会告诉 GCC 在目标代码中生成额外的异常处理信息表,用于辅助栈展开过程。这些信息表中包含了对每个函数的栈帧结构和异常处理相关的信息,使得异常处理运行时库能够在发生异常时更高效地定位并调用正确的异常处理代码。
需要注意的是,使用异常处理会增加一些额外的代码和开销,因此它通常在对程序的可靠性和稳定性有较高要求的情况下使用。如果你的程序没有使用异常处理机制,或者你不需要异常处理的功能,那么在编译时使用 -funwind-tables 可能会增加目标代码的大小和运行时开销。
总结一下,-funwind-tables 是一个编译选项,用于在生成目标代码时生成额外的异常处理信息表,以辅助异常处理框架的栈展开过程。这对于使用异常处理机制的程序是必要的,但如果你的程序不需要异常处理功能,可能会增加目标代码的大小和运行时开销。