From 023716b5fdfed1d281092316c88c893f4b651fed Mon Sep 17 00:00:00 2001 From: Alex Huszagh Date: Wed, 25 May 2022 11:12:24 -0500 Subject: [PATCH 1/2] Add android runner to run android binaries. Android binaries currently fail to run, because `libc++_shared.so` is not found, so ensure the library is preloaded via `LD_PRELOAD`. This creates a simple `android-runner` file, so any additional changes can be added there. Linked Issues: #82 --- CHANGELOG.md | 1 + docker/Dockerfile.aarch64-linux-android | 4 +++- docker/Dockerfile.arm-linux-androideabi | 4 +++- docker/Dockerfile.i686-linux-android | 4 +++- docker/Dockerfile.x86_64-linux-android | 4 +++- docker/android-runner | 22 ++++++++++++++++++++++ 6 files changed, 35 insertions(+), 4 deletions(-) create mode 100755 docker/android-runner diff --git a/CHANGELOG.md b/CHANGELOG.md index db745520d..2c0e42ede 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ This project adheres to [Semantic Versioning](http://semver.org/). - #722 - boolean environment variables are evaluated as truthy or falsey. - #721 - add support for running doctests on nightly if `CROSS_UNSTABLE_ENABLE_DOCTESTS=true`. +- #719 - add android runner to preload `libc++_shared.so`. - #718 - remove deb subcommand. - #714 - use host target directory when falling back to host cargo. - #713 - convert relative target directories to absolute paths. diff --git a/docker/Dockerfile.aarch64-linux-android b/docker/Dockerfile.aarch64-linux-android index 5053db28a..ea85d5d51 100644 --- a/docker/Dockerfile.aarch64-linux-android +++ b/docker/Dockerfile.aarch64-linux-android @@ -22,10 +22,12 @@ RUN /qemu.sh aarch64 RUN cp /android-ndk/sysroot/usr/lib/aarch64-linux-android/28/libz.so /system/lib/ +COPY android-runner / + # Libz is distributed in the android ndk, but for some unknown reason it is not # found in the build process of some crates, so we explicit set the DEP_Z_ROOT ENV CARGO_TARGET_AARCH64_LINUX_ANDROID_LINKER=aarch64-linux-android-gcc \ - CARGO_TARGET_AARCH64_LINUX_ANDROID_RUNNER=qemu-aarch64 \ + CARGO_TARGET_AARCH64_LINUX_ANDROID_RUNNER="/android-runner aarch64" \ CC_aarch64_linux_android=aarch64-linux-android-gcc \ CXX_aarch64_linux_android=aarch64-linux-android-g++ \ BINDGEN_EXTRA_CLANG_ARGS_aarch64_linux_android="--sysroot=/android-ndk/sysroot" \ diff --git a/docker/Dockerfile.arm-linux-androideabi b/docker/Dockerfile.arm-linux-androideabi index 676d7d1d5..3faae941d 100644 --- a/docker/Dockerfile.arm-linux-androideabi +++ b/docker/Dockerfile.arm-linux-androideabi @@ -22,10 +22,12 @@ RUN /qemu.sh arm RUN cp /android-ndk/sysroot/usr/lib/arm-linux-androideabi/28/libz.so /system/lib/ +COPY android-runner / + # Libz is distributed in the android ndk, but for some unknown reason it is not # found in the build process of some crates, so we explicit set the DEP_Z_ROOT ENV CARGO_TARGET_ARM_LINUX_ANDROIDEABI_LINKER=arm-linux-androideabi-gcc \ - CARGO_TARGET_ARM_LINUX_ANDROIDEABI_RUNNER=qemu-arm \ + CARGO_TARGET_ARM_LINUX_ANDROIDEABI_RUNNER="/android-runner arm" \ CC_arm_linux_androideabi=arm-linux-androideabi-gcc \ CXX_arm_linux_androideabi=arm-linux-androideabi-g++ \ BINDGEN_EXTRA_CLANG_ARGS_arm_linux_androideabi="--sysroot=/android-ndk/sysroot" \ diff --git a/docker/Dockerfile.i686-linux-android b/docker/Dockerfile.i686-linux-android index db323d4e6..c134a6a30 100644 --- a/docker/Dockerfile.i686-linux-android +++ b/docker/Dockerfile.i686-linux-android @@ -29,10 +29,12 @@ RUN /qemu.sh i386 RUN cp /android-ndk/sysroot/usr/lib/i686-linux-android/28/libz.so /system/lib/ +COPY android-runner / + # Libz is distributed in the android ndk, but for some unknown reason it is not # found in the build process of some crates, so we explicit set the DEP_Z_ROOT ENV CARGO_TARGET_I686_LINUX_ANDROID_LINKER=i686-linux-android-gcc \ - CARGO_TARGET_I686_LINUX_ANDROID_RUNNER="qemu-i386 -cpu n270" \ + CARGO_TARGET_I686_LINUX_ANDROID_RUNNER="/android-runner i686 -cpu n270" \ CC_i686_linux_android=i686-linux-android-gcc \ CXX_i686_linux_android=i686-linux-android-g++ \ BINDGEN_EXTRA_CLANG_ARGS_i686_linux_android="--sysroot=/android-ndk/sysroot" \ diff --git a/docker/Dockerfile.x86_64-linux-android b/docker/Dockerfile.x86_64-linux-android index 02e195dff..53c5afb73 100644 --- a/docker/Dockerfile.x86_64-linux-android +++ b/docker/Dockerfile.x86_64-linux-android @@ -23,10 +23,12 @@ RUN /qemu.sh x86_64 RUN cp /android-ndk/sysroot/usr/lib/x86_64-linux-android/28/libz.so /system/lib/ +COPY android-runner / + # Libz is distributed in the android ndk, but for some unknown reason it is not # found in the build process of some crates, so we explicit set the DEP_Z_ROOT ENV CARGO_TARGET_X86_64_LINUX_ANDROID_LINKER=x86_64-linux-android-gcc \ - CARGO_TARGET_X86_64_LINUX_ANDROID_RUNNER="qemu-x86_64 -cpu qemu64,+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+popcnt" \ + CARGO_TARGET_X86_64_LINUX_ANDROID_RUNNER="/android-runner x86_64 -cpu qemu64,+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+popcnt" \ CC_x86_64_linux_android=x86_64-linux-android-gcc \ CXX_x86_64_linux_android=x86_64-linux-android-g++ \ BINDGEN_EXTRA_CLANG_ARGS_x86_64_linux_android="--sysroot=/android-ndk/sysroot" \ diff --git a/docker/android-runner b/docker/android-runner new file mode 100755 index 000000000..6a6f50229 --- /dev/null +++ b/docker/android-runner @@ -0,0 +1,22 @@ +#!/usr/bin/env bash + +set -e + +# arch in the rust target +arch="${1}" +shift + +# select android abi, and find the shared libc++ library +android_abi="${arch}-linux-android" +qarch="${arch}" +case "${arch}" in + arm) + android_abi="arm-linux-androideabi" + ;; + i686) + qarch="i386" + ;; +esac +libdir="/android-ndk/sysroot/usr/lib/${android_abi}" + +LD_PRELOAD="${libdir}/libc++_shared.so" exec qemu-"${qarch}" "${@}" From 8788c7df6099d78f857193b9c84ae0107fdd8cc2 Mon Sep 17 00:00:00 2001 From: Alex Huszagh Date: Wed, 25 May 2022 17:33:05 -0500 Subject: [PATCH 2/2] Add runners and C++ support. Add qemu-user runners and C++ support for android, to test that the LD_PRELOAD works. --- .github/workflows/ci.yml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 3cb72ff96..b1b85b870 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -147,11 +147,11 @@ jobs: - { target: i686-unknown-linux-musl, os: ubuntu-latest, std: 1, run: 1 } - { target: mips-unknown-linux-musl, os: ubuntu-latest, cpp: 1, std: 1, run: 1 } - { target: mipsel-unknown-linux-musl, os: ubuntu-latest, cpp: 1, std: 1, run: 1 } - - { target: aarch64-linux-android, os: ubuntu-latest, cpp: 1, std: 1, run: 1 } - - { target: arm-linux-androideabi, os: ubuntu-latest, cpp: 1, std: 1, run: 1 } - - { target: armv7-linux-androideabi, os: ubuntu-latest, cpp: 1, std: 1, run: 1 } - - { target: i686-linux-android, os: ubuntu-latest, cpp: 1, std: 1, run: 1 } - - { target: x86_64-linux-android, os: ubuntu-latest, cpp: 1, std: 1, run: 1 } + - { target: aarch64-linux-android, os: ubuntu-latest, cpp: 1, std: 1, run: 1, cpp: 1, runners: qemu-user } + - { target: arm-linux-androideabi, os: ubuntu-latest, cpp: 1, std: 1, run: 1, cpp: 1, runners: qemu-user } + - { target: armv7-linux-androideabi, os: ubuntu-latest, cpp: 1, std: 1, run: 1, cpp: 1, runners: qemu-user } + - { target: i686-linux-android, os: ubuntu-latest, cpp: 1, std: 1, run: 1, cpp: 1, runners: qemu-user } + - { target: x86_64-linux-android, os: ubuntu-latest, cpp: 1, std: 1, run: 1, cpp: 1, runners: qemu-user } - { target: x86_64-pc-windows-gnu, os: ubuntu-latest, cpp: 1, std: 1, run: 1 } - { target: i686-pc-windows-gnu, os: ubuntu-latest, cpp: 1, std: 1, run: 1 } # Disabled for now, see https://github.com/rust-lang/rust/issues/85821