|
@@ -12,35 +12,9 @@
|
|
|
|
|
|
**********************************************************************}
|
|
|
{$asmmode att}
|
|
|
-{$goto on}
|
|
|
-{
|
|
|
- Linux ELF startup code for Free Pascal
|
|
|
-
|
|
|
-
|
|
|
- Stack layout at program start:
|
|
|
-
|
|
|
- nil
|
|
|
- envn
|
|
|
- ....
|
|
|
- .... ENVIRONMENT VARIABLES
|
|
|
- env1
|
|
|
- env0
|
|
|
- nil
|
|
|
- argn
|
|
|
- ....
|
|
|
- .... COMMAND LINE OPTIONS
|
|
|
- arg1
|
|
|
- arg0
|
|
|
- argc <--- esp
|
|
|
-}
|
|
|
|
|
|
procedure PASCALMAIN; external name 'PASCALMAIN';
|
|
|
|
|
|
-function get1eipasebx : pointer; compilerproc; nostackframe; assembler;
|
|
|
-asm
|
|
|
- movl (%esp),%ebx
|
|
|
- ret
|
|
|
-end;
|
|
|
|
|
|
{******************************************************************************
|
|
|
Shared library start/halt
|
|
@@ -52,45 +26,17 @@ begin
|
|
|
operatingsystem_parameter_argc:=argc; { Copy the argument count }
|
|
|
operatingsystem_parameter_argv:=argv; { Copy the argument pointer }
|
|
|
operatingsystem_parameter_envp:=envp; { Copy the environment pointer }
|
|
|
-
|
|
|
- IsLibrary:=true;
|
|
|
-
|
|
|
- asm
|
|
|
- { Save initial stackpointer }
|
|
|
- {$ifdef FPC_PIC}
|
|
|
- call get1eipasebx
|
|
|
- addl $_GLOBAL_OFFSET_TABLE_,%ebx
|
|
|
- movl initialstkptr@GOT(%ebx),%ecx
|
|
|
- movl %esp,(%ecx)
|
|
|
- {$else FPC_PIC}
|
|
|
- movl %esp,initialstkptr
|
|
|
- {$endif FPC_PIC}
|
|
|
- end;
|
|
|
+ initialstkptr:=get_frame;
|
|
|
|
|
|
PASCALMAIN;
|
|
|
end;
|
|
|
|
|
|
{ this routine is only called when the halt() routine of the RTL embedded in
|
|
|
the shared library is called }
|
|
|
-procedure _FPC_shared_lib_haltproc; assembler; nostackframe; public name 'FPC_SHARED_LIB_EXIT'; public name '_haltproc';
|
|
|
+procedure _FPC_shared_lib_haltproc(e:longint); cdecl; assembler; nostackframe; public name '_haltproc';
|
|
|
asm
|
|
|
.Lhaltproc:
|
|
|
- {$ifdef FPC_PIC}
|
|
|
- call get1eipasebx
|
|
|
- addl $_GLOBAL_OFFSET_TABLE_,%ebx
|
|
|
- movl ExitCode@GOT(%ebx),%ebx
|
|
|
- {$if sizeof(ExitCode)=2}
|
|
|
- movzwl (%ebx),%ebx
|
|
|
- {$else}
|
|
|
- mov (%ebx),%ebx
|
|
|
- {$endif}
|
|
|
-{$else FPC_PIC}
|
|
|
- {$if sizeof(ExitCode)=2}
|
|
|
- movzwl ExitCode,%ebx
|
|
|
- {$else}
|
|
|
- mov ExitCode,%ebx
|
|
|
- {$endif}
|
|
|
-{$endif FPC_PIC}
|
|
|
+ movl e,%ebx
|
|
|
xorl %eax,%eax
|
|
|
incl %eax { eax=1, exit call }
|
|
|
int $0x80
|