GCC 7.1.1 RISCV编译(链接)失败,ABI不兼容

GCC 7.1.1 RISCV编译(链接)失败,ABI不兼容,gcc,cross-compiling,toolchain,riscv,Gcc,Cross Compiling,Toolchain,Riscv,我在windows 7-64位平台上的最新GCC for RISCV上为RISCV进行基本编译和链接时遇到困难 安装的工具:7.1.1-2-20170912-2255从 平台:Windows 7,64位,无cygwin 节目: #include <stdint.h> int32_t iBlahblah; int main (void) { while(1) iBlahblah++; return 0; } 输出: c:/program files/

我在windows 7-64位平台上的最新GCC for RISCV上为RISCV进行基本编译和链接时遇到困难

安装的工具:7.1.1-2-20170912-2255从

平台:Windows 7,64位,无cygwin

节目:

#include <stdint.h>

int32_t iBlahblah;
int main (void)
{
    while(1)
        iBlahblah++;
    return 0;
}
输出:

c:/program files/gnu mcu eclipse/risc-v embedded gcc/7.1.1-2-20170912-2255/bin/../lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld.exe: hello.o: ABI is incompatible with that of the selected emulation:  target emulation `elf64-littleriscv' does not match `elf32-littleriscv'
c:/program files/gnu mcu eclipse/risc-v embedded gcc/7.1.1-2-20170912-2255/bin/../lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld.exe: failed to merge target specific data of file hello.o
c:/program files/gnu mcu eclipse/risc-v embedded gcc/7.1.1-2-20170912-2255/bin/../lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/lib/rv32imac/ilp32\libg.a(lib_a-exit.o): In function `.L0 ':  exit.c:(.text.exit+0x1e): undefined reference to `_exit'
c:/program files/gnu mcu eclipse/risc-v embedded gcc/7.1.1-2-20170912-2255/bin/../lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld.exe: hello.elf(.text): relocation "iBlahblah+0x0 (type R_RISCV_HI20)" goes out of range
c:/program files/gnu mcu eclipse/risc-v embedded gcc/7.1.1-2-20170912-2255/bin/../lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld.exe: hello.o: file class ELFCLASS64 incompatible with ELFCLASS32
c:/program files/gnu mcu eclipse/risc-v embedded gcc/7.1.1-2-20170912-2255/bin/../lib/gcc/riscv64-unknown-elf/7.1.1/../../../../riscv64-unknown-elf/bin/ld.exe: final link failed: File in wrong format
collect2.exe: error: ld returned 1 exit status
最大的问题是如何解决“ABI与所选仿真的ABI不兼容”的问题?我们可以忽略关于重新定位、退出等的其他问题,因为我的大型构建环境会处理这些问题(它为许多平台构建,而不是目前的RISCV)

riscv64-unknown-elf-gcc.exe-c hello.c-o hello-march=rv32imac-mabi=ilp32-Os

这部分是错误的。你的医生说

riscv64未知elf gcc与riscv32未知elf gcc 由于支持许多体系结构和系统,GCC建议在二进制文件前加上唯一的元组:

<arch>-<vendor>-<os>-<libc/abi>-
,多库选项),但出现了问题。请发布
gcc-v-o您的_program.bin
riscv32编译器、riscv64编译器和几个MARGE/mabi组合的结果

riscv64-unknown-elf-gcc.exe-c hello.c-o hello-march=rv32imac-mabi=ilp32-Os

这部分是错误的。你的医生说

riscv64未知elf gcc与riscv32未知elf gcc 由于支持许多体系结构和系统,GCC建议在二进制文件前加上唯一的元组:

<arch>-<vendor>-<os>-<libc/abi>-

,多库选项),但出现了问题。请发布
gcc-v-o riscv32编译器、riscv64编译器和几个march/mabi组合的_program.bin
结果。

您将gcc用于riscv64,并希望它以32位模式编译。但是这个gcc将64位模式的c运行库添加到链接阶段(向gcc添加-v选项以查看gcc添加的其他crt文件),这是错误的(32位elf和64位elf对象不能链接在一起)。对于64位模式的64位目标,应该使用gcc;和32位模式的32位目标的gcc(实际上您需要32位crt;它可能包含在您的gcc中,但它使用了错误的版本)@osgx位于以下位置的文档说明riscv64-unknown-elf-gcc.exe可以同时针对32位和64位。如何提示它使用32位库?请使用riscv32-unknown-elf-gcc.exe,它将使用32位CRT的正确路径。比较
riscv64-unknown-elf-gcc.exe-v…
vs
riscv32-unknown-elf-gcc.exe-v…
的输出,以使用CRT查找准确的目录。您的gcc声明支持多库,以便能够从riscv64-gcc搜索32位CRT库:但出现问题,它没有选择正确的多库目录。检查实际
gcc/config/riscv/t-elf-multilib
可能很有用。表示“支持march/mabi的组合。并非所有组合都有库。”@osgx我认为该工具有点损坏。如果我使用适当的
-melf32lriscv
通过riscv-unknown-elf-ld.exe调用,则没有问题。我认为gcc.exe没有将正确的内容传递给ld.exe,告诉它“这是带有rv32imac指令集的ilp32 abi”,您将gcc用于riscv64,并希望它以32位模式编译。但是这个gcc将64位模式的c运行库添加到链接阶段(向gcc添加-v选项以查看gcc添加的其他crt文件),这是错误的(32位elf和64位elf对象不能链接在一起)。对于64位模式的64位目标,应该使用gcc;和32位模式的32位目标的gcc(实际上您需要32位crt;它可能包含在您的gcc中,但它使用了错误的版本)@osgx位于以下位置的文档说明riscv64-unknown-elf-gcc.exe可以同时针对32位和64位。如何提示它使用32位库?请使用riscv32-unknown-elf-gcc.exe,它将使用32位CRT的正确路径。比较
riscv64-unknown-elf-gcc.exe-v…
vs
riscv32-unknown-elf-gcc.exe-v…
的输出,以使用CRT查找准确的目录。您的gcc声明支持多库,以便能够从riscv64-gcc搜索32位CRT库:但出现问题,它没有选择正确的多库目录。检查实际
gcc/config/riscv/t-elf-multilib
可能很有用。表示“支持march/mabi的组合。并非所有组合都有库。”@osgx我认为该工具有点损坏。如果我使用适当的
-melf32lriscv
通过riscv-unknown-elf-ld.exe调用,则没有问题。我认为gcc.exe没有将正确的内容传递给ld.exe,告诉它“这是带有rv32imac指令集的ilp32 abi”,我在任何地方都找不到预先构建的riscv32未知elf工具链(而且我自己也没有时间去构建它)。这些库在标准安装中,只是gcc.exe似乎没有正确调用ld.exe…或者我没有说正确的咒语让它正确调用ld.exe我在任何地方都找不到一个预构建的riscv32未知elf工具链(而且我自己也没有时间去构建它)。这些库在标准安装中,只是gcc.exe似乎没有正确调用ld.exe…或者我没有说正确的咒语让它正确调用ld.exe