#include #include #include #include #include #include #include int main(int argc, char **argv) { struct stat sb; void *m; int fd; Elf *e, *ar; Elf_Cmd cmd; if (argc != 2) errx(1, "usage: %s: archive", argv[0]); if ((fd = open(argv[1], O_RDONLY)) < 0) err(1, "open"); if (fstat(fd, &sb) < 0) err(1, "fstat"); m = NULL; if ((m = mmap(NULL, (size_t) sb.st_size, PROT_READ, MAP_PRIVATE, fd, (off_t) 0)) == MAP_FAILED) err(1, "mmap"); if (elf_version(EV_CURRENT) == EV_NONE) errx(1, "elf_version failed"); if ((ar = elf_memory(m, (size_t) sb.st_size)) == NULL) errx(1, "elf_memory failed"); if (elf_kind(ar) != ELF_K_AR) errx(1, "%s not archive", argv[1]); cmd = ELF_C_READ; /* XXX The first argument for elf_begin: fd has to be -1 here. */ while ((e = elf_begin(-1, cmd, ar)) != (Elf *) 0) { printf("found member\n"); cmd = elf_next(e); elf_end(e); } elf_end(ar); exit(0); }