__libc_start_main.c 1006 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include <elf.h>
  2. #include "libc.h"
  3. void __init_tls(size_t *);
  4. void __init_security(size_t *);
  5. void __init_ldso_ctors(void);
  6. #define AUX_CNT 38
  7. extern size_t __hwcap, __sysinfo;
  8. void __init_libc(char **envp)
  9. {
  10. size_t i, *auxv, aux[AUX_CNT] = { 0 };
  11. __environ = envp;
  12. for (i=0; envp[i]; i++);
  13. libc.auxv = auxv = (void *)(envp+i+1);
  14. for (i=0; auxv[i]; i+=2) if (auxv[i]<AUX_CNT) aux[auxv[i]] = auxv[i+1];
  15. __hwcap = aux[AT_HWCAP];
  16. __sysinfo = aux[AT_SYSINFO];
  17. __init_tls(aux);
  18. __init_security(aux);
  19. }
  20. int __libc_start_main(
  21. int (*main)(int, char **, char **), int argc, char **argv,
  22. int (*init)(int, char **, char **), void (*fini)(void),
  23. void (*ldso_fini)(void))
  24. {
  25. char **envp = argv+argc+1;
  26. __init_libc(envp);
  27. libc.ldso_fini = ldso_fini;
  28. libc.fini = fini;
  29. /* Execute constructors (static) linked into the application */
  30. if (init) init(argc, argv, envp);
  31. #ifdef SHARED
  32. __init_ldso_ctors();
  33. #endif
  34. /* Pass control to to application */
  35. exit(main(argc, argv, envp));
  36. return 0;
  37. }