我正在使用Kendryte K210进行一个项目,这是一台64位双核RISC-V机器。我使用的是Kendryte GNU工具链,起点是Kendryte独立SDK。
我正在经历一些令人沮丧的核心故障。故障,即未对齐的加载,发生在_ldtoa_r中的balr
到_Balloc之后,其中_Balloc中的ld
指令正试图从一个函数自变量寄存器(本例中为a0(指向的无效地址加载。
我一直试图弄清楚何时何地如何使用_Balloc和_ldtoa_r,但它们是libc的一部分。我的映射文件显示_ldtoa_r在某种程度上与lib_a-ldtoa.o和lib_a-svfprintf.o有关,而_Balloc在某种程度上将与lib_a-strtod.o和lib_a-mprec.o有关。我不确定,因为我不熟悉解释映射文件。
如果有人能帮助我了解_ldtoa_r和_Balloc是什么,它们是如何使用的,它们与这些对象文件的关系,以及如何正确解释映射文件中的相关行,我将不胜感激。
谢谢。
c:/sysgcc/kendryte/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/liblibc.a(lib_a-strtod.o) (_Balloc)
...
c:/sysgcc/kendryte/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/liblibc.a(lib_a-ldtoa.o)
c:/sysgcc/kendryte/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/liblibc.a(lib_a-svfprintf.o) (_ldtoa_r)
...
.text._ldtoa_r
0x0000000080027456 0xa74
c:/sysgcc/kendryte/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/liblibc.a(lib_a-ldtoa.o)
0x0000000080027456 _ldtoa_r
...
.text._Balloc
0x000000008002814c 0x6c
c:/sysgcc/kendryte/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/liblibc.a(lib_a-mprec.o)
0x000000008002814c _Balloc
...
.rodata._ldtoa_r.str1.8
0x000000008003cfb8 0x34
c:/sysgcc/kendryte/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/liblibc.a(lib_a-ldtoa.o)
无法解释libc函数_ldtoa_r 的使用
用于将long double
值转换为字符串,具有许多自定义选项,并且在Newlib意义上是可重入的,取_REENT状态。
例如,它用于打印double
值。
https://github.com/bminor/newlib/blob/80cda9bbda04a1e9e3bee5eadf99061ed69ca5fb/newlib/libc/stdlib/dtoa.c
和_Balloc?
Balloc
分配一个_Bigint
值。CCD_ 7将浮点值表示为"0";大整数";。
它用于各种场合,主要用于从字符串中打印和读取long double
值。
https://github.com/bminor/newlib/blob/80cda9bbda04a1e9e3bee5eadf99061ed69ca5fb/newlib/libc/stdlib/mprec.c#L97
它们与这些对象文件的关系
编译后的代码存储在";这些对象文件";。
如何正确解释地图文件中的相关行
.text._ldtoa_r
#^^^^^^^^^^^^^^ - section name
0x0000000080027456 0xa74
# ^^^^^ - length of the section
# ^^^^^^^^^^^^^^^ - location of the section in output file
c:/sysgcc/kendryte/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/liblibc.a
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - filename
# .. (lib_a-ldtoa.o)
# ^^^^^^^^^^^^^ - object filename (used when compiling libc)
0x0000000080027456 _ldtoa_r
# ^^^^^^^^ - symbol name
# ^^^^^^^^^^^^^^^^ - location in output file