我在大学里有一门编译器课程,作为其中的一部分,我们研究nano-pass编译器并创建通行证。所以在这个过程中有一个步骤
gcc -g -std=c99 runtime.o tests/var_test_1.s
runtime.o是runtime.c文件的编译。
并且我得到一个错误:
tests/var_test_1.s:3:12: error: unknown token in expression
movq $42, %rax
^
tests/var_test_1.s:3:12: error: invalid operand
movq $42, %rax
^
tests/var_test_1.s:4:2: error: unrecognized instruction mnemonic, did you mean: cmp?
jmp _conclusion
^
tests/var_test_1.s:9:8: error: unknown token in expression
pushq %rbp
^
tests/var_test_1.s:9:8: error: invalid operand
pushq %rbp
^
tests/var_test_1.s:10:7: error: unknown token in expression
movq %rsp, %rbp
^
tests/var_test_1.s:10:7: error: invalid operand
movq %rsp, %rbp
^
tests/var_test_1.s:11:11: error: unknown token in expression
subq $0, %rsp
^
tests/var_test_1.s:11:11: error: invalid operand
subq $0, %rsp
^
tests/var_test_1.s:12:2: error: unrecognized instruction mnemonic, did you mean: cmp?
jmp _start
^
tests/var_test_1.s:16:11: error: unknown token in expression
addq $0, %rsp
^
tests/var_test_1.s:16:11: error: invalid operand
addq $0, %rsp
^
tests/var_test_1.s:17:7: error: unknown token in expression
popq %rbp
^
tests/var_test_1.s:17:7: error: invalid operand
popq %rbp
^
tests/var_test_1.s:18:2: error: unrecognized instruction mnemonic, did you mean: eret, ret?
retq
^
在进一步的阅读中,我发现这是因为M1 Mac由于是ARM架构,不能直接编译x86_64 asm代码。是否有任何标志或任何版本的gcc可以用于编译arm架构上的x86代码
我看过rosetta和qemu,但我不想为这样的任务运行vm。qemu-static在M1上似乎没有那么简单。
以下是var_1_test.s的内容(该文件由只支持x86的编译器生成[当然是自然的](
.align 16
_start:
movq $42, %rax
jmp _conclusion
.globl _main
.align 16
_main:
pushq %rbp
movq %rsp, %rbp
subq $0, %rsp
jmp _start
.align 16
_conclusion:
addq $0, %rsp
popq %rbp
ret
如果需要任何进一步的细节,我将非常乐意提供。谢谢
因此,在挖掘了更多堆栈溢出的答案后,感谢@paweł-Łukasik,通过术语交叉编译器,我得到了关于如何使用Rosetta 2在cli上运行x86代码,或者实际上是x86架构中的任何命令的答案。
如何在M1 Macbook 上运行Rosetta 2下的Homebrew安装程序
我对makefile进行了更改以添加arch -x86_64 ...
,其他一切都运行得很好。