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

git-svn-id: trunk@19276 -
This commit is contained in:
pierre 2011-09-28 23:07:39 +00:00
parent d5b8210359
commit 33604a6a49
5 changed files with 261 additions and 65 deletions

2
.gitattributes vendored
View File

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

View File

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

View File

@ -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
rtl/freebsd/i386/dllprt0.as Normal file
View File

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

View File

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