From c59c9cdfae57179e490b40e511a332cd84e745ab Mon Sep 17 00:00:00 2001 From: florian Date: Sun, 7 Jan 2007 10:04:19 +0000 Subject: [PATCH] * don't build .as with 2.1.1 on i386 * first fix to library entry code git-svn-id: trunk@5836 - --- rtl/linux/Makefile | 105 ++++++++++++++++++++------------------ rtl/linux/Makefile.fpc | 10 +++- rtl/linux/i386/si_dll.inc | 65 +++++++++++------------ 3 files changed, 96 insertions(+), 84 deletions(-) diff --git a/rtl/linux/Makefile b/rtl/linux/Makefile index 54459ca1dd..af415a87b9 100644 --- a/rtl/linux/Makefile +++ b/rtl/linux/Makefile @@ -241,8 +241,13 @@ UNIXINC=$(RTL)/unix UNITPREFIX=rtl CPU_UNITS= SYSINIT_UNITS= +LOADER=prt0 dllprt0 cprt0 gprt0 ifeq ($(CPU_TARGET),i386) -CRT21=cprt21 gprt21 +ifeq ($(findstring 2.0.,$(FPC_VERSION)),) +override LOADERS= +else +override LOADERS+=cprt21 gprt21 +endif CPU_UNITS=x86 ports cpu mmx SYSINIT_UNITS=si_prc si_c21g si_c21 si_c si_dll endif @@ -402,151 +407,151 @@ ifeq ($(FULL_TARGET),powerpc64-embedded) override TARGET_UNITS+=$(SYSTEMUNIT) $(SYSINIT_UNITS) unixtype ctypes baseunix strings objpas macpas syscall unixutil heaptrc lineinfo lnfodwrf termio unix linux initc cmem $(CPU_UNITS) crt printer linuxvcs sysutils typinfo math matrix varutils charset ucomplex getopts errors sockets gpm ipc serial terminfo dl dynlibs video mouse keyboard variants types dateutils sysconst fmtbcd cthreads classes fgl convutils stdconvs strutils rtlconsts dos objects cwstring fpcylix endif ifeq ($(FULL_TARGET),i386-linux) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),i386-go32v2) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),i386-win32) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),i386-os2) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),i386-freebsd) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),i386-beos) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),i386-netbsd) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),i386-solaris) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),i386-qnx) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),i386-netware) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),i386-openbsd) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),i386-wdosx) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),i386-darwin) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),i386-emx) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),i386-watcom) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),i386-netwlibc) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),i386-wince) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),i386-embedded) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),m68k-linux) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),m68k-freebsd) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),m68k-netbsd) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),m68k-amiga) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),m68k-atari) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),m68k-openbsd) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),m68k-palmos) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),m68k-embedded) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),powerpc-linux) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),powerpc-netbsd) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),powerpc-amiga) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),powerpc-macos) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),powerpc-darwin) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),powerpc-morphos) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),powerpc-embedded) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),sparc-linux) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),sparc-netbsd) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),sparc-solaris) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),sparc-embedded) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),x86_64-linux) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),x86_64-freebsd) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),x86_64-win64) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),x86_64-embedded) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),arm-linux) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),arm-palmos) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),arm-wince) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),arm-gba) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),arm-nds) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),arm-embedded) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),powerpc64-linux) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),powerpc64-embedded) -override TARGET_LOADERS+=prt0 dllprt0 cprt0 gprt0 $(CRT21) +override TARGET_LOADERS+=$(LOADERS) endif ifeq ($(FULL_TARGET),i386-linux) override TARGET_RSTS+=math varutils typinfo variants sysconst rtlconsts stdconvs diff --git a/rtl/linux/Makefile.fpc b/rtl/linux/Makefile.fpc index 1e323e47a6..a0029cae7e 100644 --- a/rtl/linux/Makefile.fpc +++ b/rtl/linux/Makefile.fpc @@ -6,7 +6,7 @@ main=rtl [target] -loaders=prt0 dllprt0 cprt0 gprt0 $(CRT21) +loaders=$(LOADERS) units=$(SYSTEMUNIT) $(SYSINIT_UNITS) \ unixtype ctypes baseunix strings objpas macpas syscall unixutil \ heaptrc lineinfo lnfodwrf \ @@ -58,8 +58,14 @@ UNITPREFIX=rtl CPU_UNITS= SYSINIT_UNITS= +LOADER=prt0 dllprt0 cprt0 gprt0 + ifeq ($(CPU_TARGET),i386) -CRT21=cprt21 gprt21 +ifeq ($(findstring 2.0.,$(FPC_VERSION)),) +override LOADERS= +else +override LOADERS+=cprt21 gprt21 +endif CPU_UNITS=x86 ports cpu mmx SYSINIT_UNITS=si_prc si_c21g si_c21 si_c si_dll endif diff --git a/rtl/linux/i386/si_dll.inc b/rtl/linux/i386/si_dll.inc index 94ec23c776..5059c67a2d 100644 --- a/rtl/linux/i386/si_dll.inc +++ b/rtl/linux/i386/si_dll.inc @@ -11,7 +11,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. **********************************************************************} - +{$goto on} { Linux ELF startup code for Free Pascal @@ -39,40 +39,41 @@ procedure PASCALMAIN; external name 'PASCALMAIN'; Shared library start/halt ******************************************************************************} -procedure _FPC_shared_lib_start; assembler; nostackframe; public name '_start'; -asm - pushl %ebp - movl %esp,%ebp +procedure _FPC_shared_lib_start(argc : dword;argv,envp : pointer); cdecl; public name '_start'; +begin + { we've to discuss about the use of this ;) } + asm + { Save initial stackpointer } + movl %esp,initialstkptr + end; -{$ifdef FPC_PIC} - call fpc_geteipasebx - addl $_GLOBAL_OFFSET_TABLE_,%ebx -{$endif} + operatingsystem_parameter_argc:=argc; { Copy the argument count } + operatingsystem_parameter_argv:=argv; { Copy the argument pointer } + operatingsystem_parameter_envp:=envp; { Copy the environment pointer } - movl 8(%ebp),%eax - movl 12(%ebp),%ecx - movl 16(%ebp),%edx + IsLibrary:=true; - movl %eax,operatingsystem_parameter_argc { Copy the argument count } - movl %ecx,operatingsystem_parameter_argv { Copy the argument pointer } - movl %edx,operatingsystem_parameter_envp { Copy the environment pointer } - -{$ifdef FPC_PIC} - movl ISLIBRARY@GOT(%ebx),%eax - movb $1,(%eax) -{$else} - movb $1,ISLIBRARY -{$endif} - - { Save initial stackpointer } - movl %esp,initialstkptr - - call PASCALMAIN - - leave - ret + PASCALMAIN; end; +procedure initdummy; assembler; nostackframe; +label + FPC_LIB_START; +asm +.init + .align 16 + .globl FPC_LIB_START +// .type FPC_LIB_START,@function +FPC_LIB_START: +{$ifdef FPC_PIC} + jmp _FPC_shared_lib_start@PLT +{$else FPC_PIC} + jmp _FPC_shared_lib_start +{$endif FPC_PIC} +.text +end; + + procedure _FPC_shared_lib_haltproc; assembler; nostackframe; public name '_haltproc'; asm {$ifdef FPC_PIC} @@ -83,10 +84,10 @@ asm xorl %eax,%eax incl %eax { eax=1, exit call } {$ifdef FPC_PIC} - pushl %ebx + pushl %ebx movl ExitCode@GOT(%ebx),%ebx movzwl (%ebx),%ebx -{$endif} +{$endif} int $0x80 jmp .Lhaltproc popl %ebx