diff --git a/crates/cli/util/src/sigsegv_handler.rs b/crates/cli/util/src/sigsegv_handler.rs index 78e37cf157..c7087233ae 100644 --- a/crates/cli/util/src/sigsegv_handler.rs +++ b/crates/cli/util/src/sigsegv_handler.rs @@ -121,7 +121,16 @@ pub fn install() { unsafe { let alt_stack_size: usize = min_sigstack_size() + 64 * 1024; let mut alt_stack: libc::stack_t = mem::zeroed(); - alt_stack.ss_sp = alloc(Layout::from_size_align(alt_stack_size, 1).unwrap()).cast(); + // Both SysV AMD64 ABI and aarch64 ABI require 16 bytes alignment. We are going to be + // generous here and just use a size of a page. + let raw_page_sz = libc::sysconf(libc::_SC_PAGESIZE); + let page_sz = if raw_page_sz == -1 { + // Fallback alignment in case sysconf fails. + 4096_usize + } else { + raw_page_sz as usize + }; + alt_stack.ss_sp = alloc(Layout::from_size_align(alt_stack_size, page_sz).unwrap()).cast(); alt_stack.ss_size = alt_stack_size; libc::sigaltstack(&raw const alt_stack, ptr::null_mut());