谁能解释一下 libc 函数 _ldtoa_r 和 _Balloc 的用法?

Can anyone explain the use of libc functions _ldtoa_r and _Balloc?

我正在使用 Kendryte K210 进行一个项目,它是一台 64 位双核 RISC-V 机器。我正在使用 Kendryte GNU toolchain and the starting point was the Kendryte standalone SDK.

我遇到了一些令人沮丧的核心故障。在 _ldtoa_r 中的 _Balloc balr 之后发生错误,即未对齐的加载,其中 _Balloc 中的 ld 指令试图从函数之一指向的无效地址加载参数寄存器(在本例中为 a0)。

我一直想弄清楚 when/where/how _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/lib\libc.a(lib_a-strtod.o) (_Balloc)

...
 
c:/sysgcc/kendryte/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.a(lib_a-ldtoa.o)
c:/sysgcc/kendryte/bin/../lib/gcc/riscv64-unknown-elf/8.2.0/../../../../riscv64-unknown-elf/lib\libc.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/lib\libc.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/lib\libc.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/lib\libc.a(lib_a-ldtoa.o)

Cannyone explain the use of libc functions _ldtoa_r

用于将 long double 值转换为字符串,具有许多自定义选项,并且在 Newlib 意义上是可重入的,采用 _REENT 状态。

它用于打印 double 值的示例。

https://github.com/bminor/newlib/blob/80cda9bbda04a1e9e3bee5eadf99061ed69ca5fb/newlib/libc/stdlib/dtoa.c

and _Balloc?

Balloc 分配一个 _Bigint 值。 _Bigint 将浮点值表示为“大整数”。

它用在很多地方,主要用于打印和读取 long double 值 from/to 字符串。

https://github.com/bminor/newlib/blob/80cda9bbda04a1e9e3bee5eadf99061ed69ca5fb/newlib/libc/stdlib/mprec.c#L97

their relationship to these object files

编译后的代码存储在“这些目标文件”中。

how to properly interpret relevant lines in the map file

 .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/lib\libc.a
# ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - filename
# ..  (lib_a-ldtoa.o)
#      ^^^^^^^^^^^^^  - object filename (used when compiling libc)
0x0000000080027456      _ldtoa_r
#                       ^^^^^^^^ - symbol name
# ^^^^^^^^^^^^^^^^ - location in output file