无法将双浮点模块与软浮点模块 riscv 编译器链接

问题描述 投票:0回答:3

我正在使用 riscv 编译器构建一个程序,当链接过程开始时,我遇到以下问题:

/home/luna/noelv-buildroot/output/images/riscv64-buildroot-linux-musl_sdk-buildroot/bin/../lib/gcc/riscv64-buildroot-linux-musl/8.3.0/../../../../riscv64-buildroot-linux-musl/bin/ld: /home/luna/noelv-buildroot/output/images/riscv64-buildroot-linux-musl_sdk-buildroot/bin/../lib/gcc/riscv64-buildroot-linux-musl/8.3.0/libgcc.a(_clzsi2.o): can't link double-float modules with soft-float modules

我正在使用编译器来编译和链接我的代码。这是我的编译器:

$ riscv64-linux-gcc --verbose 
COLLECT_GCC=/home/luna/noelv-buildroot/output/images/riscv64-buildroot-linux-musl_sdk-buildroot/bin/riscv64-linux-gcc.br_real
COLLECT_LTO_WRAPPER=/home/luna/noelv-buildroot/output/images/riscv64-buildroot-linux-musl_sdk-buildroot/bin/../libexec/gcc/riscv64-buildroot-linux-musl/8.3.0/lto-wrapper
Configured with ./configure --prefix=/home/luna/noelv-buildroot/output/host --sysconfdir=/home/luna/noelv-buildroot/output/host/etc --enable-static --target=riscv64-buildroot-linux-musl --with-sysroot=/home/luna/noelv-buildroot/output/host/riscv64-buildroot-linux-musl/sysroot --enable-__cxa_atexit --with-gnu-ld --disable-libssp --disable-multilib --disable-decimal-float --with-gmp=/home/luna/noelv-buildroot/output/host --with-mpc=/home/luna/noelv-buildroot/output/host --with-mpfr=/home/luna/noelv-buildroot/output/host --with-pkgversion='Buildroot 2020.02' --with-bugurl=http://bugs.buildroot.net/ --disable-libmpx --disable-libquadmath --disable-libsanitizer --enable-tls --enable-threads --without-isl --without-cloog --with-arch=rv64imafd --with-abi=lp64d --enable-languages=c,c++ --with-build-time-tools=/home/luna/noelv-buildroot/output/host/riscv64-buildroot-linux-musl/bin --enable-shared --disable-libgomp
Modelo de hilos: posix
gcc version 8.3.0 (Buildroot 2020.02) 
linux gcc cmake riscv buildroot
3个回答
3
投票

您的编译器是使用

disable-multilib
和 rv64imafd arch 构建的。所以基本上编译器提供的所有库都是针对这个架构编译的。

如果您尝试使用其他 arch 编译某些代码,默认情况下您将无法链接到它。另外,如果您提供一个库,您需要确保它是为此架构编译的,以便与工具链提供的库同时使用它。

您可以使用

readelf -h
查看图书馆的确切 arch 和 abi。


3
投票

我在尝试让 Stephen Marz 的 osblog 的第 1 章工作时遇到此错误。

更新

//risc_v/chapters/ch1/Makefile
中的这一行为我修复了它:

+++ CFLAGS+=-march=rv64gc -mabi=lp64d
--- CFLAGS+=-march=rv64gc -mabi=lp64

我对编译器知之甚少,但我认为本质问题是 RISC-V GNU 编译器工具链是为使用双浮点而生成的,但

//risc_v/chapters/ch1/Makefile
中工具链的调用试图使用软浮点

来自 RISC-V GNU 编译器工具链自述文件

支持的 ABI 包括 ilp32(32 位软浮点)、ilp32d(32 位硬浮点)、ilp32f(寄存器中为单精度、内存中为双精度的 32 位,仅限利基用途)、lp64 lp64f lp64d(相同)但具有 64 位长和指针)。

我现在可以构建并运行第 1 章。我还没有验证后续章节是否仍然有效。


1
投票

无法发表评论,因为代表太低, 但您是否尝试过添加 -msoft-float 标志 另外,您在哪里运行该命令/程序,例如硬件规格? 根据您的硬件规格,它可能完全相反,因此您应该尽量避免使用 double 关键字 您还可以分享一些代码吗?

© www.soinside.com 2019 - 2024. All rights reserved.