簡體   English   中英

如何在 64 位 RaspberryPi 中編譯 32 位 ARM?

[英]How can I compile 32 bit ARM in a 64 bit RaspberryPi?

我正在用 ARM 32 做一些練習,但在 64 位 RaspberryPi 中。

這是代碼:

.global main

main:
        mov r0,#0
        mov r1,#5
        push {lr,ip}
        bl factorial
        pop {lr,ip} 
        bx lr

factorial:
        cmp r1,#1
        moveq pc,lr
        sub r1,r1,#1
        mul r0,r1,r0
        b factorial

如果我嘗試編譯 factorial.s,我會收到一堆錯誤:

cc    factorial.s   -o factorial
factorial.s: Assembler messages:
factorial.s:4: Error: operand 1 must be an integer register -- `mov r0,#0'
factorial.s:5: Error: operand 1 must be an integer register -- `mov r1,#5'
factorial.s:6: Error: unknown mnemonic `push' -- `push {lr,ip}'
factorial.s:8: Error: unknown mnemonic `pop' -- `pop {lr,ip}'
factorial.s:9: Error: unknown mnemonic `bx' -- `bx lr'
factorial.s:12: Error: operand 1 must be an integer or stack pointer register -- `cmp r1,#1'
factorial.s:13: Error: unknown mnemonic `moveq' -- `moveq pc,lr'
factorial.s:14: Error: operand 1 must be an integer or stack pointer register -- `sub r1,r1,#1'
factorial.s:15: Error: operand 1 must be a SIMD vector register -- `mul r0,r1,r0'
make: *** [<builtin>: factorial] Error 1

我認為這是因為我正在 64 位 Raspberry 中編譯 ARM32。

如何在 64 位 RaspberryPi 中編譯 ARM32?

一個簡單的解決方案是在 RaspberryPI 中使用 32 位版本的 Linux。

話雖如此,您需要在 64 位系統上安裝諸如arm-linux-gnueabihf類的工具鏈。 如果您的 Linux 系統是基於 Debian 的,您可以通過執行以下命令列出可用的軟件包:

sudo apt-cache search gnueabihf

另一種方法是從頭開始構建 binutils:

wget https://mirror.csclub.uwaterloo.ca/gnu/binutils/binutils-2.35.tar.xz
tar Jxf binutils-2.35.tar.xz
mkdir binutils
cd binutils
../binutils-2.35/configure --target=arm-linux-gnueabihf --program-prefix=arm-linux-gnueabihf- --prefix=/usr/local
make all
sudo make install

/usr/local/bin/arm-linux-gnueabihf-as -o factorial.o factorial.s
factorial.s: Assembler messages:
factorial.s:6: Warning: register range not in ascending order
factorial.s:8: Warning: register range not in ascending order

push {lr,ip}替換為push {ip, lr}並將pop {lr, ip}替換為pop {ip, lr}

/usr/local/bin/arm-linux-gnueabihf-as -o factorial.o factorial.s
/usr/local/bin/arm-linux-gnueabihf-objdump -d factorial.o

factorial.o:     file format elf32-littlearm


Disassembly of section .text:

00000000 <main>:
   0:   e3a00000        mov     r0, #0
   4:   e3a01005        mov     r1, #5
   8:   e92d5000        push    {ip, lr}
   c:   eb000001        bl      18 <factorial>
  10:   e8bd5000        pop     {ip, lr}
  14:   e12fff1e        bx      lr

00000018 <factorial>:
  18:   e3510001        cmp     r1, #1
  1c:   01a0f00e        moveq   pc, lr
  20:   e2411001        sub     r1, r1, #1
  24:   e0000091        mul     r0, r1, r0
  28:   eafffffa        b       18 <factorial>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM