Вот возможное решение для Linux. Вместо того, чтобы играть с разделами, мы заменяем каждый буфер, который может переполниться, большим.
lib.c:
#include <stdio.h>
#include <string.h>
char buf[10];
int y;
int main ()
{
y = 42;
printf ("y = %d\n", y);
memset (buf, 0, 14);
printf ("y = %d\n", y);
return 0;
}
В обычном случае:
$ gcc -o lib.o -c lib.c
$ gcc -o nowrap lib.o
$ ./nowrap
y = 42
y = 0
Теперь мы заменим buf
буфером большего размера.
wrap_buf.c:
char buf[20];
И построить:
$ gcc -o lib.o -c lib.c
$ gcc -o wrap_buf.o -c wrap_buf.c
$ objcopy lib.o --globalize-symbol=buf --weaken-symbol=buf lib2.o
$ gcc -o wrap lib2.o wrap_buf.o
$ ./wrap
y = 42
y = 42