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