Jelajahi Sumber

* Clean up i386-Linux startup code for shared libraries:
* The initialization code is a normal function called by runtime linker, stack layout at process startup is irrelevant.
* Stack pointer can be replaced by frame pointer, they are just a few bytes away.
* IsLibrary is set to true in fpc_libinitializeunits and therefore assigning it here is redundant.
* The exitcode is passed as argument to haltproc, so messing with PIC is not necessary.

git-svn-id: trunk@26759 -

sergei 11 tahun lalu
induk
melakukan
ead8d0c1d4
1 mengubah file dengan 3 tambahan dan 57 penghapusan
  1. 3 57
      rtl/linux/i386/si_dll.inc

+ 3 - 57
rtl/linux/i386/si_dll.inc

@@ -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