如何在 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>
我正在用 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>