Xtensa PERFORM_BOOTSTRAP_GOT macro uses mprotect to make bits of GOT writable, but noMMU linux kernel returns ENOSYS to mprotect syscalls, and syscall wrapper tries to update errno with the error code. This happens well before the relocations are done and results in writes to unrelated locations, memory corruption or protection violations.
Only define PERFORM_BOOTSTRAP_GOT when building xtensa configuration with MMU support.
Signed-off-by: Max Filippov jcmvbkbc@gmail.com --- Changes v1->v2: - now that PERFORM_BOOTSTRAP_GOT only does mprotect calls make its whole definition conditional instead of extracting that part.
ldso/ldso/xtensa/dl-startup.h | 2 ++ 1 file changed, 2 insertions(+)
diff --git a/ldso/ldso/xtensa/dl-startup.h b/ldso/ldso/xtensa/dl-startup.h index 92877aa016fb..439bdbd7a5e2 100644 --- a/ldso/ldso/xtensa/dl-startup.h +++ b/ldso/ldso/xtensa/dl-startup.h @@ -88,6 +88,7 @@ __asm__ ( /* Function calls are not safe until the GOT relocations have been done. */ #define NO_FUNCS_BEFORE_BOOTSTRAP
+#if defined(__ARCH_USE_MMU__) #define PERFORM_BOOTSTRAP_GOT(tpnt) \ do { \ xtensa_got_location *got_loc; \ @@ -124,3 +125,4 @@ do { \ PROT_READ | PROT_WRITE | PROT_EXEC); \ } \ } while (0) +#endif