首页 > 解决方案 > GCC:libstdc++.so:添加符号时出错:文件格式错误

问题描述

我正在尝试使用 gcc(arch 社区 repo 上的 riscv 版本)编译 gd32v 芯片。编译似乎工作正常,但是当尝试将对象链接到 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' 作为链接器标志,以在编译期间保持终端清洁。该文件的内容如下:

-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

我不熟悉这个错误,有谁知道我需要研究什么来解决这个问题?

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

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

标签: c++gccriscv

解决方案


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


推荐阅读