mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-15 16:09:27 +02:00
* reverted the rtl patches from r14184, because they cause an endless
loop when attempting to terminate a process via the RTL compiled into a Linux shared library (mantis #17383) * call FPC_LIB_EXIT (the internal/generic RTL finalisation routine) instead of FPC_SHARED_LIB_EXIT (the Linux-specific "process exit" code for shared libraries) as "fini" routine (fixes #14958 again after reverting r14184) git-svn-id: trunk@16418 -
This commit is contained in:
parent
1271c221f3
commit
1f61b5b30c
@ -1080,7 +1080,7 @@ begin
|
|||||||
{ Create some replacements }
|
{ Create some replacements }
|
||||||
{ note: linux does not use exportlib.initname/fininame due to the custom startup code }
|
{ note: linux does not use exportlib.initname/fininame due to the custom startup code }
|
||||||
InitStr:='-init FPC_SHARED_LIB_START';
|
InitStr:='-init FPC_SHARED_LIB_START';
|
||||||
FiniStr:='-fini FPC_SHARED_LIB_EXIT';
|
FiniStr:='-fini FPC_LIB_EXIT';
|
||||||
SoNameStr:='-soname '+ExtractFileName(current_module.sharedlibfilename^);
|
SoNameStr:='-soname '+ExtractFileName(current_module.sharedlibfilename^);
|
||||||
|
|
||||||
{ Call linker }
|
{ Call linker }
|
||||||
|
@ -70,10 +70,29 @@ begin
|
|||||||
PASCALMAIN;
|
PASCALMAIN;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Procedure lib_exit; external name 'FPC_LIB_EXIT';
|
{ 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; assembler; nostackframe; public name 'FPC_SHARED_LIB_EXIT'; public name '_haltproc';
|
||||||
asm
|
asm
|
||||||
.Lhaltproc:
|
.Lhaltproc:
|
||||||
call lib_exit
|
{$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}
|
||||||
|
xorl %eax,%eax
|
||||||
|
incl %eax { eax=1, exit call }
|
||||||
|
int $0x80
|
||||||
|
jmp .Lhaltproc
|
||||||
end;
|
end;
|
||||||
|
@ -356,10 +356,10 @@ FUNCTION_PROLOG FPC_SHARED_LIB_START
|
|||||||
mtlr 0
|
mtlr 0
|
||||||
blr
|
blr
|
||||||
|
|
||||||
|
/* this routine is only called when the halt() routine of the RTL embedded in
|
||||||
|
the shared library is called */
|
||||||
FUNCTION_PROLOG _haltproc
|
FUNCTION_PROLOG _haltproc
|
||||||
FUNCTION_PROLOG FPC_SHARED_LIB_EXIT
|
FUNCTION_PROLOG FPC_SHARED_LIB_EXIT
|
||||||
bl FPC_LIB_EXIT
|
|
||||||
nop
|
|
||||||
/* exit_group call */
|
/* exit_group call */
|
||||||
LOAD_64BIT_VAL 3, operatingsystem_result
|
LOAD_64BIT_VAL 3, operatingsystem_result
|
||||||
lwz 3, 0(3)
|
lwz 3, 0(3)
|
||||||
|
@ -65,14 +65,19 @@ _startlib:
|
|||||||
popq %rbx
|
popq %rbx
|
||||||
ret
|
ret
|
||||||
|
|
||||||
|
/* this routine is only called when the halt() routine of the RTL embedded in
|
||||||
|
the shared library is called */
|
||||||
.globl _haltproc
|
.globl _haltproc
|
||||||
.type _haltproc,@function
|
.type _haltproc,@function
|
||||||
_haltproc:
|
_haltproc:
|
||||||
.globl FPC_SHARED_LIB_EXIT
|
.globl FPC_SHARED_LIB_EXIT
|
||||||
.type FPC_SHARED_LIB_EXIT,@function
|
.type FPC_SHARED_LIB_EXIT,@function
|
||||||
FPC_SHARED_LIB_EXIT:
|
FPC_SHARED_LIB_EXIT:
|
||||||
call FPC_LIB_EXIT@PLT
|
movl $231,%eax /* exit_group call */
|
||||||
ret
|
movq operatingsystem_result@GOTPCREL(%rip),%rbx
|
||||||
|
movzwl (%rbx),%edi
|
||||||
|
syscall
|
||||||
|
jmp _haltproc@PLT
|
||||||
|
|
||||||
/* Define a symbol for the first piece of initialized data. */
|
/* Define a symbol for the first piece of initialized data. */
|
||||||
.data
|
.data
|
||||||
|
Loading…
Reference in New Issue
Block a user