API “*.map”文件和“*.asm”文件中缺少名称
API names missing from '*.map' files and '*.asm' files
我正在用 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 文件中缺少的功能符号?
看来您需要使用 -g
:
启用调试符号
CFLGAS += -O3 -g
我在 arm 论坛上询问并得到了部分答案,并且能够通过阅读更多 arm 文档来填补空白。
关于该问题的更多背景信息:
- 代码库中充斥着 API 属性 __inline 和 __forceinline 的使用,而开发者没有真正的 control/intent 使用。
- -O3 优化被确定为上述定义问题的原因
因为 -O3 非常激进。 (见下面的片段)
ARM documentation Reference: (ARM Compiler toolchain Compiler Reference Version 5.03 Home > Compiler Command-line Options > -Onum)
link:http://infocenter.arm.com/help/topic/com.arm.doc.dui0491i/CIHGFGFB.html
Maximum optimization. -O3 performs the same optimizations as -O2 however the balance between space and time optimizations in the generated code is more heavily weighted towards space or time compared with -O2. That is:
-O3 -Otime aims to produce faster code than -O2 -Otime, at the risk of increasing your image size
-O3 -Ospace aims to produce smaller code than -O2 -Ospace, but performance might be degraded.
In addition, -O3 performs extra optimizations that are more aggressive, such as:
High-level scalar optimizations, including loop unrolling, for -O3 -Otime. This can give significant performance benefits at a small code size cost, but at the risk of a longer build time.
More aggressive inlining and automatic inlining for -O3 -Otime.
解决方案:
- 编译器标志
--no_inline
添加到 default/force 没有所有 API 是内联的
- 具有
__inline
属性的所有 API 都已转换为 __forceiinline
原因如下:
RealView Compiler User Guide
Home > Coding Practices > Function inlining > Managing inlining
link:http://infocenter.arm.com/help/topic/com.arm.doc.kui0097a/armcc_cihjigba.htm
You can control whether inlining is performed at all using the --no_inline
and --inline
keywords. By default, inlining of functions is enabled. If you disable inlining of functions using the --no_inline
command-line option, then the compiler attempts to inline only those functions that are explicitly qualified with __forceinline
.
进行上述更改后,我能够按预期看到符号和地图文件条目。
我正在用 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 文件中缺少的功能符号?
看来您需要使用 -g
:
CFLGAS += -O3 -g
我在 arm 论坛上询问并得到了部分答案,并且能够通过阅读更多 arm 文档来填补空白。
关于该问题的更多背景信息:
- 代码库中充斥着 API 属性 __inline 和 __forceinline 的使用,而开发者没有真正的 control/intent 使用。
- -O3 优化被确定为上述定义问题的原因 因为 -O3 非常激进。 (见下面的片段)
ARM documentation Reference: (ARM Compiler toolchain Compiler Reference Version 5.03 Home > Compiler Command-line Options > -Onum)
link:http://infocenter.arm.com/help/topic/com.arm.doc.dui0491i/CIHGFGFB.html
Maximum optimization. -O3 performs the same optimizations as -O2 however the balance between space and time optimizations in the generated code is more heavily weighted towards space or time compared with -O2. That is:
-O3 -Otime aims to produce faster code than -O2 -Otime, at the risk of increasing your image size
-O3 -Ospace aims to produce smaller code than -O2 -Ospace, but performance might be degraded.
In addition, -O3 performs extra optimizations that are more aggressive, such as:
High-level scalar optimizations, including loop unrolling, for -O3 -Otime. This can give significant performance benefits at a small code size cost, but at the risk of a longer build time.
More aggressive inlining and automatic inlining for -O3 -Otime.
解决方案:
- 编译器标志
--no_inline
添加到 default/force 没有所有 API 是内联的 - 具有
__inline
属性的所有 API 都已转换为__forceiinline
原因如下:
RealView Compiler User Guide Home > Coding Practices > Function inlining > Managing inlining
link:http://infocenter.arm.com/help/topic/com.arm.doc.kui0097a/armcc_cihjigba.htm
You can control whether inlining is performed at all using the
--no_inline
and--inline
keywords. By default, inlining of functions is enabled. If you disable inlining of functions using the--no_inline
command-line option, then the compiler attempts to inline only those functions that are explicitly qualified with__forceinline
.
进行上述更改后,我能够按预期看到符号和地图文件条目。