Glynn Clements <glynn(a)sensei.co.uk> writes:
> Hrvoje Niksic wrote:
>
> > > > (In fact, on *real* Unixes, we could simply use sigaction() to trap
> > > > SIGSEGV and have the handler check whether the SEGV was caused by
> > > > modifying a pure cons, and signal an error in that case. Of course,
> > > > this would not work on Linux.)
> > >
> > > Why?
> >
> > Because I am unable to make this trivial program (or a variation
> > thereof) to compile and run on Linux:
>
> [snip]
>
> Try the following instead.
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <signal.h>
> #include <sigcontext.h>
>
> void
> segv_handler(int sig, struct sigcontext ctx)
> {
> printf ("Fault address: %p\n", ctx.cr2);
> exit (0);
> }
>
> int
> main (void)
> {
> struct sigaction act;
> sigaction (SIGSEGV, NULL, &act);
> act.sa_handler = segv_handler;
> sigemptyset (&act.sa_mask);
> act.sa_flags = 0;
> sigaction (SIGSEGV, &act, NULL);
>
> *(char *)0xdeadbeef = 'x';
> return 0; /* unreached */
> }
>
> Clearly it isn't portable (the sigcontext structure is
> processor-specific), but then I'm not sure that there is any portable
> method. Stevens[1] indicates that SA_SIGINFO and struct siginfo are
> specific to SVR4, and that BSD 4.3+ signal handlers have the
> prototype:
And evidently libc specific. This fails to compile on a libc5 system
(redhat 4.x + various weird crap) :)
-bp