AArch64 PHP/JIT: Cross Compilation and running in QEMU
This instruction assumes, the php source files of master branch are installed in /home/dmitry/php/php-master
. Please correct all the relevant paths according to your real path.
Install cross-compilers
sudo dnf install gcc-aarch64-linux-gnu gcc-c++-aarch64-linux-gnu binutils-aarch64-linux-gnu
Install QEMU
1. Install necessary packages
sudo dnf install qemu-system-aarch64 sudo dnf install cloud-utils
2. Create directory for VM image file
mkdir -p /home/dmitry/php/php-master/ARM64 cd /home/dmitry/php/php-master/ARM64
3. Download system image files
wget https://cloud-images.ubuntu.com/releases/16.04/release/ubuntu-16.04-server-cloudimg-arm64-uefi1.img wget https://releases.linaro.org/components/kernel/uefi-linaro/16.02/release/qemu64/QEMU_EFI.fd
4. Create file cloud.txt with the following context. Add your real name (I recommend to use the same name as on host system) and your ssh public key.
#cloud-config users: - name: <your_name> ssh-authorized-keys: - <your_ssh_public_key> sudo: ['ALL=(ALL) NOPASSWD:ALL'] groups: sudo shell: /bin/bash
5. Create user image file
cloud-localds --disk-format qcow2 cloud.img cloud.txt
6. Start QEMU
qemu-system-aarch64 \ -smp 2 \ -m 2048 \ -M virt \ -cpu cortex-a57 \ -bios QEMU_EFI.fd \ -nographic \ -device virtio-blk-device,drive=hd0 \ -drive if=none,file=ubuntu-16.04-server-cloudimg-arm64-uefi1.img,id=hd0 \ -device virtio-blk-device,drive=cloud \ -drive if=none,id=cloud,file=cloud.img \ -virtfs local,path=/home/dmitry/php/php-master,mount_tag=php-master,security_model=passthrough,id=php-master \ -device e1000,netdev=net0 -netdev user,id=net0,hostfwd=tcp:127.0.0.1:2222-:22
this will take a wile...
7. Connect to running VM through SSH
ssh -p 2222 dmitry@127.0.0.1
The following instructions are executed on guest VM...
8. Install necessary packages (the list may be incomplete)
sudo apt-get update sudo apt-get install git autoconf automake bison build-essential curl flex \ libtool libssl-dev libcurl4-openssl-dev libxml2-dev libreadline-dev \ libsqlite3-dev nginx openssl pkg-config re2c sqlite3 zlib1g-dev \ gdb linux-tools-common
9. Mount PHP source directory
Add the following line to /etc/fstab
php-master /home/dmitry/php/php-master 9p noauto,trans=virtio,version=9p2000.L 0 0
mkdir -p /home/dmitry/php/php-master sudo mount /home/dmitry/php/php-master
10. Copy include/lib files to host
cd /home/dmitry/php/php-master/ARM64 mkdir -p lib/aarch64-linux-gnu mkdir -p usr/include mkdir -p usr/lib cp -a /lib/aarch64-linux-gnu lib cp -a /usr/include usr cp -a /usr/lib usr cd usr/lib ln -s aarch64-linux-gnu/crt1.o crt1.o ln -s aarch64-linux-gnu/crti.o crti.o ln -s aarch64-linux-gnu/crtn.o crtn.o cd aarch64-linux-gnu ln -sf ../../../lib/aarch64-linux-gnu/libdl.so.2 libdl.so
Cross-Compilation (on host system)
mkdir /home/dmitry/php/php-master/ARM64-DEBUG cd /home/dmitry/php/php-master/ARM64-DEBUG CC='aarch64-linux-gnu-gcc --sysroot=/home/dmitry/php/php-master/ARM64 -I/home/dmitry/php/php-master/ARM64/usr/include/aarch64-linux-gnu -L/home/dmitry/php/php-master/ARM64/usr/lib/aarch64-linux-gnu -Wl,-rpath-link,/home/dmitry/php/php-master/ARM64/lib/aarch64-linux-gnu' \ '../configure' \ '--host=aarch64-linux-gnu' \ '--target=aarch64-linux-gnu' \ '--prefix=/home/dmitry/php/php-master/ARM64/DEBUG' \ '--with-config-file-path=/home/dmitry/php/php-master/ARM64/DEBUG/etc' \ '--disable-all' \ '--enable-opcache' \ '--enable-debug' \ '--enable-filter' \ '--enable-pdo' \ '--enable-session' \ '--enable-tokenizer' \ '--with-iconv' \ '--with-pdo-mysql=mysqlnd' \ '--with-mysqli=mysqlnd' make make install
Testing (on guest QEMU system)
cd /home/dmitry/php/php-master/ARM64-DEBUG cp ext/opcache/.libs/opcache.so ext/opcache/.libs/opcache.la modules make test TESTS="ext/opcache/tests/jit"