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 程序(如交叉 objdump
、nm
、readelf
等)来探索相关的目标文件。
如果您正在为裸机系统编码,您可能希望在独立模式下编译 (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
;第一次尝试,我会考虑只使用整数。
目前,我正在学习 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 程序(如交叉 objdump
、nm
、readelf
等)来探索相关的目标文件。
如果您正在为裸机系统编码,您可能希望在独立模式下编译 (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
;第一次尝试,我会考虑只使用整数。