Linux下编译arm64驱动代码汇编器报错

简单来说就是错误的汇编Ir约束 会导致编译器优化把这个操作数生成非法的汇编指令
然后汇编器就会傻眼 会报一个非常难懂的错误如下:
/tmp/ccxxxxxx.s: Assembler messages:
/tmp/ccxxxxxx.s:xxx: 错误: 立即数越界 at operand 3 -- 'eor w3,w20,4294967295'
我通过查看汇编手册发现eor指令确实不能接受4294967295这个数 超出了机器指令规定

根本原因是使用ll和sc指令的原子操作使用了不正确的Ir约束,在特别的参数下面会出现问题
简单来说就是Ir是一个立即数约束 指示编译器这个操作数是一个常数
而#constraint "r"告诉编译器需要把这个操作数放到一个通用寄存器里面
关键修改
" stxr %w1, %w0, %2\n"
" cbnz %w1, 1b"
: "=&r" (result), "=&r" (tmp), "+Q" (v->counter) \

  • : "Ir" (i)); \
  • : #constraint "r" (i)); \

链接:https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=5ef8dff99f434480e02cbe383ce2bb47057fc71b

posted @ 2024-06-13 22:48  opsiff  阅读(31)  评论(0编辑  收藏  举报