如何解决未定义引用'malloc'等
当我尝试遵守dhrystone基准测试时,它显示以下错误:
xilinx@pynq:~/dhrystone$ riscv32-unknown-elf-gcc -Os -ffreestanding -nostdlib -o out.elf -Wl,-Bstatic,-T,picorv32.ld dhry_1.o dhry_2.o init.o -lgcc -march=rv32im
/opt/riscv32im/lib/gcc/riscv32-unknown-elf/10.1.0/../../../../riscv32-unknown-elf/bin/ld: dhry_1.o: in function `Proc_1':
dhry_1.c:(.text+0x84): undefined reference to `memcpy'
/opt/riscv32im/lib/gcc/riscv32-unknown-elf/10.1.0/../../../../riscv32-unknown-elf/bin/ld: dhry_1.c:(.text+0x100): undefined reference to `memcpy'
/opt/riscv32im/lib/gcc/riscv32-unknown-elf/10.1.0/../../../../riscv32-unknown-elf/bin/ld: dhry_1.o: in function `main':
dhry_1.c:(.text.startup+0x3c): undefined reference to `malloc'
/opt/riscv32im/lib/gcc/riscv32-unknown-elf/10.1.0/../../../../riscv32-unknown-elf/bin/ld: dhry_1.c:(.text.startup+0x4c): undefined reference to `malloc'
/opt/riscv32im/lib/gcc/riscv32-unknown-elf/10.1.0/../../../../riscv32-unknown-elf/bin/ld: dhry_1.c:(.text.startup+0x84): undefined reference to `strcpy'
/opt/riscv32im/lib/gcc/riscv32-unknown-elf/10.1.0/../../../../riscv32-unknown-elf/bin/ld: dhry_1.c:(.text.startup+0x98): undefined reference to `strcpy'
/opt/riscv32im/lib/gcc/riscv32-unknown-elf/10.1.0/../../../../riscv32-unknown-elf/bin/ld: dhry_1.c:(.text.startup+0xb8): undefined reference to `time'
/opt/riscv32im/lib/gcc/riscv32-unknown-elf/10.1.0/../../../../riscv32-unknown-elf/bin/ld: dhry_1.c:(.text.startup+0xf0): undefined reference to `strcpy'
/opt/riscv32im/lib/gcc/riscv32-unknown-elf/10.1.0/../../../../riscv32-unknown-elf/bin/ld: dhry_1.c:(.text.startup+0x184): undefined reference to `time'
/opt/riscv32im/lib/gcc/riscv32-unknown-elf/10.1.0/../../../../riscv32-unknown-elf/bin/ld: dhry_1.c:(.text.startup+0x254): undefined reference to `strcpy'
/opt/riscv32im/lib/gcc/riscv32-unknown-elf/10.1.0/../../../../riscv32-unknown-elf/bin/ld: dhry_2.o: in function `.L15':
dhry_2.c:(.text+0x118): undefined reference to `strcmp'
collect2: error: ld returned 1 exit status
似乎所有缺少的功能都来自stdih.h。但是我不知道如何解决。
这是我用来编译基准测试的命令。
riscv32-unknown-elf-gcc -c -Qn -DSTKPTR=32768 -march=rv32im -o init.o -Os --std=c99 init.S
riscv32-unknown-elf-gcc -c -Qn -march=rv32im -o dhry_1.o -Os --std=c99 dhry_1.c
riscv32-unknown-elf-gcc -c -Qn -march=rv32im -o dhry_2.o -Os --std=c99 dhry_2.c
riscv32-unknown-elf-gcc -Os -ffreestanding -nostdlib -o out.elf -Wl,picorv32.ld init.o dhry_1.o dhry_2.o -lgcc -march=rv32im
riscv32-unknown-elf-objcopy -O binary out.elf out.bin
任何人都可以帮助我。感谢您的帮助。
在@yflelion的帮助下,我将第五行更改为以下内容,
riscv32-unknown-elf-gcc -Os -ffreestanding -nostdlib -o out.elf -Wl,picorv32.ld init.o dhry_1.o dhry_2.o -lgcc -lc -lgloss -march=rv32im
它显示以下错误,
/opt/riscv32im/lib/gcc/riscv32-unknown-elf/10.1.0/../../../../riscv32-unknown-elf/bin/ld: /opt/riscv32im/lib/gcc/riscv32-unknown-elf/10.1.0/../../../../riscv32-unknown-elf/lib/libgloss.a(sys_gettimeofday.o): in function `.L5':
sys_gettimeofday.c:(.text+0x48): undefined reference to `__errno'
/opt/riscv32im/lib/gcc/riscv32-unknown-elf/10.1.0/../../../../riscv32-unknown-elf/bin/ld: /opt/riscv32im/lib/gcc/riscv32-unknown-elf/10.1.0/../../../../riscv32-unknown-elf/lib/libgloss.a(sys_sbrk.o): in function `.L7':
sys_sbrk.c:(.text+0x84): undefined reference to `__errno'
collect2: error: ld returned 1 exit status
使用以下命令,
riscv32-unknown-elf-gcc -Os -ffreestanding -nostdlib -o out.elf -Wl,picorv32.ld init.o dhry_1.o dhry_2.o -lgcc -lc -march=rv32im
它显示以下错误,
/opt/riscv32im/lib/gcc/riscv32-unknown-elf/10.1.0/../../../../riscv32-unknown-elf/bin/ld: /opt/riscv32im/lib/gcc/riscv32-unknown-elf/10.1.0/../../../../riscv32-unknown-elf/lib/libc.a(lib_a-sbrkr.o): in function `_sbrk_r':
sbrkr.c:(.text+0x20): undefined reference to `_sbrk'
解决方法
使用nostdlib时,编译器在链接时不使用标准的系统启动文件或库。
https://gcc.gnu.org/onlinedocs/gcc/Link-Options.html
使用命令行链接的唯一库是libgcc,但是您使用的是libc中的函数。您需要添加-lc和最可能的-lgloss。注意循环依赖项(--start-group --end-group)。
您可以添加-v选项,并使用默认选项编译一个极简示例,以查看默认情况下的完成方式。
如果没有理由不能默认使用libc和libgloss,则最好删除nostdlib选项。
要编译您的示例,请尝试:
riscv32-unknown-elf-gcc -Os -ffreestanding -nostdlib -o out.elf -Wl,-Bstatic,-T,picorv32.ld init.o dhry_1.o dhry_2.o -lgcc -lc -lgloss -lc -march=rv32im
但是避免循环依赖的最佳解决方案是:
riscv32-unknown-elf-gcc -Os -ffreestanding -nostdlib -o out.elf -Wl,picorv32.ld init.o dhry_1.o dhry_2.o -lgcc --start-group -lc -lgloss --end-group -lgcc -march=rv32im
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。