riscv / gcc / ld - "未定义的printf参考文献"使用自己的脚本进行链接

时间:2017-11-03 04:02:48

标签: linux gcc linker ld riscv

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

但结果相同...... 请帮帮我!

问候!

1 个答案:

答案 0 :(得分:0)

{p> printfC standard library提供(并且很难实现)。您需要链接它(可能通过将-lc添加到您的riscv-unknown-elf-ld命令,或者通过提供该库的完整路径)

您可以将additional options传递给riscv-unknown-elf-ld -M-L search-dir --trace,{{1}另外,请仔细阅读有关ld scripts

的章节

由于您是交叉编译的,因此您可能需要从源代码中交叉编译一些--verbose

您需要花费更多时间来了解linkersELF目标文件和可执行格式的行为(另请参阅elf(5))。考虑阅读Linkers and Loaders

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

如果您正在为裸机系统编码,您可能希望以独立模式(passing -ffreestanding编译到GCC)并提供实现自己的readelf(或其他输出)功能。现有的free software C库可能会激励您(但您需要找到一个或多个月才能开发出一些等效的文件)。

我建议您阅读有关操作系统的信息,例如: Operating Systems: Three Easy Pieces(因为操作系统概念与您相关,因为裸机上的嵌入式系统与操作系统共享功能)。 OSDEV wiki也可能有所帮助(但与RISC-V无关)。

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

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