今天打算编译支持orange pi开发板的Raspbain Jessie系统 从github上拿下源码,下载,编译,一直比较顺利
结果在编译一半的时候报错:
/second-stage: line 206: /bin/sleep: cannot execute binary file: Exec format error
根据错误提示信息,找到了该语句如下:
while kill -0 $1 2>/dev/null do i=$(( (i+1) %4 )) printf "\r$2 ${spin:$i:1}" sleep .1 done
简简单单一句sleep,怎么会格式错误呢?单独执行也没问题啊? 继续往上找,查到是在create_image脚本里调用了second-stage,调用语句如下:
# ******************************************************************************** # *** If running on ARM (OrangePI) USE THE LINE WITHOUT "qemu-arm-static" !!! **** # ******************************************************************************** #if ! chroot $odir /bin/bash /second-stage; then if ! chroot $odir /usr/bin/qemu-arm-static -cpu cortex-a9 /bin/bash /second-stage; then mv $odir/install.log . > /dev/null 2>&1 echo "================================================" echo "ERROR on second-stage, instalation NOT FINISHED." echo "================================================" exit 1 fi
原来是执行了chroot后调用的,也就是说实际调用的是
~/orangepi/OrangePiH3/output/linux-jessie/bin/sleep
但是此处指定了是用qemu-arm-static命令调用的,怎么还出错?该命令到底是个什么用法? 于是做了以下测试:
sudo chroot ~/orangepi/OrangePiH3/output/linux-jessie/usr/bin/qemu-arm-static -cpu cortex-a9 /bin/bash
顺利调用! 但是在该arm版的bash下面,却始终无法调用/bin/sleep,仍是同样的提示:
cannot execute binary file: Exec format error
原来qemu-arm-static仅对当前程序有效,并不会改变系统程序执行环境,所以导致仍将arm版的/bin/sleep作为x86程序进行了处理,也就是调用/bin/sleep也需要使用qemu-arm-static命令来调用,难道需要改脚本?那改动的地方就不少了,有没有便捷点的办法?
于是google了下,在该文章:
Emulating ARM on Debian/Ubuntu
中,发现少了关键的一步:
#This can only be run as root (sudo don‘t work) sudo su echo ‘:arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm-static:‘ > /proc/sys/fs/binfmt_misc/register exit
该语句意思是将qemu-arm-static注册为arm可执行文件的默认解释器! 执行了这一步后,就无需指定qemu-arm-static作为解释器,直接调用arm程序即可执行
继续进行编译,成功!
原文地址:https://www.cnblogs.com/mmseh/p/9062239.html
时间: 2024-10-14 05:48:30