【问题标题】:riscv/gcc/ld - "Undefined reference to printf" using own script to linkriscv/gcc/ld - “未定义的 printf 引用”使用自己的脚本链接
【发布时间】:2017-11-03 04:02:47
【问题描述】:

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

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

问候!

【问题讨论】:

  • 您不仅需要学习 RISC-V,还需要学习更多内容。见norvig.com/21-days.html
  • 顺便说一句,你为什么不在你的 RISCV-V 上使用 Linux 呢?这可能会更容易,即使 Linux 在该平台上还没有完全成熟......
  • 我在 linux 上有一个 RISCV VM,我使用 CCS 重新定位到我的 MCU(TI 320F28335),现在我正在尝试编译 C 代码(工具链在 linux 上)并获取 RISCV 指令加载到MCU并执行
  • 我的猜测是你缺乏很多技能和知识。您可能需要数月或数年的努力才能获得它们。你想要达到的目标比你想象的要困难和复杂得多(因为你需要学习很多东西)。我建议在你的 RISCV 硬件上运行 Linux(即使它是一些虚拟的)。
  • 是的......我每天都在学习很多新知识......这对我来说很难

标签: linux gcc linker ld riscv


【解决方案1】:

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

您可以将additional options 传递给您的riscv-unknown-elf-ld 或者-M-L search-dir--trace--verbose 等。还请仔细阅读关于ld scripts.

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

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

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

如果您正在为裸机系统编码,您可能希望以独立模式编译(passing -ffreestanding 到您的 GCC)并提供实现您自己的printf(或其他输出)函数。现有的free software C 库可以激发您的灵感(但您需要找到一个或工作数月才能开发出类似的库)。学习GNU libcmusl-libc的源代码,获取灵感。

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

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

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

【讨论】:

  • 这意味着你正在进步
  • 我的脚本有SEARCH_DIR路径,-L参数可以用吗?或者我使用默认并添加 -L?
  • 我不太了解binutils。我提供了更多链接。你至少要花几天时间解决你的问题。我们无法提供更多帮助,因为您在问题中没有提供足够的详细信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 2013-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
  • 2019-07-03
相关资源
最近更新 更多