/*
 * gcc -shared -fPIC -ldl -o mmap_ksm.so mmap_ksm.c
*/
#define _GNU_SOURCE

#include <dlfcn.h>
#include <sys/mman.h>

typedef void *(*real_mmap_t)(void *, size_t, int, int,
                  int, off_t);

void *mmap(void *addr, size_t length, int prot, int flags,
           int fd, off_t offset)
{
  static real_mmap_t real_mmap;
  void *ret;
  if (!real_mmap)
  {
    real_mmap= (real_mmap_t)dlsym(RTLD_NEXT, "mmap");
  }
  ret= real_mmap(addr, length, prot, flags, fd, offset);
  //if ((flags & MAP_PRIVATE) && (flags & MAP_ANONYMOUS) && !(prot & PROT_WRITE))
  {
    madvise(ret, length, MADV_MERGEABLE);
  }
  return ret;
}

