====== 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"