如何在 M1 Mac (ARM) 上编译 x86_64 asm 代码
How can I compile x86_64 asm code on M1 Mac (ARM)
我在大学里有一门编译器课程,作为其中的一部分,我们研究了 nano pass 编译器并创建了 pass。所以在这个过程中有一个步骤
gcc -g -std=c99 runtime.o tests/var_test_1.s
runtime.o is a compilation of runtime.c file.
我得到一个错误:
tests/var_test_1.s:3:12: error: unknown token in expression
movq , %rax
^
tests/var_test_1.s:3:12: error: invalid operand
movq , %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 [=13=], %rsp
^
tests/var_test_1.s:11:11: error: invalid operand
subq [=13=], %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 [=13=], %rsp
^
tests/var_test_1.s:16:11: error: invalid operand
addq [=13=], %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,但我不想 运行 虚拟机来完成这样的任务。 qemu-static 似乎不能直接在 M1 上工作。
以下是var_1_test.s的内容(这个文件是由只支持x86的编译器生成的[自然而然])
.align 16
_start:
movq , %rax
jmp _conclusion
.globl _main
.align 16
_main:
pushq %rbp
movq %rsp, %rbp
subq [=14=], %rsp
jmp _start
.align 16
_conclusion:
addq [=14=], %rsp
popq %rbp
ret
如果需要任何进一步的详细信息,我将非常乐意提供。
谢谢!
所以在通过术语 cross-compiler 挖掘了更多的堆栈溢出答案之后,感谢@paweł-Łukasik,
我得到了关于如何 运行 x86 代码的答案,或者事实上,在 cli 上使用 Rosetta 2 的 x86 架构中的任何命令。
How to run the Homebrew installer under Rosetta 2 on M1 Macbook
我对 makefile 进行了更改以添加 arch -x86_64 ...
和其他一切 运行 完美。
我在大学里有一门编译器课程,作为其中的一部分,我们研究了 nano pass 编译器并创建了 pass。所以在这个过程中有一个步骤
gcc -g -std=c99 runtime.o tests/var_test_1.s
runtime.o is a compilation of runtime.c file.
我得到一个错误:
tests/var_test_1.s:3:12: error: unknown token in expression
movq , %rax
^
tests/var_test_1.s:3:12: error: invalid operand
movq , %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 [=13=], %rsp
^
tests/var_test_1.s:11:11: error: invalid operand
subq [=13=], %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 [=13=], %rsp
^
tests/var_test_1.s:16:11: error: invalid operand
addq [=13=], %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,但我不想 运行 虚拟机来完成这样的任务。 qemu-static 似乎不能直接在 M1 上工作。
以下是var_1_test.s的内容(这个文件是由只支持x86的编译器生成的[自然而然])
.align 16
_start:
movq , %rax
jmp _conclusion
.globl _main
.align 16
_main:
pushq %rbp
movq %rsp, %rbp
subq [=14=], %rsp
jmp _start
.align 16
_conclusion:
addq [=14=], %rsp
popq %rbp
ret
如果需要任何进一步的详细信息,我将非常乐意提供。 谢谢!
所以在通过术语 cross-compiler 挖掘了更多的堆栈溢出答案之后,感谢@paweł-Łukasik, 我得到了关于如何 运行 x86 代码的答案,或者事实上,在 cli 上使用 Rosetta 2 的 x86 架构中的任何命令。
How to run the Homebrew installer under Rosetta 2 on M1 Macbook
我对 makefile 进行了更改以添加 arch -x86_64 ...
和其他一切 运行 完美。