all: segv_handler.so testprog
segv_handler.so: segv_handler.o
- ld -shared -o $@ $^ $(LIBS)
+ gcc $(CFLAGS) -shared -o $@ $^ $(LIBS)
+
+segv_handler64.so: segv_handler.c
+ gcc $(CFLAGS) -m64 -shared -o $@ $^ $(LIBS)
+
+segv_handler32.so: segv_handler.c
+ gcc $(CFLAGS) -m32 -shared -o $@ $^ $(LIBS)
testprog: testprog.c
- $(CC) -g -o testprog{,.c}
+ $(CC) -g -o testprog testprog.c
test: all
-LD_PRELOAD=./segv_handler.so ./testprog
+#define _GNU_SOURCE
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
return 0;
}
-void _init(void)
+static void segv_init() __attribute__((constructor));
+void segv_init(void)
{
- signal(SIGSEGV, segv_handler);
- signal(SIGBUS, segv_handler);
+ signal(SIGSEGV, (sighandler_t) segv_handler);
+ signal(SIGBUS, (sighandler_t) segv_handler);
}