| #include <unistd.h> |
| #include <link.h> |
| #include <syscall.h> |
| |
| #define STRING_COMMA_LEN(STR) (STR), (sizeof (STR) - 1) |
| |
| int |
| main (int argc, char **argv) |
| { |
| char **ev = &argv[argc + 1]; |
| char **evp = ev; |
| ElfW(auxv_t) *av; |
| const ElfW(Phdr) *phdr = NULL; |
| size_t phnum = 0; |
| size_t loadnum = 0; |
| int fd = STDOUT_FILENO; |
| size_t i; |
| |
| while (*evp++ != NULL) |
| ; |
| |
| av = (ElfW(auxv_t) *) evp; |
| |
| for (; av->a_type != AT_NULL; ++av) |
| switch (av->a_type) |
| { |
| case AT_PHDR: |
| phdr = (const void *) av->a_un.a_val; |
| break; |
| case AT_PHNUM: |
| phnum = av->a_un.a_val; |
| break; |
| } |
| |
| for (i = 0; i < phnum; i++, phdr++) |
| if (phdr->p_type == PT_LOAD) |
| loadnum++; |
| |
| syscall (SYS_write, fd, STRING_COMMA_LEN ("PASS\n")); |
| |
| syscall (SYS_exit, !loadnum); |
| return 0; |
| } |