Browse Source

* don't build .as with 2.1.1 on i386
* first fix to library entry code

git-svn-id: trunk@5836 -

florian 18 years ago
parent
commit
c59c9cdfae
3 changed files with 94 additions and 82 deletions
  1. 55 50
      rtl/linux/Makefile
  2. 8 2
      rtl/linux/Makefile.fpc
  3. 31 30
      rtl/linux/i386/si_dll.inc

+ 55 - 50
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

+ 8 - 2
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

+ 31 - 30
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 }
+  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}
-  movl    ISLIBRARY@GOT(%ebx),%eax
-  movb    $1,(%eax)
-{$else}
-  movb    $1,ISLIBRARY
-{$endif}  
-
-  { Save initial stackpointer }
-  movl    %esp,initialstkptr
-
-  call    PASCALMAIN
-
-  leave
-  ret
+  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