目前,我正在学习RISC-V,使用RISC-V工具链,并为我的嵌入式编辑新的ld脚本。我编写了一个示例,并编译以观察操作码。
示例:
#include <stdio.h> //float.c
int main()
{
float a=1.04;
printf("a=%f\n",a);
return 0;
}
我的步骤是:
1. riscv64-unknown-elf-gcc -S float.c *//generate assembly code*
2. riscv64-unknown-elf-as float.s -o float.o *//generate obj file*
3. riscv64-unknown-elf-ld -T elf64lriscv1.x float.o *//use own script to link, -T is using other script*
然后,它将显示&#34; float.c :(。text + 0x50):对'printf&#39;
的未定义引用我试试
添加-lc
参数,但不起作用,它会显示更多未定义的消息。
我的ld脚本
OUTPUT_FORMAT("elf64-littleriscv", "elf64-littleriscv","elf64-littleriscv")
OUTPUT_ARCH(riscv)
ENTRY(_start)
SEARCH_DIR("/path/to/install/riscv/toolchain/riscv64-unknow-elf/lib");
/*MEMORY{ //for my embedded allocation
flash : org = 0x0, l = 0x10000
ram : org= 0x10000, l = 512
}*/
SECTIONS{
_start =0x10000;
.text :
{
*(.text)
}
.bss :
{
*(.bss)
*(.sbss)
}}
此外,我尝试使用默认脚本,例如此命令:
$ riscv-unknown-elf-ld float.o -o float
但结果相同...... 请帮帮我!
问候!
答案 0 :(得分:0)
printf
由C standard library提供(并且很难实现)。您需要链接它(可能通过将-lc
添加到您的riscv-unknown-elf-ld
命令,或者通过提供该库的完整路径)
您可以将additional options传递给riscv-unknown-elf-ld
-M
,-L
search-dir ,--trace
,{{1}另外,请仔细阅读有关ld
scripts。
由于您是交叉编译的,因此您可能需要从源代码中交叉编译一些--verbose
。
您需要花费更多时间来了解linkers和ELF目标文件和可执行格式的行为(另请参阅elf(5))。考虑阅读Linkers and Loaders
您可以使用其他跨binutils程序(例如交叉libc
,objdump
,nm
等...)来探索相关的目标文件。
如果您正在为裸机系统编码,您可能希望以独立模式(passing -ffreestanding
编译到GCC)并提供实现自己的readelf
(或其他输出)功能。现有的free software C库可能会激励您(但您需要找到一个或多个月才能开发出一些等效的文件)。
我建议您阅读有关操作系统的信息,例如: Operating Systems: Three Easy Pieces(因为操作系统概念与您相关,因为裸机上的嵌入式系统与操作系统共享功能)。 OSDEV wiki也可能有所帮助(但与RISC-V无关)。
您可能需要几个月的工作(甚至数年),因此请适当预算。
顺便说一句,我很惊讶您在示例中使用了printf
。浮点很难。见floating-point-gui.de
;首先尝试,我会考虑仅使用整数。