Hi, Sending this dump bad map_fixed one that can be combined with other flags MAP_ANONYMOUS... be useful on Linux ? Adrian asked.
link: https://gist.github.com/tixxdz/301158c64cdcdd0b976891579ce52609 $ ./a.out 0x7f2995bb9000 0x70000000000 0x6fffffff000 0x6ffffffe000 0x6ffffffd000 0x6ffffffc000 0x7f29955fc000
#include <errno.h> #include <stdio.h> #include <sys/mman.h> #include <unistd.h> /* MAP_FIXED is bad... map a big ANONYMOUS and let MAP_FIXED reclame it... */ /* This is wrong and was written quickly it ignores linux mmap_min_addr * addresses and plenty of bugs ... */ static void *mmap_hint(void *base_addr) { unsigned offset = 0; static void *addr = NULL; static void *up = NULL; static unsigned long psize = 0; if (!psize) psize = getpagesize(); if ((void *)base_addr != NULL) { if (!addr) { addr = base_addr; offset = 0; up = base_addr; } else if (up) { if ((unsigned long)base_addr > (unsigned long)up) { errno = -EINVAL; return MAP_FAILED; } offset += psize; } else { errno = -EINVAL; return MAP_FAILED; } addr -= offset; addr = (void *)((unsigned long)addr & ~(psize - 1)); goto mmap_call; } addr = NULL; /* MAP_FIXED is bad... */ mmap_call: return mmap(addr, psize, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0); } int main(void) { void *ptr1, *ptr2, *ptr3, *ptr4, *ptr5, *ptr6, *ptr7; ptr1 = mmap(NULL, 1024*1024, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0); ptr2 = mmap_hint((void *)0x0000070000000000ULL); ptr3 = mmap_hint((void *)0x0000070000000000ULL); ptr4 = mmap_hint((void *)0x0000070000000000ULL); ptr5 = mmap_hint((void *)0x0000070000000000ULL); ptr6 = mmap_hint((void *)0x0000070000000000ULL); ptr7 = mmap(NULL, 1024*1024, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); printf("%p %p %p %p %p %p %p\n", ptr1, ptr2, ptr3, ptr4, ptr5, ptr6, ptr7); }