If you set up a signal handler in pthreads and modify the struct
sigcontext passed in, your changes to that struct are discarded. For
instance, modifying context.eip to point to a new function works as you
would expect in a non-pthreads app, but does not work in pthreads.
Investigation shows that pthreads sets up its own signal handler that then
copies the real struct sigcontext before passing it to the user
sighandler. The user sighandler's struct sigcontext never makes it back
to the kernel.
Should be fixed in glibc-2.2.2-7.