Index: sys/amd64/linux/linux_sysvec.c =================================================================== --- sys/amd64/linux/linux_sysvec.c +++ sys/amd64/linux/linux_sysvec.c @@ -109,6 +109,10 @@ u_long stack); static int linux_vsyscall(struct thread *td); +static int linux_align_stack = 1; +SYSCTL_INT(_compat_linux, OID_AUTO, align_stack, CTLFLAG_RWTUN, + &linux_align_stack, 0, "Set to 0 to disable stack alignment fixup"); + #define LINUX_T_UNKNOWN 255 static int _bsd_to_linux_trapcode[] = { LINUX_T_UNKNOWN, /* 0 */ @@ -342,6 +346,13 @@ * terminating NULL pointers. */ vectp -= imgp->args->argc + 1 + imgp->args->envc + 1; + + /* + * XXX: For reasons unknown newer Linux binaries end up segfaulting + * on startup, should the vectp end up aligned to 16. + */ + if ((unsigned long)vectp % 16 == 0 && linux_align_stack) + vectp = (void *)((unsigned long)vectp - 8); /* vectp also becomes our initial stack base. */ stack_base = (register_t *)vectp;