mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-07-07 20:35:58 +02:00
93 lines
2.1 KiB
PHP
93 lines
2.1 KiB
PHP
|
|
Type
|
|
TCleanup = procedure; cdecl;
|
|
|
|
var
|
|
environ : ppchar; cvar; public name '__environ';
|
|
progname: pchar = #0#0; cvar; public name '__progname';
|
|
dynamic : pchar; external name '_DYNAMIC'; // #pragma weak
|
|
|
|
procedure atexit(prc:TCleanup); cdecl external name 'atexit';
|
|
procedure cleanup(prc:TCleanup); cdecl external name 'cleanup';
|
|
procedure init_tls; cdecl; external name 'init_tls';
|
|
procedure fini; cdecl; external name '_fini';
|
|
procedure init; cdecl; external name '_init';
|
|
procedure libc_exit(exitcode:longint);cdecl; external name 'exit';
|
|
function main(nrarg:longint;pp:ppchar;env:ppchar):longint; cdecl; external name 'main';
|
|
|
|
{$ifdef gcrt}
|
|
procedure cmcleanup; cdecl; external name '_mcleanup';
|
|
procedure monstratup(p,p2:pointer); cdecl; external name 'monstartup';
|
|
|
|
var
|
|
eprol:longint; external name 'eprol';
|
|
etext:longint; external name 'etext';
|
|
{$endif}
|
|
|
|
procedure start(ap:ppchar;cleanup:TCleanup);
|
|
|
|
var argc: longint;
|
|
argv: ppchar;
|
|
env : ppchar;
|
|
s : pchar;
|
|
begin
|
|
argc:=plongint(ap)^;
|
|
argv:=ppchar(ap[1]);
|
|
env:= ppchar(ap[2+argc]);
|
|
environ:=env;
|
|
if (argc>0) and (argv[0]<>#0) Then
|
|
begin
|
|
progname:=argv[0];
|
|
s:=progname;
|
|
while s^<>#0 do
|
|
begin
|
|
if s^='/' then
|
|
progname:=@s[1];
|
|
inc(s);
|
|
end;
|
|
end;
|
|
if assigned(pchar(@dynamic)) then // I suspect this is a trick to find
|
|
// out runtime if we are shared
|
|
// linking, so the same code can be used
|
|
// for static and shared linking
|
|
atexit(cleanup)
|
|
else
|
|
init_tls;
|
|
{$ifdef GCRT}
|
|
atexit(@_mcleanup);
|
|
{$endif}
|
|
atexit(@fini);
|
|
{$ifdef GCRT}
|
|
monstartup(@eprol,@etext);
|
|
{$endif}
|
|
init;
|
|
{$ifdef GCRT}
|
|
asm
|
|
eprol:
|
|
end;
|
|
{$endif}
|
|
|
|
libc_exit(main(argc,argv,env)); // doesn't return
|
|
asm
|
|
{ We need this stuff to make gdb behave itself, otherwise
|
|
gdb will chokes with SIGILL when trying to debug apps.
|
|
}
|
|
.section ".note.ABI-tag", "a"
|
|
.align 4
|
|
.long 10
|
|
.long 4
|
|
.long 1
|
|
.asciz "DragonFly"
|
|
.align 4
|
|
.long 400000
|
|
.align 4
|
|
.section .note.GNU-stack,"",@progbits
|
|
end;
|
|
end;
|
|
|
|
|
|
|
|
begin
|
|
end.
|
|
|