因为一个疏忽导致找bug几小时,上网搜寻不得,现写于此,愿向我一样被这一小概率事件折磨的人早点解脱。。。
gprs.c: Assembler messages:
gprs.c:329: Error: invalid char '[' beginning operand 2 `[ %eax]'
gprs.c:329: Error: invalid char '[' beginning operand 2 `[ %eax]'
gprs.c:329: Error: invalid char '[' beginning operand 2 `[ %edi]'
gprs.c:329: Error: invalid char '[' beginning operand 2 `[ %ebx]'
gprs.c:329: Error: invalid char '[' beginning operand 2 `[ %edi]'
为一个嵌入式设备编程,编译器报错如上,源代码如下:
static inline void _outl(unsigned long addr, unsigned long dat) {
asm volatile (
"str %1, [ %0 ]\n"
:
: "r" (addr), "r" (dat)
: "memory"
);
}
百思不得其解,后发现原因:
Makefile中前段时间在电脑上调试程序把Makefile加了一行:
CC=arm-none-linux-gnueabi-gcc
CC :=gcc <--------------此行为新加行,意思是把CC变量重新赋值'gcc',也就是改交叉编译为直接编译
注释掉那行后编译通过。
原因:
这是一个C语言嵌入汇编的实例,汇编代码是目标arm核心处理器的汇编,当然必须要用对应的交叉编译器喽。

本文记录了一个关于嵌入式设备编程时遇到的罕见编译错误及其解决过程。错误出现在C语言内联汇编代码中,由于Makefile配置不当导致使用了错误的编译器。通过调整Makefile设置,问题得以解决。
1万+

被折叠的 条评论
为什么被折叠?



