我在大學里有一門編譯器課程,作為其中的一部分,我們研究納米通道編譯器并創建通道。所以在這個程序中有一個步驟
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
如果需要任何進一步的細節,我將非常樂意提供。謝謝!
uj5u.com熱心網友回復:
因此,在挖掘了更多堆疊溢位答案之后,并且感謝@pawe?-?ukasik,通過術語交叉編譯器,我得到了關于如何運行 x86 代碼的答案,或者事實上 x86 架構中的任何命令使用 Rosetta 2 的 cli。
如何在 M1 Macbook 上的 Rosetta 2 下運行 Homebrew 安裝程式
我對makefile進行了更改以添加arch -x86_64 ...
,其他一切都運行良好。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/443207.html
標籤:macos assembly x86-64 cross-compiling apple-m1
上一篇:如何清空所有已使用的暫存器,重新啟動MIPS中的程式?
下一篇:如何解釋uops.info?
