首页 > 解决方案 > RISC V 链接器找不到 -lgcc

问题描述

我正在尝试为 GCC 编译 C 代码,但链接器无法找到 libgcc。我想为 RV32I 内核编译一些简单的测试。

当我尝试使用模运算符时,GCC 会生成对 mod 指令的软实现的调用。

call    __modsi3

但是链接失败,因为我认为我失踪了libgcc

test.c:(.text+0x34): undefined reference to `__modsi3'

这是我的编译命令:

riscv64-unknown-elf-gcc -lm -lgcc -static -march=rv32i -mabi=ilp32 -nostartfiles -ffreestanding  crt0.s -O0

这些是我的链接器选项:

-lgcc -b elf32-littleriscv -m elf32lriscv

如果我尝试-lgcc在链接器上使用该选项,它将引发以下错误:

riscv64-unknown-elf-ld: cannot find -lgcc

我也尝试直接提供libgcc.a. 但这没有帮助。我得到了libgcc.a这种方式的路径:

riscv64-unknown-elf-gcc -march=rv32i -print-libgcc-file-name

我将路径直接添加到我的编译命令中,如下所示:

-L="/mnt/c/Users/camin/Documents/opt/riscv/lib/gcc/riscv64-unknown-elf/10.2.0/libgcc.a"

此外,我编译工具链的方式可能是问题所在,我正在使用multi-lib支持的 RISCV 工具链

我按照https://github.com/riscv/riscv-gnu-toolchain的说明进行 了一些修改(-j12

./configure --prefix=/opt/riscv --enable-multilib
make -j12

这也安装了工具链,所以我不必make install

谢谢。

标签: cgcclinker-errorsriscvgnu-toolchain

解决方案


问题来自-L="/mnt/c/Users/camin/Documents/opt/riscv/lib/gcc/riscv64-unknown-elf/10.2.0/libgcc.a"您必须只提供L选项的路径。您的选择应该是:-L="/mnt/c/Users/camin/Documents/opt/riscv/lib/gcc/riscv64-unknown-elf/10.2.0"

enable-multilib 运行良好,它只提供一组拱门的库。但是请注意提供与您的拱门相对应的 libgcc 路径。当您启用 multilib 时,默认的将是 64 位版本。通常对于 rv32i,您需要的选项是 : -L="/mnt/c/Users/camin/Documents/opt/riscv/lib/gcc/riscv64-unknown-elf/10.2.0/rv32i/ilp32"

如果你不提供好的库,你可能会得到 ABI is incompatible with that of the selected emulation错误。

使用驱动程序建立链接会更容易,riscv64-unknown-elf-gcc因为他更了解所有选项。通常,它会自动为您的 Arch 找到必要的库(libgcc、libgloss ....)。


推荐阅读