RISC V 链接器找不到 -lgcc
RISC V linker cannot find -lgcc
我正在尝试为 GCC 编译 C 代码,但链接器无法找到 libgcc。
我想为 RV32I 核心编译一些简单的测试。
当我尝试使用 modulo 运算符时,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 的说明进行操作
稍微 mod 化 (-j12
)
./configure --prefix=/opt/riscv --enable-multilib
make -j12
这也安装了工具链,所以我不必 make install
谢谢。
问题来自 -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
驱动程序制作 link 会更容易,因为他更了解所有选项。通常它会自动为您的 arch 找到必要的库(libgcc、libgloss ....)。
我正在尝试为 GCC 编译 C 代码,但链接器无法找到 libgcc。 我想为 RV32I 核心编译一些简单的测试。
当我尝试使用 modulo 运算符时,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
我按照 https://github.com/riscv/riscv-gnu-toolchain 的说明进行操作
稍微 mod 化 (-j12
)
./configure --prefix=/opt/riscv --enable-multilib
make -j12
这也安装了工具链,所以我不必 make install
谢谢。
问题来自 -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
驱动程序制作 link 会更容易,因为他更了解所有选项。通常它会自动为您的 arch 找到必要的库(libgcc、libgloss ....)。