riscv/gcc/ld - "Undefined reference to printf" 使用自己的脚本 link

riscv/gcc/ld - "Undefined reference to printf" using own script to link

目前,我正在学习 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*

然后,它将显示 "float.c:(.text+0x50): undefined reference to `printf'

我试试

添加-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

但结果是一样的.... 请帮助我!

此致!

printf 是由 C standard library 提供的(并且很难实现)。您需要 link 它(也许通过将 -lc 添加到您的 riscv-unknown-elf-ld 命令,或者通过提供该库的完整路径)

你可能会通过 additional options to your riscv-unknown-elf-ld perhaps -M, -L search-dir, --trace, --verbose, etc. Read also more carefully the chapter about ld scripts.

由于你是交叉编译,你可能需要从源代码中交叉编译一些libc

您需要花更多时间了解 linkers and ELF object files and executable format (see also elf(5)). Consider reading Linkers and Loaders

的行为

您可以使用其他交叉 binutils 程序(如交叉 objdumpnmreadelf 等)来探索相关的目标文件。

如果您正在为裸机系统编码,您可能希望在独立模式下编译 (passing -ffreestanding to your GCC) and provide so implement your own printf (or other output) function. Existing free software C libraries could inspire you (but you need to find one or work many months to develop some equivalent). Study for inspiration the source code of GNU libc or of musl-libc

我还建议阅读有关操作系统的信息,例如Operating Systems: Three Easy Pieces (since the OS concepts are relevant to you, because an embedded system on the bare metal share features with OSes). OSDEV wiki 也可能有帮助(但与 RISC-V 无关)。

您可能需要 几个月 的工作(甚至几年),因此请适当预算。

顺便说一句,我很惊讶您在示例中使用了 float。浮点数很难。参见 floating-point-gui.de ;第一次尝试,我会考虑只使用整数。