I noticed 32bit binary on x86_64 behavior is changed on 2.6.23-mm1. This is a result of pmap after process returns -ENOMEM.(see attached program) == on 2.6.23 == errno 12 3531: ./malloc 0000000000001000 6272K ----- [ anon ] 0000000000621000 100K r-x-- /lib/ld-2.5.so 000000000063a000 4K r---- /lib/ld-2.5.so 000000000063b000 4K rw--- /lib/ld-2.5.so 000000000063c000 8K ----- [ anon ] 000000000063e000 1244K r-x-- /lib/libc-2.5.so 0000000000775000 8K r---- /lib/libc-2.5.so 0000000000777000 4K rw--- /lib/libc-2.5.so 0000000000778000 12K rw--- [ anon ] 000000000077b000 123700K ----- [ anon ] 0000000008048000 4K r-x-- /home/kamezawa/malloc 0000000008049000 4K rw--- /home/kamezawa/malloc 000000000804a000 3929824K ----- [ anon ] 00000000f7f02000 8K rw--- [ anon ] 00000000f7f04000 100K ----- [ anon ] 00000000f7f1d000 4K rw--- [ anon ] 00000000f7f1e000 131812K ----- [ anon ] 00000000fffd7000 84K rw--- [ stack ] 00000000fffec000 72K ----- [ anon ] 00000000ffffe000 4K r-x-- [ anon ] total 4193272K ==
== on 2.6.23-mm1== errno 12 3504: ./malloc 0000000000621000 100K r-x-- /lib/ld-2.5.so 000000000063a000 4K r---- /lib/ld-2.5.so 000000000063b000 4K rw--- /lib/ld-2.5.so 000000000063e000 1244K r-x-- /lib/libc-2.5.so 0000000000775000 8K r---- /lib/libc-2.5.so 0000000000777000 4K rw--- /lib/libc-2.5.so 0000000000778000 12K rw--- [ anon ] 0000000008048000 4K r-x-- /home/kamezawa/malloc 0000000008049000 4K rw--- /home/kamezawa/malloc 0000000055555000 4K rw--- [ anon ] 0000000055556000 100K ----- [ anon ] 000000005556f000 8K rw--- [ anon ] 0000000055671000 2789016K ----- [ anon ] 00000000ffa17000 84K rw--- [ stack ] 00000000ffa2c000 5960K ----- [ anon ] 00000000ffffe000 4K r-x-- [ anon ] total 2796560K == Maybe get_unmapped_area() had some change. Is this intended ? Thanks, -Kame
#include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <sys/mman.h> #include <errno.h> #define PAGESIZE (4096) int main(int argc, char *argv[]) { char *c,*safe; pid_t pid; char buffer[256]; int err; pid = getpid(); sprintf(buffer,"/usr/bin/pmap %d", pid); safe = malloc(1024*1024); while (1) { c = mmap(NULL, PAGESIZE, PROT_NONE, MAP_ANON | MAP_PRIVATE, 0, 0); if (c == MAP_FAILED) { err = errno; break; } } free(safe); printf("errno %d\n",err); system(buffer); }