Index: vm/port/src/crash_handler/linux/native_unwind_os.cpp =================================================================== --- vm/port/src/crash_handler/linux/native_unwind_os.cpp (revision 643967) +++ vm/port/src/crash_handler/linux/native_unwind_os.cpp (working copy) @@ -16,6 +16,7 @@ */ +#include #include #include "port_modules.h" #include "native_unwind.h" @@ -65,6 +66,15 @@ return false; pthread_attr_destroy(&pthread_attr); + + if ((size_t)sp < (size_t)seg->base) + { + size_t page_size = (size_t)sysconf(_SC_PAGE_SIZE); + size_t base = (size_t)sp & ~(page_size - 1); + seg->size += (size_t)seg->base - base; + seg->base = (void*)base; + } + return true; /* for (native_module_t* module = context->modules; module; module = module->next) Index: vm/vmcore/src/util/linux/ia32_em64t/signals_common.cpp =================================================================== --- vm/vmcore/src/util/linux/ia32_em64t/signals_common.cpp (revision 643967) +++ vm/vmcore/src/util/linux/ia32_em64t/signals_common.cpp (working copy) @@ -157,7 +157,7 @@ // maps unmapped part of the stack res = (char*) mmap(stack_addr - stack_size, stack_mapping_size, - PROT_READ | PROT_WRITE, STACK_MMAP_ATTRS, -1, 0); + PROT_READ | PROT_WRITE | PROT_EXEC, STACK_MMAP_ATTRS, -1, 0); // stack should be mapped, checks result assert(res == (stack_addr - stack_size));