调试信息是否会在优化构建中从库中删除?

时间:2016-02-01 12:44:43

标签: c build embedded

我正在为ARM使用GCC的C编译器。我使用C编译器编译了Newlib。我进入了Newlib的makefile,看到Newlib库使用-g -O2进行编译。

编译我的代码并链接到Newlib的标准C库时,这个调试信息会被剥离吗?

2 个答案:

答案 0 :(得分:1)

您可以同时使用-g和-O2。优化代码的编译器保留调试信息。当然,在某些地方,由于代码优化,您将无法获得已通过代码优化删除并且不再存在的某些符号的信息。

答案 1 :(得分:0)

来自Gcc options summary

  

启用优化标志会使编译器尝试以编译时间和调试程序的能力为代价来提高性能和/或代码大小。

有多个标志和选项可以使调试变得不可能或困难。例如

  

-fomit-frame-pointer ....它也使某些机器无法进行调试。

     

-fsplit-wide-types ....这通常会为这些类型生成更好的代码,但可能会使调试更加困难。

     

-fweb - ...但是,它可以使调试无法进行,因为变量不再保留在“归属寄存器”中。

前两个已为-O2启用。

如果要保留调试信息,可以使用以下选项。

  

-OG

     

优化调试体验。 -Og启用不会干扰调试的优化。它应该是标准编辑 - 编译 - 调试周期的优化级别,提供合理的优化级别,同时保持快速编译和良好的调试体验。