[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