swapcontext and stack size
PICCA Frederic-Emmanuel
frederic-emmanuel.picca@synchrotron-soleil.fr
Sat Nov 16 10:09:00 GMT 2019
Hello, I have a bug when I compile and run this program extracted from the ccan[1],
the important point is the size of the stack
{ "HAVE_POINTER_SAFE_MAKECONTEXT", "passing pointers via makecontext()",
"DEFINES_EVERYTHING|EXECUTE|MAY_NOT_COMPILE",
"HAVE_UCONTEXT", NULL,
"#include <stddef.h>\n"
"#include <ucontext.h>\n"
"static int worked = 0;\n"
"static char stack[2048];\n"
"static ucontext_t a, b;\n"
"static void fn(void *p, void *q) {\n"
" void *cp = &worked;\n"
" void *cq = (void *)(~((ptrdiff_t)cp));\n"
" if ((p == cp) && (q == cq))\n"
" worked = 1;\n"
" swapcontext(&a, &b);\n"
"}\n"
"int main(void) {\n"
" void *ap = &worked;\n"
" void *aq = (void *)(~((ptrdiff_t)ap));\n"
" getcontext(&a);\n"
" a.uc_stack.ss_sp = stack;\n"
" a.uc_stack.ss_size = sizeof(stack);\n"
" makecontext(&a, (void (*)(void))fn, 2, ap, aq);\n"
" swapcontext(&b, &a);\n"
" return worked ? 0 : 1;\n"
"}\n"
},
This code work on x86 32bits arch, but it segfault on x86_64 arch with gcc9
BUt it works on gcc8 on both arch.
So my question is what has changed between gcc8 and gcc9 around the stack size.
PS: Is I replace 2048 by 8192, it works in all cases.
Cheers
Frederic
[1] https://github.com/rustyrussell/ccan/blob/master/tools/configurator/configurator.c
More information about the Gcc-help
mailing list