mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-06-05 13:18:32 +02:00
* 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 -
This commit is contained in:
parent
df6837fa12
commit
ead8d0c1d4
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user