#include #include #include #include #include #include #include #include #include int main(int argc, const char *argv[]) { char fname[PATH_MAX]; int cnt; int fd; struct stat sb; void *addr; cnt = readlink("/proc/self/exe", fname, sizeof(fname)); fname[cnt] = '\0'; #define EXE_SUFFIX ".exe" #define STRLEN_EXE_SUFFIX (sizeof(EXE_SUFFIX)-1) if (cnt <= STRLEN_EXE_SUFFIX || strcasecmp(&fname[cnt-STRLEN_EXE_SUFFIX], EXE_SUFFIX)) strcpy(fname+cnt, EXE_SUFFIX); fd = open(fname, O_RDONLY); if (fd < 0) { perror("open self"); return -1; } if (fstat(fd, &sb) < 0) { perror("stat"); return -1; } addr = mmap(NULL, sb.st_size, (PROT_READ|PROT_WRITE), (MAP_NORESERVE|MAP_PRIVATE), fd, 0); if (addr == MAP_FAILED) { perror("mmap1"); return -1; } addr = mmap(NULL, sb.st_size, (PROT_READ|PROT_WRITE), (MAP_NORESERVE|MAP_PRIVATE), fd, 0); if (addr == MAP_FAILED) { perror("mmap2"); return -1; } close(fd); puts("test passed"); return 0; }