compiler-rt's init_have_lse_atomics calls getauxval(AT_HWCAP) at library load time. The static getauxval from the CRT reads from __libc_auxv which is NULL in shared libraries → SIGSEGV at 0x0. Fix: compile getauxval_fix.c that provides a getauxval() which uses dlsym(RTLD_DEFAULT) to find the real bionic getauxval at runtime. Also switch to libc++_shared.so (bundled in APK) to avoid pulling in static libc stubs. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
22 lines
702 B
C
22 lines
702 B
C
// Override the broken static getauxval from compiler-rt/CRT.
|
|
// The static version reads from __libc_auxv which may be NULL in shared libs.
|
|
// This version calls the real bionic getauxval via dlsym.
|
|
#ifdef __ANDROID__
|
|
#include <dlfcn.h>
|
|
#include <stdint.h>
|
|
|
|
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*)-1 /* RTLD_DEFAULT */, "getauxval");
|
|
if (!real_getauxval) {
|
|
// Fallback: return 0 (no features detected)
|
|
return 0;
|
|
}
|
|
}
|
|
return real_getauxval(type);
|
|
}
|
|
#endif
|