si_c.inc 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. {$define CRT_IRELOC_RELA}
  2. procedure init_tls; cdecl; external name 'init_tls';
  3. function cmain(nrarg:longint;pp:PPAnsiChar;env:PPAnsiChar):longint; cdecl; external name 'main';
  4. {$ifdef gcrt}
  5. procedure cmcleanup; cdecl; external name '_mcleanup';
  6. procedure monstratup(p,p2:pointer); cdecl; external name 'monstartup';
  7. var
  8. eprol:longint; external name 'eprol';
  9. etext:longint; external name 'etext';
  10. {$endif}
  11. {$i ignore_init.inc}
  12. procedure start(ap:PPAnsiChar;cleanup:TCleanupProc);
  13. var argc: longint;
  14. argv: PPAnsiChar;
  15. env : PPAnsiChar;
  16. s : PAnsiChar;
  17. begin
  18. argc:=pptrint(ap)^;
  19. argv:=PPAnsiChar(ap[1]);
  20. env:= PPAnsiChar(ap[2+argc]);
  21. environ:=env;
  22. handle_argv(argc,argv,env);
  23. if assigned(PAnsiChar(@_dynamic)) then // I suspect this is a trick to find
  24. // out runtime if we are shared
  25. // linking, so the same code can be used
  26. // for static and shared linking
  27. atexit(cleanup)
  28. else
  29. begin
  30. process_irelocs();
  31. init_tls;
  32. end;
  33. {$ifdef GCRT}
  34. atexit(@cmcleanup);
  35. {$endif}
  36. atexit(@_fini);
  37. {$ifdef GCRT}
  38. monstartup(@eprol,@etext);
  39. asm
  40. eprol:
  41. end;
  42. {$endif}
  43. handle_static_init(argc, argv, env);
  44. libc_exit(cmain(argc,argv,env)); // doesn't return
  45. end;
  46. begin
  47. end.