linux编译bad value (armv4t) for -march问题解决

本文详细描述了在编译ARM内核时遇到的make错误,并提供了相应的解决方案,涉及make命令、gcc编译器选项及内核源代码配置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

编译arm内核时make出现下述问题:

  CHK     include/linux/version.h

  CHK     include/generated/utsrelease.h
  HOSTCC  scripts/basic/fixdep
  HOSTCC  scripts/basic/docproc
  HOSTCC  scripts/basic/hash
make[1]: `include/generated/mach-types.h' is up to date.
  CC      kernel/bounds.s
cc1: error: unrecognized command line option "-mlittle-endian"
cc1: error: unrecognized command line option "-mabi=aapcs-linux"
cc1: error: unrecognized command line option "-mno-thumb-interwork"
kernel/bounds.c:1: error: bad value (armv4t) for -march= switch
kernel/bounds.c:1: error: bad value (arm9tdmi) for -mtune= switch

make[1]: *** [kernel/bounds.s] Error 1

make: *** [prepare0] Error 2

类似问题 解决办法
make ARCH=arm CROSS_COMPILE=arm-linux-


<think>好的,我现在要解决用户在使用arm-linux-gnueabihf-gcc编译时遇到的-march参数错误问题。用户给出的错误信息是“unrecognized -march target”,并且引用了几个相关的解决方案。我需要结合用户提供的引用内容和之前的回答,给出一个全面且步骤清晰的解决方案。 首先,我需要回顾用户的问题。用户遇到了编译错误,具体是arm-linux-gnueabihf-gcc无法识别-march的参数,比如native或armv5。用户引用了三个解决方法:删除Makefile中的-Werror选项、重新执行编译命令和使用sed替换arch参数。另外,用户之前的问题中也提到了关于ARM架构参数的有效值,比如armv7-a、armv8-a等。 接下来,我需要分析错误原因。根据引用内容,可能的原因包括: 1. 使用了不支持的-march参数,比如native或者armv5,而工具链不支持这些值。 2. 旧版源码使用了过时的编译选项,导致新版编译器报错。 3. Makefile中可能存在硬编码的旧架构参数,需要修改。 然后,我需要参考用户提供的引用中的解决方法。引用[1]提到删除Makefile中的-Werror选项,这可能是因为将警告视为错误导致编译失败。引用[3]建议使用sed替换arch参数,比如将armv5替换为armv7-a。引用[2]中的用户通过重新执行make命令解决问题,这可能是因为某些缓存或临时文件的问题。 结合之前的回答,解决方案应包括: 1. 确认目标设备的CPU架构,选择合适的-march参数。 2. 检查Makefile中的架构参数是否正确,必要时进行替换。 3. 移除可能引发错误的编译选项,如-Werror4. 清理编译缓存并重新编译。 此外,用户可能还需要验证工具链支持的架构参数,确保参数正确无误。 现在需要组织这些步骤,使其逻辑清晰,易于用户跟随。同时,要引用提供的引用内容,说明每个步骤的来源和原因,确保用户理解为什么这样做能解决问题。 可能需要注意的细节包括: - 使用sed命令替换Makefile中的参数时,确保路径正确。 - 不同的模块(如bfd、gas、ld)可能需要单独修改Makefile。 - 清理编译缓存的方法,如make clean或删除build目录。 最后,生成相关问题,帮助用户进一步解决可能遇到的类似问题,比如如何处理动态库依赖、优化NEON指令集等。</think>--- ### 针对`arm-linux-gnueabihf-gcc`的`-march`参数错误解决方案 #### **一、错误根源定位** 1. **参数不匹配** - **直接原因**:`-march`指定的架构值不在工具链支持列表中(如`native`、`armv5`)[^1][^2][^3] - **深层原因**:源码或编译脚本中硬编码了过时参数(如旧版代码默认`-march=armv5`,而工具链已不支持) 2. **工具链与源码版本冲突** - 旧版源码可能依赖特定编译器行为(如未严格遵循C标准),新版工具链会因语法严格性报错[^1] --- ### **二、分步解决方案** #### **1. 确认目标设备的CPU架构** - **执行命令**(在目标设备上运行): ```bash cat /proc/cpuinfo | grep "CPU architecture" ``` - **典型结果**: - ARMv7设备:显示`ARMv7`或具体型号(如Cortex-A7/A8) - ARMv8设备:显示`ARMv8` #### **2. 调整`-march`参数值** - **根据设备架构选择有效参数**: | 设备架构 | 推荐`-march`值 | 适用场景 | |-----------|----------------|------------------------------| | ARMv5 | `armv5te` | 旧版嵌入式设备(需工具链支持)| | ARMv7 | `armv7-a` | 主流Cortex-A系列设备 | | ARMv8 | `armv8-a` | 64位ARM设备(需工具链支持) | - **编译命令示例**: ```bash arm-linux-gnueabihf-gcc -march=armv7-a -mtune=cortex-a7 -O2 main.c ``` #### **3. 修改源码或编译脚本(关键步骤)** - **场景1**:源码中硬编码了不支持的架构参数(如`-march=armv5`) - **解决方案**:使用`sed`批量替换(参考引用[3]): ```bash # 替换所有Makefile中的armv5为armv7-a find . -name "Makefile" -exec sed -i 's/-march=armv5/-march=armv7-a/g' {} \; ``` - **场景2**:`-Werror`导致警告被视为错误(参考引用[1]) - **步骤**: 1. 进入编译目录的子模块(如`bfd`、`gas`、`ld`) 2. 编辑对应`Makefile`,删除`-Werror`选项 3. 示例(以`bfd`模块为例): ```bash cd $BUILDDIR/bfd vim Makefile # 搜索并删除所有-Werror ``` #### **4. 清理编译缓存并重新编译** - **强制清理旧编译文件**: ```bash make clean # 清理常规编译缓存 rm -rf build/* # 删除构建目录(如有) ``` - **重新编译并指定参数**: ```bash make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12 ``` - **参数说明**: - `V=1`:显示详细编译命令(便于调试) - `-j12`:并行编译加速(根据CPU核心数调整) #### **5. 验证工具链支持的架构参数** - **查询工具链支持的`-march`列表**: ```bash arm-linux-gnueabihf-gcc -march=help -Q --help=target 2>&1 | grep march ``` - **输出示例**: ``` -march=armv5te -march=armv7-a -march=armv8-a ``` --- ### **三、兼容性配置表** | 错误场景 | 解决方案 | 参考来源 | |---------------------------|-----------------------------------|------------| | `-march=armv5`不被支持 | 替换为`armv7-a`或`armv5te` | [^1][^3] | | 工具链版本与源码冲突 | 移除`-Werror`或降级编译器版本 | [^1] | | 参数拼写错误(如空格) | 检查格式:`-march=armv7-a`无空格 | 系统提示 | --- ### **四、扩展问题解答** **Q1: 替换`-march`参数后仍报错,如何排查?** - **步骤**: 1. 检查所有子模块的`Makefile`(如`binutils`、`gas`)是否残留旧参数 2. 执行`make distclean`彻底清理编译环境 3. 确认交叉编译工具链路径配置正确 **Q2: 如何为ARMv8设备启用64位支持?** - **编译命令**: ```bash # 需使用aarch64工具链(非arm-linux-gnueabihf) aarch64-linux-gnu-gcc -march=armv8-a main.c ``` **Q3: 出现`undefined reference to '__aeabi_uldivmod'`错误?** - **原因**:未链接GCC低级运行时库 - **修复**:添加`-lgcc`链接选项: ```bash arm-linux-gnueabihf-gcc ... -lgcc ``` --- ### **五、相关引用总结** - 删除`-Werror`可绕过严格语法检查 - 批量替换源码中的旧架构参数(如`armv5→armv7-a`)是通用解法[^3] - 重新编译前清理缓存可避免残留配置干扰[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值