【问题标题】:API names missing from '*.map' files and '*.asm' files“*.map”文件和“*.asm”文件中缺少 API 名称
【发布时间】:2017-10-07 03:33:30
【问题描述】:

我正在用 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

这会生成一个地图文件,我也有 fromelf 二进制文件来生成 asm。

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

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

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

例如 来源:main.c

main()
{
    test_func()
}

*.map(与 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 文件中丢失的功能符号的情况下生成地图文件?

【问题讨论】:

  • 更新了整个标志列表,还有更多。
  • flaglist 已经包含 -g 选项

标签: debugging build linker memory-mapping armcc


【解决方案1】:

看来您需要使用-g 启用调试符号:

CFLGAS += -O3 -g

【讨论】:

    【解决方案2】:

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

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

    1. 代码库中充斥着使用 __inline 和 __forceinline 属性的 API,开发人员没有真正的控制/使用意图。
    2. -O3 优化被确定为上述问题的原因 因为 -O3 非常具有侵略性。 (见下面的 sn-p)

    ARM 文档参考:(ARM Compiler toolchain Compiler Reference Version 5.03 Home > Compiler Command-line Options > -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 原因如下:

    RealView 编译器用户指南 Home > 编码实践 > 函数内联 > 管理内联

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

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

    进行上述更改后,我能够按预期看到符号和映射文件条目。

    【讨论】:

      猜你喜欢
      • 2019-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-07
      • 1970-01-01
      • 2017-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多