我正在使用Atmel Studio 7,其中,优化级别为-O1。 我可以检查编译器本身正在优化的代码部分吗? 如果我禁用优化,我的二进制文件大小为12KB,使用优化级别-O1,二进制文件大小为5.5KB。
答案 0 :(得分:0)
我可以检查编译器本身正在优化的代码部分吗?
所有代码由编译器优化,即受优化标志的影响,除了
是从库(libgcc.a
,libc.a
,libm.a
,lib<device>.a
)中拖动的代码。
启动代码(crt<device>.o
)也包括向量表,或者是来自其他对象的代码,这些对象已经存在并且当前编译中没有(重新)编译。当您更改Makefile中的标记时,后者可能会发生:如果模块不依赖Makefile本身,则make
将不会重建它们。
来自汇编模块(*.S
,*.sx
,*.s
)的代码,前提是预处理的汇编代码不通过#ifdef __OPTIMIZE__
或类似方式使用条件汇编。 / p>
内联汇编中的代码,前提是尚未优化内联asm。
为了确定这是否有效,您可以分别:
与-Wl,-Map,file.map
链接并检查该映射文件(文本文件)。它将列出由于哪些未定义符号而已将哪些对象从何处拖动。
除了您-nostartfiles
以外,启动代码都已链接。将-Wl,-v
添加到链接阶段,您将看到crt<device>.o
被链接。
您知道您的编译单元,汇编模块吗?
将-save-temps
添加到编辑中。内联汇编将在中间*.s
文件中显示为
/* #APP */
; <line> "<compilation-unit>"
<inline-asm-code>
/* #NOAPP */