在一台没有安装Android源码编译环境的64位 Ubuntu14.04.5虚拟机上尝试单独编译Android用的Linux Kernel。并从编译好Android源码的机器上将out文件夹下的mkbootfs、minigzip、mkbootimg二进制程序copy了过来,用于生成boot.img
用copy过来的arm-eabi-4.6编译Kernel正常,但是编译后生成ramdisk.img的那一步,脚本执行总提示
tools/mkbootfs: No such file or directory
tools/minigzip: No such file or directory
确认了mkbootfs和minigzip文件的权限等没发现问题,只能想到是某些安装包没有安导致与原有的开发环境不一样。
试验后用下面命令安装g++-multilib和gcc-multilib后就正常了。
sudo apt-get install g++-multilib gcc-multilib
果然是由于mkbootfs是用32位的gcc/g++编译生成的,所以在64位系统上执行就需要安装g++-multilib或者gcc-multilib,两个只安装其中一个可能也可行,不过以后可能还有其他需要,就索性都安上吧。
又用readelf确认了一下mkbootfs文件的ELF Header证实了想法。
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Intel 80386
Version: 0x1
Entry point address: 0x8048c28
Start of program headers: 52 (bytes into file)
Start of section headers: 23604 (bytes into file)
Flags: 0x0
Size of this header: 52 (bytes)
Size of program headers: 32 (bytes)
Number of program headers: 8
Size of section headers: 40 (bytes)
Number of section headers: 39
Section header string table index: 36