#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <err.h>
#include <sys/types.h>
#include <sys/mman.h>
struct {
const char pad1[256*1024];
const char string[256*1024];
const char pad2[256*1024];
} const blob __attribute__((section(".openbsd.mutable"))) = {
"padding1",
"the_test",
"padding2"
};
int
main(int argc, char **argv)
{
int pgsz = getpagesize();
vaddr_t va, off;
if (argc > 1) {
return (0);
}
va = (vaddr_t)&blob;
off = va & (pgsz - 1);
if (madvise((void *)(va - off), sizeof(blob) + (off > 0 ? pgsz : 0),
MADV_FREE))
err(1, "madvise");
if (execl(argv[0], argv[0], &blob.string, (char *)NULL))
err(1, "execl");
return (1);
}