【问题标题】:GCC: libstdc++.so: Error adding sybols: file in wrong formatGCC:libstdc++.so:添加符号时出错:文件格式错误
【发布时间】:2020-10-07 11:50:39
【问题描述】:

我正在尝试使用 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 社区存储库。

【问题讨论】:

  • gd32v ... 所以你应该为 32 位编译。但是您似乎正在调用 64 位工具链并链接 64 位版本的 c++ 库。 32/64 位冲突可能是您的问题。不确定您的工具链看起来如何,但可能riscv64-linux-gnu-g++ 不是适合您的编译器,您还有其他选择吗?
  • @dratenik 感谢您的回复!我也在考虑这个,但工具链应该能够编译为 32 位。描述如下“Cross compiler for 32-bit and 64-bit RISC-V”。我还可以毫无问题地指定 -march 和 -mabi 标志。
  • 您可以通过在其上运行file 来检查错误消息中提到的libstdc++.so 文件的格式。如果是 64 位,那就是问题所在。
  • @dratenik 它 64位,谢谢!从来不知道这个命令,它非常有用。但我很困惑;我编译了那个文件,还是一个标准包含的库?
  • 这是编译器附带的 C++ 标准库。 g++ 默认链接它,因为它是 c++ 东西所需要的。你有 32 位版本在附近的一些目录中吗?

标签: c++ gcc riscv


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2015-03-14
    • 2020-10-26
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多