pr23428.c 854 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. /* Ensure we get syscall declared. */
  2. #define _DEFAULT_SOURCE
  3. #include <unistd.h>
  4. #include <link.h>
  5. #include <syscall.h>
  6. #define STRING_COMMA_LEN(STR) (STR), (sizeof (STR) - 1)
  7. int
  8. main (int argc, char **argv)
  9. {
  10. char **ev = &argv[argc + 1];
  11. char **evp = ev;
  12. ElfW(auxv_t) *av;
  13. const ElfW(Phdr) *phdr = NULL;
  14. size_t phnum = 0;
  15. size_t loadnum = 0;
  16. int fd = STDOUT_FILENO;
  17. size_t i;
  18. while (*evp++ != NULL)
  19. ;
  20. av = (ElfW(auxv_t) *) evp;
  21. for (; av->a_type != AT_NULL; ++av)
  22. switch (av->a_type)
  23. {
  24. case AT_PHDR:
  25. phdr = (const void *) av->a_un.a_val;
  26. break;
  27. case AT_PHNUM:
  28. phnum = av->a_un.a_val;
  29. break;
  30. }
  31. for (i = 0; i < phnum; i++, phdr++)
  32. if (phdr->p_type == PT_LOAD)
  33. loadnum++;
  34. syscall (SYS_write, fd, STRING_COMMA_LEN ("PASS\n"));
  35. syscall (SYS_exit, !loadnum);
  36. return 0;
  37. }