c++ - 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 社区存储库。
解决方案
要准确查看编译器支持的库的映射/切换,您可以使用 : riscv64-linux-gnu-g++ -print-multi-lib
。如果您的编译器是在启用 multilib 的情况下编译的,您可以选择没有硬浮点的 rv32 库,否则它也不会链接,因为您是 rv32imac 的编译器。
如果您的编译器是在没有 multlib 选项的情况下构建的,那么您有两个选择:
编译-nostdlib
并将所需的文件提供给链接器 crt、libc libgcc ... 或者您可以获得一个启用了 multilib 的编译器。
推荐阅读
- javascript - 我从处理排序函数的 JS 代码中收到错误
- postgresql - 从返回多行的查询中仅选择一条记录
- git - 如何在 Git 中抑制或解决“信息:检测主机提供程序...”?
- javascript - 如何将反应 js 标题标题设置为数组的元素?
- pytorch - 使用 dataloader 在 pytorch 中进行替换采样
- nginx - 带有 nginx 入口的 Rabbitmq
- sql - 带有 TypeORM 的 PostgresQL 我可以从联结表中的 3 个实体实现复合主键吗?
- javascript - Chrome 上的 JavaScript Canvas SVG 线性渐变渲染
- jpa - 如何在 Spring Integration 中将事务范围限制为仅更新 JPA 出站网关(类似于“自动提交”)
- aws-lambda - AWS Lambda - (AccessDeniedException) 调用扫描操作时用户无权执行:dynamodb: Scan