[compiler-rt] [compiler-rt] Fixed Android 8.1 `getauxval(AT_PAGESZ)` crashes if called from `.preinit_array`. (#113427) (PR #116121)

via llvm-commits llvm-commits at lists.llvm.org
Thu Dec 5 20:32:02 PST 2024


================
@@ -1214,6 +1220,16 @@ uptr GetPageSize() {
   CHECK_EQ(rv, 0);
   return (uptr)pz;
 #    elif SANITIZER_USE_GETAUXVAL
+#      if SANITIZER_ANDROID && __ANDROID_API__ < 35
+  // The 16 KB page size was introduced in Android 15 (API level 35), while
----------------
funsafe-ptr wrote:

```fish
❯ echo '#include <sys/sysconf.h>'\n'static void preinit_fn() {sysconf(_SC_PAGESIZE);}; void (*preinit[])()__attribute((section(".preinit_array")))={&preinit_fn};int main(){}' | cc -x c -;./a.out
fish: Job 1, './a.out' terminated by signal SIGSEGV (Address boundary error)
```

```fish
❯ echo '#include <unistd.h>'\n'static int page_size; static void preinit_fn() {page_size = getpagesize();}; void (*preinit[])()__attribute((section(".preinit_array")))={&preinit_fn};int main(){__builtin_printf("%i", page_size);}' | cc -x c -;./a.out
4096⏎    
```
`getpagesize` does work. Sorry, I never tried it before.

so Something like this?
```c++
#      if SANITIZER_ANDROID
  return getpagesize();
#else 
  return getauxval(AT_PAGESZ);
#      endif
```

https://github.com/llvm/llvm-project/pull/116121


More information about the llvm-commits mailing list