Ошибка сегментации setcontext() при нормальной работе, но хорошо работает под GDB
Я пытаюсь создать проект операционной системы, который получает контекст текущего потока и сериализуется, отправляет его по сети на другой компьютер и выбирает, где поток остановился, и продолжает работу. (Так называемый thread-migrator).
Мне удалось закончить это в Linux, но когда я работаю в реальной среде, я всегда получаю ошибку сегментации, но она работала под GDB.
Это может быть связано с проблемой рандомизации адресов, потому что когда я включаю рандомизацию в GDB, это показывает, что в setcontext() есть ошибка сегментации.
Но я просто не понимаю, потому что текстовый раздел не будет рандомизирован (и я проверил значение REG_RIP в ucontext.mcontext.greps, они всегда одинаковы). Тогда в чем может быть причина того, что случайная адресация дает сбой? Стек будет устанавливаться непосредственно с помощью ucontext, что, я не думаю, что рандомизация будет проблемой.
Мой код сервера выглядит следующим образом.
bool_t migrate_1_svc(rpc_ucontext *context, void *res, struct svc_req *req)
{
printf("Server received.\n");
ucontext_t cont;
// initialize the context
getcontext(&cont);
cont.uc_flags = context->uc_flags;
// ucontext.stack_t
cont.uc_stack.ss_flags = context->uc_stack.ss_flags;
cont.uc_stack.ss_sp = context->uc_stack.ss_sp.ss_sp_val;
cont.uc_stack.ss_size = context->uc_stack.ss_sp.ss_sp_len;
// ucontext.mcontext_t
memcpy(cont.uc_mcontext.__reserved1, context->uc_mcontext.__reserved1, sizeof(cont.uc_mcontext.__reserved1));
cont.uc_mcontext.fpregs = (struct _libc_fpstate *)malloc(sizeof(struct _libc_fpstate));
memcpy(cont.uc_mcontext.fpregs, &context->uc_mcontext.fpregs, sizeof(struct _libc_fpstate));
memcpy(cont.uc_mcontext.gregs, context->uc_mcontext.gregs, sizeof(gregset_t));
memcpy(&cont.uc_sigmask, &context->uc_sigmask, sizeof(__sigset_t));
memcpy(&cont.__fpregs_mem, &context->__fpregs_mem, sizeof(struct _libc_fpstate));
printf("Setting the context.\n");
ucontext_t my_context;
getcontext(&my_context);
cont.uc_link = &my_context;
setcontext(&cont);
return true;
}