GCC: libstdc++.so: 添加符号时出错:文件格式错误

GCC: libstdc++.so: Error adding sybols: file in wrong format

我正在尝试使用 gcc(arch community repo 上的 riscv 版本)编译 gd32v 芯片。 编译似乎工作正常,但是当尝试将对象 link 放入 elf 文件时,出现错误:

Linking ELF target: main.elf
riscv64-linux-gnu-g++ @_linker_flags -o main.elf ../../bmptk-RISC-V/targets/risc_v/gd32v/gd32vf103xb_boot.o hwlib.o main.o ../../bmptk-RISC-V/targets/risc_v/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.o ../../bmptk-RISC-V/targets/risc_v/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.o ../../bmptk-RISC-V/targets/risc_v/GD32VF103_standard_peripheral/system_gd32vf103.o bmptk_heap_none.o bmptk_fixed_size_stack.o -Os          -Tmain.ld       
/usr/lib/gcc/riscv64-linux-gnu/10.2.0/../../../../riscv64-linux-gnu/bin/ld: /usr/lib/gcc/riscv64-linux-gnu/10.2.0/../../../../riscv64-linux-gnu/lib/libstdc++.so: error adding symbols: file in wrong format
collect2: error: ld returned 1 exit status
make: *** [../../bmptk-RISC-V/Makefile.inc:1498: main.elf] Error 1

在此 make 规则中,我使用文件“_linker_flags”作为我的 linker 标志,以在编译期间保持终端清洁。该文件内容如下:

-march=rv32imac -mabi=ilp32 -Os -fdata-sections -ffunction-sections -I../../bmptk-RISC-V/targets/risc_v/ -I../../bmptk-RISC-V/targets/risc_v/GD32VF103_standard_peripheral -I../../bmptk-RISC-V/targets/risc_v/GD32VF103_standard_peripheral/Include -I../../bmptk-RISC-V/targets/risc_v/RISCV/drivers -I../../bmptk-RISC-V/targets/risc_v -I/usr/include -I/usr/include -I../../hwlib-RISC-V/library -I../../Catch2/single_include -I../../Catch2/single_include/catch2 -I../../boost_1_69_0 -I../../bmptk-RISC-V -I../../bmptk-RISC-V/targets -I../../bmptk-RISC-V/targets/risc_v -I../../bmptk-RISC-V/targets/risc_v/RISCV -I../../bmptk-RISC-V/targets/risc_v/RISCV/drivers -DHWCPP_FAKE_OSTREAM -DBMPTK_TARGET=gd32vf103v -DBMPTK_TARGET_gd32vf103v -DHWLIB_TARGET_gd32vf103v -DHWCPP_TARGET_gd32vf103v -DGF_TARGET_gd32vf103v -DBMPTK_CHIP=gd32vf103v -DBMPTK_CHIP_gd32vf103v -DBMPTK_XTAL= -DBMPTK_BAUDRATE=38400 -DHWLIB_BAUDRATE=38400 -DGODAFOSS_BAUDRATE=38400 -DGF_BAUDRATE=38400 -DBMPTK_VERSION=V04_00_work_in_progress_2020_05_23 -DBMPTK_EMBEDDED -lgcc -Wl,-Map,main.map -Wl,--gc-sections -Wl,-fatal-warnings

我不熟悉这个错误,有人知道我需要调查什么来解决这个问题吗?

编辑: 我问过学校的一位老师,他们告诉我,问题很可能是由于使用了不匹配的 linker 和编译器,或者调用 make 时某些目标文件没有被清理。我确保在编译之前删除了所有对象,并确保编译器和 linker 相同。

它们应该是一样的。我是 运行 riscv64-linux-gnu-ld 2.35 版和 riscv64-linux-gnu-g++ 10.2.0 版。两者均来自 arch 社区存储库。

要准确查看您的编译器支持的库的 mapping/switches,您可以使用:riscv64-linux-gnu-g++ -print-multi-lib。如果您的编译器是在启用 multilib 的情况下编译的,您可以选择没有硬浮动的 rv32 库,否则它不会 link 也因为您是 rv32imac 的编译器。
如果您的编译器是在没有 multlib 选项的情况下构建的,您有两个选择:
使用 -nostdlib 编译并将所需的文件提供给 linker crt、libc libgcc ... 或者您可以获得一个启用了 multilib 的编译器。