'* .map'文件和'* .asm'文件

时间:2017-05-09 00:51:48

标签: debugging build linker memory-mapping armcc

我正在使用armcc编译项目:

它有以下标志:

ASFLAGS := -g --cpu Cortex-R5 --fpu None $(addprefix -i,$(INCL)) --apcs /interwork
ASFLAGS += --diag_error=warning,193
CFLAGS := -g --cpu Cortex-R5 --split_sections --c99 --gnu --depend_dir=$(OBJ_PATH) --no_depend_system_headers --md
CFLAGS += --enum_is_int
CFLAGS += --diag_error=warning,193,1301,2530 --remarks
CFLAGS += --diag_suppress=2815
CFLAGS += --diag_remark=1215
#CFLAGS += -O0
CFLAGS += -O3
CFLAGS += -DROM
CFLAGS += -Otime
CFLGAS += -O3
$(TARTGET):="Mytarget"  
LDFLAGS := $(INSTRUCTION) --info=totals --info=unused --info=sizes  --callgraph --map --symbols --scatter=$(SCAT_FILE) --list $(TARGET).map
LDFLAGS += --datacompressor=off --library_type=microlib --entry=0xFFFF0000

这会生成一个map文件,而且我还有fromelf二进制文件来生成asm。

fromelf $(TARGET).axf -c > $(TARGET).asm

但是在输出* .map(内存)文件中

如果设置了Optimization3(-O3)标志,我无法看到我在main函数下添加到构建的API名称,删除它会带回api名称

e.g 来源:main.c

main()
{
    test_func()
}

* .map(with O3)

main                                     0xffff2218   ARM Code     152 main.o(i.main)
util_print                               0xffff22c0   ARM Code      40  util_print.o(i.util_print)
harm_reset_handler                       0xffff22ec   ARM Code       0  host_reset.o(reset)

来源:* .map(带-O0)

main                                     0xffff2218   ARM Code     152  
main.o(i.main)
test_func                                0xffff22c0   ARM Code      40  test_func.o(i.test_func)
util_print                               0xffff22ec   ARM Code      40  util_print.o(i.util_print)
harm_reset_handler                       0xffff24f4   ARM Code       0  host_reset.o(reset)

我的问题是有没有办法在-O3打开但是仍然没有* .map和* .asm文件中缺少功能符号的情况下生成地图文件?

2 个答案:

答案 0 :(得分:0)

您似乎需要使用-g启用调试符号:

CFLGAS += -O3 -g

答案 1 :(得分:0)

我在手臂论坛上询问并获得了部分答案,并且能够通过阅读更多手臂文档来填补空白。

有关此问题的更多背景信息:

  1. 代码库中充斥着使用带有__inline和__forceinline属性的API,没有真正控制/意图使用devlopers。
  2. -O3优化被确定为上述问题的原因 因为-O3是超级攻击性的。 (见下面的摘录)
  3.   

    ARM文档参考:(ARM编译器工具链编译器参考版本5.03主页>编译器命令行选项> -Onum)

         

    链接:http://infocenter.arm.com/help/topic/com.arm.doc.dui0491i/CIHGFGFB.html

         

    最大化优化。 -O3执行与-O2相同的优化,但是与-O2相比,生成的代码中的空间和时间优化之间的平衡对空间或时间的权重更大。那就是:

         

    -O3 -Otime旨在生成比-O2 -Otime更快的代码,但存在增加图像尺寸的风险

         

    -O3 -Ospace旨在生成比-O2 -Ospace更小的代码,但性能可能会降低。

         

    此外,-O3执行更具侵略性的额外优化,例如:

         

    针对-O3 -Otime的高级标量优化,包括循环展开。这可以在较小的代码大小成本下提供显着的性能优势,但存在构建时间较长的风险。

         

    更积极的内联和自动内联-O3 -Otime。

    解决方案:

    1. 编译器标记--no_inline已添加到默认/强制,并非所有API都是内联的
    2. 具有__inline属性的所有API都已转换为__forceiinline 原因如下:
    3.   

      RealView编译器用户指南   主页>编码惯例>函数内联>管理内联

           

      链接:http://infocenter.arm.com/help/topic/com.arm.doc.kui0097a/armcc_cihjigba.htm

           

      您可以使用--no_inline--inline关键字控制是否完全执行内联。默认情况下,启用内联函数。如果使用--no_inline命令行选项禁用内联函数,则编译器会尝试仅内联那些使用__forceinline明确限定的函数。

      完成上述更改后,我能够按预期看到符号和地图文件条目。