GCC 11(arm-none-eabi)无法找到GCC 10可识别文件的问题求助
问题描述
我有一个汇编文件CyBootAsmGnu.s,代码如下:
.syntax unified .text .thumb .include "cyfittergnu.inc" // more
该文件使用Arm GCC 10版本(具体版本:arm-none-eabi-gcc (GNU Arm Embedded Toolchain 10-2020-q4-major) 10.2.1 20201103 (release))编译正常,但使用更新的GCC 11版本(具体版本:arm-none-eabi-gcc (GNU Toolchain for the Arm Architecture 11.2-2022.02 (arm-11.14)) 11.2.1 20220111)编译时失败。
执行编译命令:
$ arm-none-eabi-gcc -I/path/to/files -mcpu=cortex-m0 -mthumb -ffunction-sections -ffat-lto-objects -o CyBootAsmGnu.s.obj -c /path/to/files/CyBootAsmGnu.s
报错信息:
/path/to/files/CyBootAsmGnu.s: Assembler messages: /path/to/files/CyBootAsmGnu.s:18: Error: can't open cyfittergnu.inc for reading: No such file or directory
补充信息
cyfittergnu.inc确实存在于/path/to/files目录,权限为0777,GCC 10可正常读取该文件;- 被包含文件
cyfittergnu.inc与主汇编文件CyBootAsmGnu.s位于同一目录; - 操作系统为Windows10 WSL2上的NixOS,Windows10本机(另一代码仓库副本)也出现相同问题;
- 在
/path/to/files目录内编译时,两个版本编译器均可正常工作; -I参数路径绝对正确,命令行由CMake生成,两个编译器使用完全相同的命令行参数、工作目录。
请问出现该问题的原因是什么?两个版本编译器的头文件搜索顺序是否有变化?是否需要提交Bug报告?
问题分析与解答
原因:GCC 11对汇编器包含路径的处理逻辑变更
从GCC 10升级到GCC 11时,汇编器(arm-none-eabi-as)处理.include指令的搜索路径逻辑发生了变化:
- GCC 10中,当通过
gcc调用汇编器处理指定路径的源文件时,-I参数会被传递给汇编器,同时汇编器会自动将源文件所在目录加入搜索路径,因此.include "cyfittergnu.inc"能找到同目录的文件; - GCC 11中,汇编器不再自动将源文件所在目录加入搜索路径,仅使用
-I指定的路径和系统默认路径。更关键的是,GCC 11前端可能没有正确将-I参数传递给汇编器,导致指定的包含路径未生效。
可以通过直接调用汇编器验证:
# 用GCC 11配套的汇编器测试 $ arm-none-eabi-as -I/path/to/files -mcpu=cortex-m0 -mthumb -o CyBootAsmGnu.s.obj /path/to/files/CyBootAsmGnu.s
如果同样报错,说明是汇编器的路径搜索逻辑变更;如果正常,说明是GCC前端传递参数的问题。
是否需要提交Bug报告?
如果确认是GCC 11在传递-I参数给汇编器时出现遗漏,或者汇编器取消了自动搜索源文件所在目录的逻辑但未在官方文档中明确说明,应该提交Bug报告。提交时需清晰描述版本差异、复现步骤、环境信息以及GCC 10与11的行为对比。
临时解决方案
- 编译时切换到源文件所在目录执行(已验证可行);
- 在CMake中额外将源文件所在目录添加到汇编器包含路径,例如通过
CMAKE_ASM_FLAGS传递-I${CMAKE_CURRENT_SOURCE_DIR}; - 修改汇编文件中的
.include指令为绝对路径(但移植性较差)。
内容的提问来源于stack exchange,提问作者Daniel Jour
相关产品推荐
相关产品推荐

