Ubuntu 16.04: BusyBoxをビルドする

Ubuntu 16.04でBusyBox 1.25.0をUbuntu 16.04とAndroid向けにビルドします。Anroid向けにビルドしたBusyBoxはAndroid 5.1.1で動作させています。

Ubuntu 16.04: BusyBoxをビルドする

1 BusyBoxのダウンロード

BusyBox 1.25.0をダウンロードします。

$ wget http://busybox.net/downloads/busybox-1.25.0.tar.bz2
$ tar jxf busybox-1.25.0.tar.bz2
$ cd busybox-1.25.0

2 Ubuntu 16.04向けにビルド

freebsd_defconfigを用いてUbuntu 16.04向けにbusyboxをビルドします。

$ make freebsd_defconfig
$ make
$ make install

_installディレクトリにbusyboxのバイナリと各コマンドのシンボリックリンクが作成されます。

$ ls _install
bin   sbin  usr
$ ls _install/bin/
ash      dd             grep      mkdir          rev           sync
busybox  dnsdomainname  gunzip    mktemp         rm            tar
cat      echo           gzip      more           rmdir         touch
catv     ed             hostname  mpstat         rpm           true
chattr   egrep          iostat    mv             run-parts     uname
chgrp    false          ipcalc    nice           scriptreplay  uncompress
chmod    fatattr        kill      pipe_progress  sed           usleep
chown    fgrep          ln        printenv       setserial     vi
cp       fsync          ls        ps             sh            watch
cpio     getopt         lzop      pwd            sleep         zcat

_install/binと_install/sbinにパスを通してbusyboxのshとlsを実行します。

$ export PATH=$(pwd)/_install/bin:$(pwd)/_install/sbin:${PATH}
$ sh


BusyBox v1.25.0 (2016-09-22 22:56:34 JST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

$ ls --help
BusyBox v1.25.0 (2016-09-22 22:56:34 JST) multi-call binary.

Usage: ls [-1AaCxdLHRFplinsehrSXvctu] [-w WIDTH] [FILE]...

List directory contents

        -1      One column output
        -a      Include entries which start with .
        -A      Like -a, but exclude . and ..
        -C      List by columns
        -x      List by lines
        -d      List directory entries instead of contents
        -L      Follow symlinks
        -H      Follow symlinks on command line
        -R      Recurse
        -p      Append / to dir entries
        -F      Append indicator (one of */=@|) to entries
        -l      Long listing format
        -i      List inode numbers
        -n      List numeric UIDs and GIDs instead of names
        -s      List allocated blocks
        -e      List full date and time
        -h      List sizes in human readable format (1K 243M 2G)
        -r      Sort in reverse order
        -S      Sort by size
        -X      Sort by extension
        -v      Sort by version
        -c      With -l: sort by ctime
        -t      With -l: sort by mtime
        -u      With -l: sort by atime
        -w N    Assume the terminal is N columns wide
        --color[={always,never,auto}]   Control coloring
$

3 Android向けにビルド

Linux向けのAndroid NDKをダウンロードします。

$ wget https://dl.google.com/android/repository/android-ndk-r12b-linux-x86_64.zip
$ unzip android-ndk-r12b-linux-x86_64.zip

クロスツールチェインのプレフィックスとルートファイルシステムのパスを変数CROSS_COMPILEとSYSROOTに格納します(変数ARMLINUXは一時的な変数で意味は無いです)。

$ ARMLINUX=$(pwd)/android-ndk-r12b/toolchains/arm-linux-androideabi-4.9
$ CROSS_COMPILE=${ARMLINUX}/prebuilt/linux-x86_64/bin/arm-linux-androideabi-
$ SYSROOT=$(pwd)/android-ndk-r12b/platforms/android-24/arch-arm/

android_ndk_defconfigを使います。作成された.configに対して以下の変更を加えます。

  • クロスツールチェインのプレフィクスを変更します。
  • ルートファイルシステムのパスを変更します。
  • Android 5.1の為にPIEを有効にします。
  • ビルドエラーとなるコマンドを除外します。
$ cd busybox-1.25.0
$ make android_ndk_defconfig
$ sed -i \
-e "s:CONFIG_CROSS_COMPILER_PREFIX=\"[^\"]*\":CONFIG_CROSS_COMPILER_PREFIX=\"${CROSS_COMPILE}\":g" \
-e "s:CONFIG_SYSROOT=\"[^\"]*\":CONFIG_SYSROOT=\"${SYSROOT}\":g" \
-e 's/CONFIG_FLASH_LOCK=y/CONFIG_FLASH_LOCK=n/g' \
-e 's/CONFIG_FLASH_UNLOCK=y/CONFIG_FLASH_UNLOCK=n/g' \
-e 's/CONFIG_FLASHCP=y/CONFIG_FLASHCP=n/g' \
-e 's/CONFIG_NANDDUMP=y/CONFIG_NANDDUMP=n/g' \
-e 's/CONFIG_UBIRENAME=y/CONFIG_UBIRENAME=n/g' \
-e 's/CONFIG_ROUTE=y/CONFIG_ROUTE=n/g' \
-e 's/CONFIG_TIME=y/CONFIG_TIME=n/g' \
-e 's/.*CONFIG_PIE.*/CONFIG_PIE=y/g' .config
$ make
$ make install

_installをAndroid 5.1.1へpushしてAndroid 5.1.1上で実行します。

$ adb push _install /data/local/tmp/busybox
$ adb shell
$ cd /data/local/tmp/busybox/bin
$ ./busybox
WARNING: linker: ./busybox: unused DT entry: type 0x6ffffffe arg 0x2ce8
WARNING: linker: ./busybox: unused DT entry: type 0x6fffffff arg 0x2
BusyBox v1.25.0 (2016-09-23 00:44:45 JST) multi-call binary.
BusyBox is copyrighted by many authors between 1998-2015.
Licensed under GPLv2. See source distribution for detailed
copyright notices.

Usage: busybox [function [arguments]...]
   or: busybox --list[-full]
   or: busybox --install [-s] [DIR]
   or: function [arguments]...

        BusyBox is a multi-call binary that combines many common Unix
        utilities into a single executable.  Most people will create a
        link to busybox for each function they wish to use and BusyBox
        will act like whatever it was invoked as.

Currently defined functions:
        [, [[, ar, arp, awk, base64, basename, bbconfig, beep, blkdiscard,
        blkid, blockdev, bootchartd, bunzip2, bzcat, bzip2, cal, cat, catv,
        chat, chattr, chgrp, chmod, chown, chpst, chroot, chrt, chvt, cksum,
        clear, cmp, comm, cp, cpio, crond, crontab, cttyhack, cut, dc, dd,
        deallocvt, depmod, devmem, diff, dirname, dmesg, dnsd, dos2unix, dpkg,
        dpkg-deb, du, dumpkmap, echo, ed, egrep, env, envdir, envuidgid,
        expand, expr, fakeidentd, false, fatattr, fbset, fbsplash, fdflush,
        fdformat, fdisk, fgconsole, fgrep, find, findfs, flock, fold, free,
        freeramdisk, fstrim, fsync, ftpd, ftpget, ftpput, fuser, getopt, grep,
        gunzip, gzip, halt, hd, hdparm, head, hexdump, httpd, hwclock,
        i2cdetect, i2cdump, i2cget, i2cset, ifconfig, ifdown, ifup, init,
        inotifyd, insmod, install, iostat, ip, ipaddr, ipcalc, iplink, iproute,
        iprule, iptunnel, klogd, less, linuxrc, ln, loadkmap, losetup, lpd,
        lpq, lpr, ls, lsattr, lsmod, lsof, lspci, lsusb, lzcat, lzma, lzop,
        lzopcat, makedevs, makemime, man, md5sum, mesg, mkdir, mkfifo, mknod,
        mkpasswd, mkswap, mktemp, modinfo, modprobe, more, mpstat, mv,
        nbd-client, nc, netstat, nice, nmeter, nohup, nsenter, od, openvt,
        patch, pidof, ping, pipe_progress, pmap, popmaildir, poweroff,
        powertop, printenv, printf, ps, pscan, pstree, pwd, pwdx, raidautorun,
        rdev, readlink, readprofile, realpath, reboot, reformime, renice,
        reset, resize, rev, rm, rmdir, rmmod, rpm, rpm2cpio, rtcwake,
        run-parts, runsv, runsvdir, rx, script, scriptreplay, sed, sendmail,
        seq, setconsole, setkeycodes, setlogcons, setserial, setsid, setuidgid,
        sha1sum, sha256sum, sha3sum, sha512sum, showkey, shuf, sleep, smemcap,
        softlimit, sort, split, start-stop-daemon, strings, stty, sum, sv,
        svlogd, switch_root, sync, sysctl, tac, tail, tar, tcpsvd, tee, telnet,
        telnetd, test, tftp, tftpd, timeout, top, touch, tr, traceroute, true,
        truncate, ttysize, tunctl, tune2fs, udhcpc, udpsvd, uevent, uname,
        uncompress, unexpand, uniq, unix2dos, unlink, unlzma, unlzop, unshare,
        unxz, unzip, uptime, usleep, uudecode, uuencode, vconfig, vi, volname,
        watch, wc, wget, which, whoami, whois, xargs, xz, xzcat, yes, zcat

shell@tilapia:/data/local/tmp/busybox/bin $

3.1 WARNING: linker: <prog> unused DT entry: <entry> arg <value>

Android 5.1上でNDKアプリケーションを動作させると以下の警告が出ます。BusyBox以外のプログラムでも警告が出るようなので、Anroid 5.1の問題のようです。

$ ./busybox
WARNING: linker: ./busybox: unused DT entry: type 0x6ffffffe arg 0x2d10
WARNING: linker: ./busybox: unused DT entry: type 0x6fffffff arg 0x2