====== 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:
ssh-authorized-keys:
-
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"