解决编译“ Error: selected processor does not support ARM mode `smc #0”问题

本文探讨了在使用arm2011.09编译器编译pandaboard的x-loader时遇到的编译问题,主要涉及错误提示selected processor does not support ARM mode 'smc#0'。文章提供了两种解决方案,一种是修改编译器配置,另一种是在代码中添加.arch_extensionsec指令以解决冲突。最终总结指出,问题源于代码写法与编译器存在不兼容之处。

在用arm2011.09编译器编译pandaboard的x-loader时遇到如下编译问题:

 Error: selected processor does not support ARM mode `smc #0

google了一下,貌似这样的问题还是挺多的,有几种方法,一一实验。

1.

replacing in arch/arm/mach-omap2/Makefile:

AFLAGS_sleep24xx.o                      :=-Wa,-march=armv6
AFLAGS_sleep34xx.o                      :=-Wa,-march=armv7-a

to:

AFLAGS_sleep24xx.o                      :=-Wa,-march=armv6
AFLAGS_sleep34xx.o                      :=-Wa,-march=armv7-a$(plus_sec)

helps compiling (see also: https://patchwork.kernel.org/patch/369681/)

在config.mk中修改后,实验无效,

$(plus_sec)
为空,无效。

2. uboot的faq,http://www.denx.de/wiki/ELDK-5/FrequentlyAskedQuestionsAndAnswers,标题Cannot compile Linux kernel version 2.6.32 for armv7a

Question:
I want to compile a vendor-provided old Linux kernel tree (kernel version 2.6.32) with ELDK 5.0 for the armv7a configuration. Unfortunately this fails with errors like this one:
 ...
  CC      arch/arm/kernel/sysfs_v7.o
/tmp/ccwkv7On.s: Assembler messages:
/tmp/ccwkv7On.s:249: Error: selected processor does not support ARM mode `smc #0'
/tmp/ccwkv7On.s:289: Error: selected processor does not support ARM mode `smc #0'
make[1]: *** [arch/arm/kernel/sysfs_v7.o] Error 1

Answer:
Your kernel tree is too old for the ELDK 5.0 tool chain.You can work around this problem by applying the following patch to your kernel tree:
--- arch/arm/kernel/sysfs_v7.c.ORIG   2011-01-27 11:47:54.000000000 +0100
+++ arch/arm/kernel/sysfs_v7.c   2011-05-10 08:51:58.953252638 +0200
@@ -76,7 +76,8 @@
    asm ("mrc p15, 0, %0, c1, c0, 1" : "=r"(val));
    SETBITS(val, 0xff8, new);
    val &= ~2;
-   asm ("mov r0,  %0   \n\t"
+   asm (".arch_extension sec\n\t"
+        "mov r0,  %0   \n\t"
         "mov r12, #3   \n\t"
         "smc #0      \n\t"
         :: "r"(val) : "r0", "r12");
@@ -107,7 +108,8 @@
 
    asm ("mrc p15, 1, %0, c9, c0, 2" : "=r"(val));
    SETBITS(val, 0xbc00000, new);
-   asm ("mov r0,  %0   \n\t"
+   asm (".arch_extension sec\n\t"
+        "mov r0,  %0   \n\t"
         "mov r12, #2   \n\t"
         "smc #0      \n\t"
         :: "r"(val) : "r0", "r12");

在代码中添加
.arch_extension sec
后,编译通过。

总结:应该是代码写法与编译器有冲突,需要在代码中声明扩展指令段

/tmp/ccnLOKpN.s:1475: 错误: selected processor does not support `cpsid i' in ARM mode make[1]: *** [scripts/Makefile.build:278:arch/arm/kernel/traps.o] 错误 1 /tmp/ccuTE3eo.s: Assembler messages: /tmp/ccuTE3eo.s:52: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:64: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:139: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:153: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:176: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:189: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:341: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:354: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:460: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:474: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:488: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:501: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:525: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:543: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:637: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:655: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:681: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:698: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:866: 错误: selected processor does not support `cpsid i' in ARM mode /tmp/ccuTE3eo.s:881: 错误: selected processor does not support `cpsie i' in ARM mode /tmp/ccuTE3eo.s:897: 错误: selected processor does not support `dmb ish' in ARM mode /tmp/ccuTE3eo.s:914: 错误: selected processor does not support `cpsid i' in ARM mode /tmp/ccuTE3eo.s:1097: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:1123: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:1177: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:1200: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:1215: 错误: selected processor does not support `isb ' in ARM mode /tmp/ccuTE3eo.s:1232: 错误: selected processor does not support `isb ' in ARM mode make[1]: *** [scripts/Makefile.build:278:arch/arm/kernel/signal.o] 错误 1 make: *** [Makefile:1080:arch/arm/kernel] 错误 2
最新发布
05-23
### ARM模式下编译错误 `selected processor does not support &#39;isb&#39; in ARM mode` 和 `&#39;cpsid&#39; in ARM mode` 的解决方案 #### 1. **问题描述与背景** 在ARM架构的开发环境中,当尝试编译某些特定指令(如 `isb`, `dmb`, 或 `cpsid`)时,可能会遇到类似于 `Error: selected processor does not support ARM mode &#39;isb&#39;` 或者 `Error: selected processor does not support ARM mode &#39;cpsid&#39;` 这样的错误。这类错误通常是由于目标处理器不支持所使用的汇编指令集所致[^1]。 #### 2. **根本原因分析** ##### (a) **目标处理器架构限制** 不同的ARM处理器实现可能仅支持有限的一部分指令子集。例如,较老的ARMv5或ARMv6架构可能并不完全支持一些现代ARMv7-A或者更高版本引入的新特性,诸如屏障指令 (`isb`, `dmb`) 或特权级切换指令 (`cpsid`) 等[^2]。 ##### (b) **编译器配置不当** 即使硬件理论上能够执行这些高级功能,但如果编译器未能正确定义目标CPU类型以及相应的ABI设置,则仍会触发类似的报错消息。具体来说,可能是 `-march`, `-mtune`, 或其他相关选项指定得不够精确造成的后果[^3]。 #### 3. **解决方法** 以下是几种针对上述两类情况的有效应对措施: ##### 方法一:确认并适配正确的体系结构级别 确保GCC或其他C/C++编译工具链正在为目标设备的实际能力定制化工作流。可以通过修改Makefile或者其他构建脚本里的参数来达成这一点。例如: ```bash export ARCH=arm export CROSS_COMPILE=<path_to_cross_compiler>- make ... CC_FLAGS="-march=armv7-a -mfpu=vfpv3-d16 -mfloat-abi=softfp" ``` 这里的关键在于将 `-march` 设定为确切匹配目的平台所需的最低限度标准之上;同时也要注意浮点运算单元(FPU)的选择是否合理[^4]。 ##### 方法二:有条件地屏蔽不受支持的操作码 如果确实无法更改底层硬件规格又必须保留向后兼容性,则可以在源代码层面加入条件判断逻辑绕过那些高需求场景下的敏感操作符调用。举个例子,在涉及内存同步的地方可以用宏定义包裹起来: ```c #ifdef __ARM_ARCH_7A__ asm volatile ("isb":::"memory"); #else /* Fallback action */ #endif ``` 这样做的好处是可以灵活适应多种不同世代的产品线而无需牺牲太多性能表现[^5]。 ##### 方法三:升级至最新版工具链软件包 有时旧版本的GNU Binutils/GCC可能存在已知缺陷导致误解甚至拒绝合法语句序列的情况发生。因此定期更新到官方发布的稳定发行版也是值得推荐的做法之一[^6]。 #### 4. **验证修复效果的方法论** 完成以上任一步骤之后重新启动整个项目的清洁重建过程,并密切观察终端输出日志的变化趋势直至所有先前报告过的异常现象消失为止。另外还可以借助调试器深入探究最终产物内部运作机制以确保预期行为得以贯彻始终[^7]。 --- ###
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值