1/* { dg-require-effective-target mmap } */ 2/* { dg-skip-if "the executable is at the same position the test tries to remap" { m68k-*-linux* } { "*" } { "" } } */ 3 4#include <limits.h> 5 6#include <sys/types.h> 7#include <sys/mman.h> 8#include <sys/stat.h> 9#include <fcntl.h> 10#ifndef MAP_ANON 11#ifdef MAP_ANONYMOUS 12#define MAP_ANON MAP_ANONYMOUS 13#else 14#define MAP_ANON MAP_FILE 15#endif 16#endif 17#ifndef MAP_FILE 18#define MAP_FILE 0 19#endif 20#ifndef MAP_FIXED 21#define MAP_FIXED 0 22#endif 23 24#define MAP_START (void *)0x7fff8000 25#define MAP_LEN 0x10000 26 27#define OFFSET (MAP_LEN/2 - 2 * sizeof (char)); 28 29f (int s, char *p) 30{ 31 int i; 32 for (i = s; &p[i] < &p[40] && i >= 0; i++) 33 { 34 p[i] = -2; 35 } 36} 37 38main () 39{ 40#ifdef MAP_ANON 41 char *p; 42 int dev_zero; 43 44 dev_zero = open ("/dev/zero", O_RDONLY); 45 /* -1 is OK when we have MAP_ANON; else mmap will flag an error. */ 46 if (INT_MAX != 0x7fffffffL || sizeof (char *) != sizeof (int)) 47 exit (0); 48 p = mmap (MAP_START, MAP_LEN, PROT_READ|PROT_WRITE, 49 MAP_ANON|MAP_FIXED|MAP_PRIVATE, dev_zero, 0); 50 if (p != (char *)-1) 51 { 52 p += OFFSET; 53 p[39] = 0; 54 f (0, p); 55 if (p[39] != (char)-2) 56 abort (); 57 p[39] = 0; 58 f (-1, p); 59 if (p[39] != 0) 60 abort (); 61 } 62#endif 63 exit (0); 64} 65