/* * Test program for PT_MEMMAP */ #include #include #include #include #include #include #include int main(int argc, char **argv) { struct ptrace_mem_map_desc *md; char *buf = NULL; int bufsz = 40; /* chosen small */ int status, ret; pid_t pid; if (argc != 2) errx(1, "argc != 2"); if ((pid = atoi(argv[1])) == 0) errx(1, "pid == 0 ?"); if (ptrace(PT_ATTACH, pid, NULL, 0) < 0) err(1, "ptrace attach"); if (kill(pid, SIGSTOP) < 0) err(1, "kill stop"); if (waitpid(pid, &status, 0) == 0) err(1, "wait"); do { bufsz *= 2; if ((buf = realloc(buf, bufsz)) == NULL) errx(1, "no memory: %d\n", bufsz); ret = ptrace(PT_MEMMAP, pid, buf, bufsz); if (ret < 0 && errno != ENOMEM) err(1, "ptrace memmap"); } while (ret != 0); for (md = (void *)buf; (char *)md < &buf[bufsz]; md++) { printf("start: %08lx\tend: %08lx\t%c%c%c %c%c%c %-4s %-4s %d %d %d\n", (unsigned long)md->pmmd_start, (unsigned long)md->pmmd_end, (md->pmmd_flags & PMMD_PROT_READ) ? 'r' : '-', (md->pmmd_flags & PMMD_PROT_WRITE) ? 'w' : '-', (md->pmmd_flags & PMMD_PROT_EXEC) ? 'x' : '-', (md->pmmd_flags & PMMD_PROT_MAX_READ) ? 'r' : '-', (md->pmmd_flags & PMMD_PROT_MAX_WRITE) ? 'w' : '-', (md->pmmd_flags & PMMD_PROT_MAX_EXEC) ? 'x' : '-', (md->pmmd_flags & PMMD_COW) ? "COW" : "NCOW", (md->pmmd_flags & PMMD_NEEDCOPY) ? "NC" : "NNC", md->pmmd_wiredcount, md->pmmd_inheritance, md->pmmd_advice); if (md->pmmd_flags & PMMD_LAST_ENTRY) break; } if (ptrace(PT_DETACH, pid, NULL, 0) < 0) err(1, "ptrace detach"); return 0; }