如何在 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-based,您可以通过执行以下命令列出可用的软件包:

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>