Hello, tried have a look at this crash. The hkl-5.0.0.2449/Documentation/figures/.libs/sirius executable makes use of makecontext/swapcontext to execute function trajectory_gen_generator__.
But it looks like the argument given to makecontext got truncated to 32 bits. So I looked for HAVE_POINTER_SAFE_MAKECONTEXT that is currently defined as 0. hkl-5.0.0.2449/hkl/ccan/ccan_config.h That file looks like generated by configurator executable. hkl-5.0.0.2449/hkl/ccan/configurator.c ./configurator gcc > ccan_config.h.tmp && mv ccan_config.h.tmp ccan_config.h Extracted the test for HAVE_POINTER_SAFE_MAKECONTEXT into test.c. But unfortunately that one is also crashing and therefore configurator defines to 0. [Sa Aug 4 02:11:49 2018] configurator.ou[17970]: segfault at 55c8595ccff8 ip 00007f8b36e50fc0 sp 000055c8595cd000 error 7 in ld-2.27.so[7f8b36e42000+1e000] [Sa Aug 4 02:12:27 2018] sirius[20492]: segfault at 38093728 ip 00005649371a701f sp 0000564938092f40 error 4 in sirius[56493717c000+2c000] $ gcc -g -O0 test.c -o test $ gdb -q --args ./test Reading symbols from ./test...done. (gdb) run Starting program: /home/benutzer/hkl/try1/test Program received signal SIGSEGV, Segmentation fault. 0x00007ffff7fe4fc0 in _dl_name_match_p (name=0x555555554421 "libc.so.6", map=map@entry=0x7ffff7ffe170) at dl-misc.c:283 283 dl-misc.c: Datei oder Verzeichnis nicht gefunden. (gdb) bt #0 0x00007ffff7fe4fc0 in _dl_name_match_p (name=0x555555554421 "libc.so.6", map=map@entry=0x7ffff7ffe170) at dl-misc.c:283 #1 0x00007ffff7fde64e in do_lookup_x (undef_name=undef_name@entry=0x555555554442 "setcontext", new_hash=new_hash@entry=3641973206, old_hash=old_hash@entry=0x555555558140 <stack+160>, ref=0x555555554390, result=result@entry=0x555555558150 <stack+176>, scope=<optimized out>, i=<optimized out>, version=0x7ffff7fbe560, flags=1, skip=<optimized out>, type_class=1, undef_map=0x7ffff7ffe170) at dl-lookup.c:541 #2 0x00007ffff7fdf217 in _dl_lookup_symbol_x (undef_name=0x555555554442 "setcontext", undef_map=0x7ffff7ffe170, ref=ref@entry=0x5555555581e8 <stack+328>, symbol_scope=0x7ffff7ffe4c8, version=0x7ffff7fbe560, type_class=type_class@entry=1, flags=1, skip_map=<optimized out>) at dl-lookup.c:813 #3 0x00007ffff7fe38c3 in _dl_fixup (l=<optimized out>, reloc_arg=<optimized out>) at ../elf/dl-runtime.c:112 #4 0x00007ffff7fea3c3 in _dl_runtime_resolve_fxsave () at ../sysdeps/x86_64/dl-trampoline.h:125 #5 0x00005555555551b5 in fn (p=0x555555558080 <worked>, q=0xffffaaaaaaaa7f7f) at test.c:11 #6 0x00007ffff7e4c600 in ?? () from /lib/x86_64-linux-gnu/libc.so.6 #7 0x0000000000000000 in ?? () (gdb) list test.c:1,+23 1 #include <stddef.h> 2 #include <ucontext.h> 3 static int worked = 0; 4 static char stack[1024]; 5 static ucontext_t a, b; 6 static void fn(void *p, void *q) { 7 void *cp = &worked; 8 void *cq = (void *)(~((ptrdiff_t)cp)); 9 if ((p == cp) && (q == cq)) 10 worked = 1; 11 setcontext(&b); 12 } 13 int main(void) { 14 void *ap = &worked; 15 void *aq = (void *)(~((ptrdiff_t)ap)); 16 getcontext(&a); 17 a.uc_stack.ss_sp = stack; 18 a.uc_stack.ss_size = sizeof(stack); 19 makecontext(&a, (void (*)(void))fn, 2, ap, aq); 20 swapcontext(&b, &a); 21 return worked ? 0 : 1; 22 } 23 This test is crashing also at a stretch amd64 VM, but is working in a jessie amd64 VM. By using swapcontext instead of setcontext (like in attached patch) the test succeeds, HAVE_POINTER_SAFE_MAKECONTEXT get defined to 1, and the package could be built successfully, at least in my buster amd64 VM. Kind regards, Bernhard export LD_LIBRARY_PATH=/home/benutzer/hkl/try1/hkl-5.0.0.2449/hkl/.libs benutzer@debian:~/hkl/try1/hkl-5.0.0.2449/Documentation/figures$ gdb --q --args .libs/sirius directory /home/benutzer/hkl/try1/hkl-5.0.0.2449/hkl directory /home/benutzer/hkl/try1/hkl-5.0.0.2449/hkl/api2 directory /home/benutzer/hkl/try1/hkl-5.0.0.2449/hkl/ccan/coroutine directory /home/benutzer/hkl/try1/hkl-5.0.0.2449/hkl/ccan/generator set height 0 set width 0 set pagination off b main run b coroutine.c:226 record cont (gdb) bt #0 0x0000555555592c97 in coroutine_init_ (cs=cs@entry=0x5555555c5fd0, fn=fn@entry=0x555555594000 <trajectory_gen_generator__>, arg=arg@entry=0x5555555c6730, stack=stack@entry=0x5555555c5fb8) at coroutine/coroutine.c:210 #1 0x0000555555592d93 in generator_new_ (fn=0x555555594000 <trajectory_gen_generator__>, retsize=<optimized out>) at generator/generator.c:41 #2 0x0000555555594585 in trajectory_gen (tconfig=...) at hkl2.c:246 #3 0x0000555555594639 in Trajectory_solve (tconfig=..., gconfig=..., sconfig=..., move=1) at hkl2.c:288 #4 0x00005555555697cc in main () at sirius.c:161 (gdb) list coroutine.c:193,+20 193 #if HAVE_UCONTEXT 194 void coroutine_init_(struct coroutine_state *cs, 195 void (*fn)(void *), void *arg, 196 struct coroutine_stack *stack) 197 { 198 getcontext (&cs->uc); 199 200 coroutine_uc_stack(&cs->uc.uc_stack, stack); 201 202 if (HAVE_POINTER_SAFE_MAKECONTEXT) { 203 makecontext(&cs->uc, (void *)fn, 1, arg); 204 } else { 205 ptrdiff_t si = ptr2int(arg); 206 ptrdiff_t mask = (1UL << (sizeof(int) * 8)) - 1; 207 int lo = si & mask; 208 int hi = si >> (sizeof(int) * 8); 209 210 makecontext(&cs->uc, (void *)fn, 2, lo, hi); 211 } 212 213 } (gdb) print fn $1 = (void (*)(void *)) 0x555555594000 <trajectory_gen_generator__> (gdb) print/x arg $3 = 0x5555555c6730 (gdb) print/x hi $4 = 0x5555 (gdb) print/x lo $5 = 0x555c6730 (gdb) bt #0 0x0000555555592cf0 in coroutine_switch (from=from@entry=0x5555555c6378, to=to@entry=0x5555555c5fd0) at coroutine/coroutine.c:226 #1 0x000055555559478e in generator_next_ (ret_=0x5555555c6730) at ../../hkl/ccan/generator/generator.h:191 #2 0x000055555559478e in Trajectory_solve (tconfig=..., gconfig=..., sconfig=..., move=1) at hkl2.c:298 #3 0x00005555555697cc in main () at sirius.c:161 (gdb) list coroutine.c:220,+8 220 221 void coroutine_switch(struct coroutine_state *from, 222 const struct coroutine_state *to) 223 { 224 int rc; 225 226 rc = swapcontext(&from->uc, &to->uc); 227 assert(rc == 0); 228 } Program received signal SIGSEGV, Segmentation fault. trajectory_gen_generator__ (ret=0x555c6730) at hkl2.c:246 246 generator_def(trajectory_gen, struct Engine, struct Trajectory, tconfig) (gdb) bt full #0 0x000055555559401f in generator_argp_ (ret=0x555c6730) at ../../hkl/ccan/generator/generator.h:44 gen = 0x555c5fd0 args = <optimized out> #1 0x000055555559401f in trajectory_gen_generator__ (ret=0x555c6730) at hkl2.c:246 gen = 0x555c5fd0 args = <optimized out> #2 0x00007ffff7268600 in __start_context () at /lib/x86_64-linux-gnu/libc.so.6 #3 0x0000000000000000 in () (gdb) list hkl2.c:246 246 generator_def(trajectory_gen, struct Engine, struct Trajectory, tconfig) 247 { (gdb) list generator.h:145 145 #define generator_def(name_, rtype_, ...) \ 146 generator_def_(name_, rtype_, , __VA_ARGS__) (gdb) list generator.h:119 119 #define generator_def_(name_, rtype_, storage_, ...) \ ... 122 static void name_##_generator__(void *ret) \ 123 { \ 124 struct generator_ *gen; \ 125 UNNEEDED generator_argstruct_(__VA_ARGS__) *args; \ 126 gen = generator_state_(ret); \ 127 args = generator_argp_(ret); \ 128 name_##_generator_(ret generator_args_unpack_(__VA_ARGS__)); \ 129 gen->complete = true; \ 130 coroutine_jump(&gen->caller); \ 131 assert(0); \ 132 } \ ...
Description: make-test-for-pointer-safe-makecontext-succeed Bug-Debian: https://bugs.debian.org/889878 Forwarded: no Last-Update: 2018-08-03 --- hkl-5.0.0.2449.orig/hkl/ccan/configurator.c +++ hkl-5.0.0.2449/hkl/ccan/configurator.c @@ -382,7 +382,7 @@ static struct test tests[] = { " void *cq = (void *)(~((ptrdiff_t)cp));\n" " if ((p == cp) && (q == cq))\n" " worked = 1;\n" - " setcontext(&b);\n" + " swapcontext(&a, &b);\n" "}\n" "int main(void) {\n" " void *ap = &worked;\n"