如何解决如何在64位RaspberryPi中编译32位ARM?
我正在使用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,r0
b 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,#1'
factorial.s:15: Error: operand 1 must be a SIMD vector register -- `mul r0,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,r0
28: eafffffa b 18 <factorial>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。