Browse Source

* Shared library dllrpt0.as init code for i386 and x86_64 CPUs

git-svn-id: trunk@19276 -
pierre 14 years ago
parent
commit
33604a6a49
5 changed files with 261 additions and 65 deletions
  1. 2 0
      .gitattributes
  2. 66 64
      rtl/freebsd/Makefile
  3. 4 1
      rtl/freebsd/Makefile.fpc
  4. 111 0
      rtl/freebsd/i386/dllprt0.as
  5. 78 0
      rtl/freebsd/x86_64/dllprt0.as

+ 2 - 0
.gitattributes

@@ -7079,6 +7079,7 @@ rtl/freebsd/errnostr.inc svneol=native#text/plain
 rtl/freebsd/freebsd.pas -text svneol=unset#text/plain
 rtl/freebsd/i386/bsyscall.inc svneol=native#text/plain
 rtl/freebsd/i386/cprt0.as svneol=native#text/plain
+rtl/freebsd/i386/dllprt0.as svneol=native#text/plain
 rtl/freebsd/i386/gprt0.as svneol=native#text/plain
 rtl/freebsd/i386/identpatch.sh svneol=native#text/plain
 rtl/freebsd/i386/prt0.as svneol=native#text/plain
@@ -7106,6 +7107,7 @@ rtl/freebsd/unxsockh.inc svneol=native#text/plain
 rtl/freebsd/unxsysc.inc svneol=native#text/plain
 rtl/freebsd/x86_64/bsyscall.inc svneol=native#text/plain
 rtl/freebsd/x86_64/cprt0.as svneol=native#text/plain
+rtl/freebsd/x86_64/dllprt0.as svneol=native#text/plain
 rtl/freebsd/x86_64/gprt0.as svneol=native#text/plain
 rtl/freebsd/x86_64/prt0.as svneol=native#text/plain
 rtl/freebsd/x86_64/si_c.inc svneol=native#text/plain

+ 66 - 64
rtl/freebsd/Makefile

@@ -708,193 +708,193 @@ ifeq ($(FULL_TARGET),mipsel-linux)
 override TARGET_IMPLICITUNITS+=exeinfo
 endif
 ifeq ($(FULL_TARGET),i386-linux)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-go32v2)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-win32)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-os2)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-freebsd)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-beos)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-haiku)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-netbsd)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-solaris)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-qnx)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-netware)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-openbsd)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-wdosx)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-darwin)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-emx)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-watcom)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-netwlibc)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-wince)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-embedded)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-symbian)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-nativent)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-iphonesim)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),m68k-linux)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),m68k-freebsd)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),m68k-netbsd)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),m68k-amiga)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),m68k-atari)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),m68k-openbsd)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),m68k-palmos)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),m68k-embedded)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc-linux)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc-netbsd)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc-amiga)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc-macos)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc-darwin)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc-morphos)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc-embedded)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc-wii)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),sparc-linux)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),sparc-netbsd)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),sparc-solaris)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),sparc-embedded)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),x86_64-linux)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),x86_64-freebsd)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),x86_64-solaris)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),x86_64-darwin)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),x86_64-win64)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),x86_64-embedded)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),arm-linux)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),arm-palmos)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),arm-darwin)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),arm-wince)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),arm-gba)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),arm-nds)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),arm-embedded)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),arm-symbian)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc64-linux)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc64-darwin)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),powerpc64-embedded)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),avr-embedded)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),armeb-linux)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),armeb-embedded)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),mipsel-linux)
-override TARGET_LOADERS+=prt0 cprt0 gprt0
+override TARGET_LOADERS+=prt0 cprt0 gprt0 dllprt0
 endif
 ifeq ($(FULL_TARGET),i386-linux)
 override TARGET_RSTS+=math varutils typinfo classes variants dateutils sysconst
@@ -2185,7 +2185,7 @@ override FPCOPT+=-Aas
 endif
 endif
 ifeq ($(findstring 2.0.,$(FPC_VERSION)),)
-ifneq ($(findstring $(OS_TARGET),linux solaris),)
+ifneq ($(findstring $(OS_TARGET),freebsd openbsd netbsd linux solaris),)
 ifeq ($(CPU_TARGET),x86_64)
 override FPCOPT+=-Cg
 endif
@@ -2627,6 +2627,8 @@ cprt0$(OEXT) : $(CPU_TARGET)/cprt0.as
 	$(AS) -o $(UNITTARGETDIRPREFIX)cprt0$(OEXT) $(CPU_TARGET)/cprt0.as
 gprt0$(OEXT) : $(CPU_TARGET)/gprt0.as
 	$(AS) -o $(UNITTARGETDIRPREFIX)gprt0$(OEXT) $(CPU_TARGET)/gprt0.as
+dllprt0$(OEXT) : $(CPU_TARGET)/dllprt0.as
+	$(AS) -o $(UNITTARGETDIRPREFIX)dllprt0$(OEXT) $(CPU_TARGET)/dllprt0.as
 $(SYSTEMUNIT)$(PPUEXT) : $(BSDINC)/$(SYSTEMUNIT).pp unxconst.inc $(SYSDEPS)
 	$(COMPILER) -Us -Sg $(BSDINC)/$(SYSTEMUNIT).pp
 objpas$(PPUEXT): $(OBJPASDIR)/objpas.pp $(INC)/except.inc $(SYSTEMUNIT)$(PPUEXT)

+ 4 - 1
rtl/freebsd/Makefile.fpc

@@ -9,7 +9,7 @@ main=rtl
 fpcpackage=y
 
 [target]
-loaders=prt0 cprt0 gprt0
+loaders=prt0 cprt0 gprt0 dllprt0
 units=$(SYSTEMUNIT) unixtype ctypes objpas macpas iso7185 \
       strings syscall sysctl  baseunix unixutil character \
       unix rtlconsts initc cmem matrix \
@@ -120,6 +120,9 @@ cprt0$(OEXT) : $(CPU_TARGET)/cprt0.as
 gprt0$(OEXT) : $(CPU_TARGET)/gprt0.as
         $(AS) -o $(UNITTARGETDIRPREFIX)gprt0$(OEXT) $(CPU_TARGET)/gprt0.as
 
+dllprt0$(OEXT) : $(CPU_TARGET)/dllprt0.as
+        $(AS) -o $(UNITTARGETDIRPREFIX)dllprt0$(OEXT) $(CPU_TARGET)/dllprt0.as
+
 #
 # System Units (System, Objpas, Strings)
 #

+ 111 - 0
rtl/freebsd/i386/dllprt0.as

@@ -0,0 +1,111 @@
+#
+#   This file is part of the Free Pascal run time library.
+#   Copyright (c) 1999-2000 by Marco van de Voort, Michael Van Canneyt
+#                                                  and Peter Vreman
+#   members of the Free Pascal development team.
+#
+#   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.
+#
+#**********************************************************************}
+#
+# FreeBSD standard (shared) ELF startup code for Free Pascal
+#
+# FreeBSD RunTime dynamic loader only
+# calls the functions specified by -init
+# as functions without parameters
+# Thus, it is not possible to retrieve argc, argv and envp
+# for libraries.
+# On x86_64 CPU, using weak for the operatingsystem_parameter_XXX
+# allows to bind to main program parameters,
+# but this does not seem to work for i386 loader.
+ 
+        .file   "dllprt0.as"
+        .version        "01.01"
+gcc2_compiled.:
+.section        .rodata
+.LC0:
+        .ascii "\0"
+.data
+        .p2align 2
+	.globl __progname
+        .type    __progname,@object
+        .size    __progname,4
+__progname:
+        .long .LC0
+        .align  4
+        .type   __fpucw,@object
+        .size   __fpucw,4
+        .global __fpucw
+___fpucw:
+        .long   0x1332
+
+        .globl  ___fpc_brk_addr         /* heap management */
+        .type   ___fpc_brk_addr,@object
+        .size   ___fpc_brk_addr,4
+
+.text
+	.p2align 2,,3
+	.globl FPC_LIB_START
+	.type FPC_LIB_START,@function
+FPC_LIB_START:
+	.globl FPC_SHARED_LIB_START
+	.type FPC_SHARED_LIB_START,@function
+FPC_SHARED_LIB_START:
+        movb    $1,operatingsystem_islibrary
+
+        finit                           /* initialize fpu */
+        fwait
+        fldcw   ___fpucw
+
+        /* xorl    %ebp,%ebp */
+
+	call	PASCALMAIN@PLT
+	ret
+
+        pushl %eax
+        jmp   _haltproc
+        
+.p2align 2,0x90
+.globl _haltproc
+.type _haltproc,@function
+
+_haltproc:
+	.globl FPC_SHARED_LIB_EXIT
+	.type FPC_SHARED_LIB_EXIT,@function
+FPC_SHARED_LIB_EXIT:
+        call    FPC_LIB_EXIT@PLT
+           mov $1,%eax  
+           movzwl operatingsystem_result,%ebx
+           pushl %ebx
+           call _actualsyscall
+           addl  $4,%esp
+           jmp   _haltproc
+
+_actualsyscall:
+         int $0x80
+         jb .LErrorcode
+         xor %ebx,%ebx
+         ret
+.LErrorcode:
+         mov %eax,%ebx
+         mov $-1,%eax
+         ret
+        .comm   environ,4,4
+        .weak   _DYNAMIC
+        .ident  "GCC: (GNU) 2.7.2.1"
+
+
+__stkptr:
+        .skip   4
+
+        .comm operatingsystem_parameter_envp,4
+        .comm operatingsystem_parameter_argc,4
+        .comm operatingsystem_parameter_argv,4
+
+//.section .threadvar,"aw",@nobits
+        .comm   ___fpc_threadvar_offset,4

+ 78 - 0
rtl/freebsd/x86_64/dllprt0.as

@@ -0,0 +1,78 @@
+#
+#   This file is part of the Free Pascal run time library.
+#   Copyright (c) 1999-2000 by Marco van de Voort, Michael Van Canneyt
+#                                                  and Peter Vreman
+#   members of the Free Pascal development team.
+#
+#   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.
+#
+#**********************************************************************}
+#
+# FreeBSD standard (shared) ELF startup code for Free Pascal
+#
+# FreeBSD RunTime dynamic loader only
+# calls the functions specified by -init
+# as functions without parameters
+# Thus, it is not possible to retrieve argc, argv and envp
+# for libraries.
+# On x86_64 CPU, using weak for the operatingsystem_parameter_XXX
+# allows to bind to main program parameters,
+# but this does not seem to work for i386 loader.
+ 
+	.file	"crt1.c"
+#APP
+	.ident	"$FreeBSD: src/lib/csu/common/crtbrand.c,v 1.4 2003/10/17 15:43:13 peter Exp $"
+#NO_APP
+	.section	.note.ABI-tag,"a",@progbits
+	.p2align 2
+	.type	abitag, @object
+	.size	abitag, 24
+abitag:
+	.long	8
+	.long	4
+	.long	1
+	.string	"FreeBSD"
+	.long	700055
+
+	.text
+#APP
+	.ident	"$FreeBSD: src/lib/csu/amd64/crt1.c,v 1.13 2003/04/30 19:27:07 peter Exp $"
+#NO_APP
+	.p2align 2,,3
+	.globl FPC_LIB_START
+	.type FPC_LIB_START,@function
+FPC_LIB_START:
+	.globl FPC_SHARED_LIB_START
+	.type FPC_SHARED_LIB_START,@function
+FPC_SHARED_LIB_START:
+	# jmp	_startlib@PLT
+        movb    $1,operatingsystem_islibrary(%rip)
+        #movq    operatingsystem_islibrary@GOTPCREL(%rip),%rax
+        #movb    $1,(%rax)
+	call	PASCALMAIN@PLT
+	ret
+	.p2align 2,,3
+        .globl  _haltproc
+        .type   _haltproc,@function
+/* this routine is only called when the halt() routine of the RTL embedded in
+  the shared library is called */
+_haltproc:
+	.globl FPC_SHARED_LIB_EXIT
+	.type FPC_SHARED_LIB_EXIT,@function
+FPC_SHARED_LIB_EXIT:
+        call    FPC_LIB_EXIT@PLT
+	movl    $1,%eax                 /* exit syscall */
+        movq    operatingsystem_result(%rip),%rbx
+        movzwl  (%rbx),%edi
+        syscall
+        jmp     _haltproc@PLT
+	/* Do not fail linkage if argc, argv and envp are not found. */
+	.weak   operatingsystem_parameter_argc
+	.weak   operatingsystem_parameter_argv
+	.weak   operatingsystem_parameter_envp
+