diff --git a/android/android/app/src/main/jniLibs/arm64-v8a/libwzp_android.so b/android/android/app/src/main/jniLibs/arm64-v8a/libwzp_android.so index cc3139d..c16e610 100755 Binary files a/android/android/app/src/main/jniLibs/arm64-v8a/libwzp_android.so and b/android/android/app/src/main/jniLibs/arm64-v8a/libwzp_android.so differ diff --git a/crates/wzp-android/build.rs b/crates/wzp-android/build.rs index ecd3084..b07de50 100644 --- a/crates/wzp-android/build.rs +++ b/crates/wzp-android/build.rs @@ -4,6 +4,12 @@ fn main() { let target = std::env::var("TARGET").unwrap_or_default(); if target.contains("android") { + // Override broken static getauxval from compiler-rt that crashes + // in shared libraries. Must be compiled first to take link priority. + cc::Build::new() + .file("cpp/getauxval_fix.c") + .compile("getauxval_fix"); + let oboe_dir = fetch_oboe(); match oboe_dir { Some(oboe_path) => { diff --git a/crates/wzp-android/cpp/getauxval_fix.c b/crates/wzp-android/cpp/getauxval_fix.c new file mode 100644 index 0000000..2f287cb --- /dev/null +++ b/crates/wzp-android/cpp/getauxval_fix.c @@ -0,0 +1,21 @@ +// Override the broken static getauxval from compiler-rt/CRT. +// The static version reads from __libc_auxv which is NULL in shared libs +// loaded via dlopen, causing SIGSEGV in init_have_lse_atomics at load time. +// This version calls the real bionic getauxval via dlsym. +#ifdef __ANDROID__ +#include +#include + +typedef unsigned long (*getauxval_fn)(unsigned long); + +unsigned long getauxval(unsigned long type) { + static getauxval_fn real_getauxval = (getauxval_fn)0; + if (!real_getauxval) { + real_getauxval = (getauxval_fn)dlsym((void*)-1L /* RTLD_DEFAULT */, "getauxval"); + if (!real_getauxval) { + return 0; + } + } + return real_getauxval(type); +} +#endif diff --git a/wzp-release.apk b/wzp-release.apk index 8300f33..e638b28 100644 Binary files a/wzp-release.apk and b/wzp-release.apk differ