123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- {
- This file is part of the Free Pascal run time library.
- Copyright (c) 2009 by Pierre Muller,
- member of the Free Pascal development team.
- Program startup
- Adapted from code generated by gcc on opensolaris 2.11
- and sparc version in
- See the file COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- type
- TCdeclProcedure = procedure; cdecl;
- function atexit(proc:TCdeclProcedure):longint;cdecl;external 'c' name 'atexit'{ @plt };
- procedure C_exit;cdecl;external 'c' name 'exit';
- procedure _exit;cdecl;external 'c' name '_exit';
- //procedure _fini;cdecl;external 'c' name '_fini';
- //procedure __fpstart;cdecl;external 'c' name '__fpstart'{ @plt };
- //procedure __fsr;cdecl;external 'c' name '__fsr';
- //procedure _init;cdecl;external 'c' name '_init';
- procedure PascalMain;external name 'PASCALMAIN';
- {vars are not correctly transformed :(
- var
- _DYNAMIC : longint; cvar; external;
- __Argv : pointer; cvar; external;
- environ : pointer; cvar; external;
- __get_exit_frame_monitor_ptr : pointer; cvar; external;
- __do_exit_code_ptr : pointer; cvar; external;
- }
- var
- _environ : pointer; cvar; external;
- procedure _DYNAMIC;cdecl;external 'c' name '_DYNAMIC'; { should be weak }
- procedure __Argv;cdecl;external 'c' name '__Argv';
- //procedure environ;cdecl;external 'c' name 'environ';
- //procedure __get_exit_frame_monitor_ptr;cdecl;external 'c' name '__get_exit_frame_monitor_ptr';
- //procedure __do_exit_code_ptr;cdecl;external 'c' name '__do_exit_code_ptr';
- {
- (top-gdb) disas _start
- Dump of assembler code for function _start: }
- procedure _start;assembler;nostackframe;public name '_start';
- asm
- mov %esp,%eax
- mov %eax,StackTopPtr
- pushl $0x0
- pushl $0x0
- mov %esp,%ebp
- mov $_DYNAMIC,%eax
- test %eax,%eax
- je .Label1
- push %edx
- call atexit {@plt}
- add $0x4,%esp
- .Label1:
- (*
- push _fini
- call atexit {@plt}
- add $0x4,%esp
- lea __get_exit_frame_monitor_ptr,%eax
- mov (%eax),%eax
- test %eax,%eax
- je .Label2
- lea __do_exit_code_ptr,%eax
- mov (%eax),%eax
- test %eax,%eax
- je .Label2
- push %eax
- call atexit {@plt}
- add $0x4,%esp
- *)
- .Label2:
- mov 0x8(%ebp),%eax
- mov %eax,argc
- mov _environ,%edx
- test %edx,%edx
- jne .Label3
- lea 0x10(%ebp,%eax,4),%edx
- .Label3:
- movl %edx,_environ
- movl %edx,envp
- and $0xfffffff0,%esp
- push %edx
- lea 0xc(%ebp),%edx
- mov %edx,argv
- push %edx
- push %eax
- //call __fpstart {@plt}
- //call __fsr
- //call _init
- call PASCALMAIN {was <main> }
- add $0xc,%esp
- push %eax
- push %eax
- call C_exit { was exit@plt }
- add $0x4,%esp
- call _exit {@plt}
- add $0x4,%esp
- hlt
- end;
|