/* Ensure we get syscall declared. */ #define _DEFAULT_SOURCE #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; } |