| /* |
| #notarget: cris*-*-elf |
| */ |
| |
| #define _GNU_SOURCE |
| #include <string.h> |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <sys/types.h> |
| #include <sys/stat.h> |
| #include <fcntl.h> |
| #include <unistd.h> |
| #include <sys/mman.h> |
| |
| int main (int argc, char *argv[]) |
| { |
| int fd = open (argv[0], O_RDONLY); |
| struct stat sb; |
| int size; |
| void *a; |
| void *b; |
| const char *str = "a string you'll only find in the program"; |
| |
| if (fd == -1) |
| { |
| perror ("open"); |
| abort (); |
| } |
| |
| if (fstat (fd, &sb) < 0) |
| { |
| perror ("fstat"); |
| abort (); |
| } |
| |
| size = 8192; |
| #ifdef MMAP_SIZE1 |
| size = MMAP_SIZE1; |
| #endif |
| |
| #ifndef MMAP_PROT1 |
| #define MMAP_PROT1 PROT_READ | PROT_WRITE | PROT_EXEC |
| #endif |
| |
| #ifndef MMAP_FLAGS1 |
| #define MMAP_FLAGS1 MAP_PRIVATE | MAP_ANONYMOUS |
| #endif |
| |
| /* Get a page, any page. */ |
| b = mmap (NULL, size, MMAP_PROT1, MMAP_FLAGS1, -1, 0); |
| if (b == MAP_FAILED) |
| abort (); |
| |
| /* Remember it, unmap it. */ |
| #ifndef NO_MUNMAP |
| if (munmap (b, size) != 0) |
| abort (); |
| #endif |
| |
| #ifdef MMAP_ADDR2 |
| b = MMAP_ADDR2; |
| #endif |
| |
| #ifndef MMAP_PROT2 |
| #define MMAP_PROT2 PROT_READ | PROT_EXEC |
| #endif |
| |
| #ifndef MMAP_FLAGS2 |
| #define MMAP_FLAGS2 MAP_DENYWRITE | MAP_FIXED | MAP_PRIVATE |
| #endif |
| |
| size = sb.st_size; |
| #ifdef MMAP_SIZE2 |
| size = MMAP_SIZE2; |
| #endif |
| |
| #define MMAP_TEST_BAD_ORIG \ |
| (a == MAP_FAILED || memmem (a, size, str, strlen (str) + 1) == NULL) |
| #ifndef MMAP_TEST_BAD |
| #define MMAP_TEST_BAD MMAP_TEST_BAD_ORIG |
| #endif |
| |
| /* Try mapping the now non-mapped page fixed. */ |
| a = mmap (b, size, MMAP_PROT2, MMAP_FLAGS2, fd, 0); |
| |
| if (MMAP_TEST_BAD) |
| abort (); |
| |
| printf ("pass\n"); |
| exit (0); |
| } |