Browse Source

* Rewrite initialization code for i386-android. i386-android works.

git-svn-id: branches/targetandroid@23447 -
yury 12 years ago
parent
commit
3ed10a6936
2 changed files with 83 additions and 113 deletions
  1. 36 43
      rtl/android/i386/dllprt0.as
  2. 47 70
      rtl/android/i386/prt0.as

+ 36 - 43
rtl/android/i386/dllprt0.as

@@ -1,6 +1,7 @@
 #
 #
 #   This file is part of the Free Pascal run time library.
 #   This file is part of the Free Pascal run time library.
-#   Copyright (c) 2001 by Peter Vreman
+#   Copyright (c) 2013 by Yury Sidorov and other
+#   members of the Free Pascal development team.
 #
 #
 #   See the file COPYING.FPC, included in this distribution,
 #   See the file COPYING.FPC, included in this distribution,
 #   for details about the copyright.
 #   for details about the copyright.
@@ -14,66 +15,58 @@
 # Linux ELF shared library startup code for Free Pascal
 # Linux ELF shared library startup code for Free Pascal
 #
 #
 
 
-        .file   "dllprt0.as"
-        .text
-        .globl  _startlib
-        .type   _startlib,@function
-_startlib:
+.file   "dllprt0.as"
+.text
         .globl  FPC_SHARED_LIB_START
         .globl  FPC_SHARED_LIB_START
         .type   FPC_SHARED_LIB_START,@function
         .type   FPC_SHARED_LIB_START,@function
 FPC_SHARED_LIB_START:
 FPC_SHARED_LIB_START:
         pushl   %ebp
         pushl   %ebp
         movl    %esp,%ebp
         movl    %esp,%ebp
-
-        movl    8(%ebp),%eax
-        movl    12(%ebp),%ecx
-        movl    16(%ebp),%edx
-
-        movl    %edx,operatingsystem_parameter_envp    /* Move the environment pointer */
-        movl    %eax,operatingsystem_parameter_argc    /* Move the argument counter    */
-        movl    %ecx,operatingsystem_parameter_argv    /* Move the argument pointer    */
-
-        movb    $1,operatingsystem_islibrary
+        /* Align the stack to a 16 byte boundary */
+        andl $~15, %esp
 
 
         /* Save initial stackpointer */
         /* Save initial stackpointer */
         movl    %esp,__stkptr
         movl    %esp,__stkptr
 
 
-        call    PASCALMAIN
+        /* Get environment info from libc */
+        movl    environ,%eax
+        movl    %eax,operatingsystem_parameter_envp
 
 
+        /* Register exit handler. It is called only when the main process terminates */
+        leal    FPC_LIB_EXIT,%eax
+        pushl   %eax
+        call    atexit
+        addl    $4,%esp
+
+        /* call main and exit normally */
+        call    PASCALMAIN
         leave
         leave
         ret
         ret
 
 
+/* --------------------------------------------------------- */
         .globl  _haltproc
         .globl  _haltproc
         .type   _haltproc,@function
         .type   _haltproc,@function
 _haltproc:
 _haltproc:
-_haltproc2:             # GAS <= 2.15 bug: generates larger jump if a label is exported
-        .globl  FPC_SHARED_LIB_EXIT
-        .type   FPC_SHARED_LIB_EXIT,@function
-FPC_SHARED_LIB_EXIT:
-	call	lib_exit
-        xorl    %eax,%eax
-        incl    %eax                    /* eax=1, exit call */
         movzwl  operatingsystem_result,%ebx
         movzwl  operatingsystem_result,%ebx
-        int     $0x80
-        jmp     _haltproc2
-
-.bss
-        .type   __stkptr,@object
-        .size   __stkptr,4
-        .global __stkptr
-__stkptr:
-        .skip   4
-
-        .type operatingsystem_parameters,@object
-        .size operatingsystem_parameters,12
-operatingsystem_parameters:
-        .skip 3*4
+        pushl   %ebx
+        /* Call libc exit() */
+        call    exit
 
 
-        .global operatingsystem_parameter_envp
+/* --------------------------------------------------------- */
+.data
+        .comm __stkptr,4
+        .comm operatingsystem_parameter_envp,4
+operatingsystem_parameter_argc:
         .global operatingsystem_parameter_argc
         .global operatingsystem_parameter_argc
+        .long 1
+operatingsystem_parameter_argv:
         .global operatingsystem_parameter_argv
         .global operatingsystem_parameter_argv
-        .set operatingsystem_parameter_envp,operatingsystem_parameters+0
-        .set operatingsystem_parameter_argc,operatingsystem_parameters+4
-        .set operatingsystem_parameter_argv,operatingsystem_parameters+8
+        .long EmptyCmdLine
+EmptyCmdLine:
+        .long EmptyCmdStr
+EmptyCmdStr:
+        .ascii "\0"
 
 
-.section .note.GNU-stack,"",%progbits
+/* --------------------------------------------------------- */
+      	.section .init_array, "aw"
+	      .long FPC_SHARED_LIB_START

+ 47 - 70
rtl/android/i386/prt0.as

@@ -1,7 +1,7 @@
 #
 #
 #   This file is part of the Free Pascal run time library.
 #   This file is part of the Free Pascal run time library.
-#   Copyright (c) 1999-2004 by Michael Van Canneyt, Peter Vreman,
-#   & Daniel Mantione, members of the Free Pascal development team.
+#   Copyright (c) 2013 by Yury Sidorov and other
+#   members of the Free Pascal development team.
 #
 #
 #   See the file COPYING.FPC, included in this distribution,
 #   See the file COPYING.FPC, included in this distribution,
 #   for details about the copyright.
 #   for details about the copyright.
@@ -14,11 +14,6 @@
 #
 #
 # Linux ELF startup code for Free Pascal
 # Linux ELF startup code for Free Pascal
 #
 #
-# The code in this file is the default startup code, it is used unless
-# libc is linked in, profiling is enabled or you are compiling a shared
-# library.
-#
-#
 # Stack layout at program start:
 # Stack layout at program start:
 #
 #
 #         nil
 #         nil
@@ -36,77 +31,59 @@
 #         argc <--- esp
 #         argc <--- esp
 #
 #
 
 
+/*
+   In our entry point we should save pointers to cmd line arguments
+   and environment vars, then pass control to libc startup code.
+   It will call "PASCALMAIN" via alias "main".
+*/
         .file   "prt0.as"
         .file   "prt0.as"
-        .text
-        .globl  _start
-        .type   _start,@function
-_start:
-        /* First locate the start of the environment variables */
-        popl    %ecx                    /* Get argc in ecx */
-        movl    %esp,%ebx               /* Esp now points to the arguments */
-        leal    4(%esp,%ecx,4),%eax     /* The start of the environment is: esp+4*eax+4 */
-        andl    $0xfffffff8,%esp        /* Align stack */
-
-        leal    operatingsystem_parameters,%edi
-        stosl   /* Move the environment pointer */
-        xchg    %ecx,%eax
-        stosl   /* Move the argument counter    */
-        xchg    %ebx,%eax
-        stosl   /* Move the argument pointer    */
-
-
-        fninit                           /* initialize fpu */
-        fwait
-        fldcw   ___fpucw
-
-#        /* Initialize gs for thread local storage */
-#        movw    %ds,%ax
-#        movw    %ax,%gs
-
+.text
+        .align 4
+        .globl _fpc_start
+        .type _fpc_start,@function
+_fpc_start:
+        /* Clear the frame pointer since this is the outermost frame.  */
+        xorl    %ebp,%ebp
         /* Save initial stackpointer */
         /* Save initial stackpointer */
         movl    %esp,__stkptr
         movl    %esp,__stkptr
+        /* First locate the start of the environment variables */
+        /* Get argc in ecx */
+        movl    (%esp),%ecx
+        /* Save argc */
+        movl    %ecx,operatingsystem_parameter_argc
+        /* Get argv pointer in ebx */
+        leal    4(%esp),%ebx
+        /* Save argv */
+        movl    %ebx,operatingsystem_parameter_argv
+        /* The start of the environment is: esp+ecx*4+12 */
+        leal    12(%esp,%ecx,4),%eax
+        /* Save envp */
+        movl    %eax,operatingsystem_parameter_envp
+        
+        /* Finally go to libc startup code. It will call "PASCALMAIN" via alias "main" */
+        jmp _start
 
 
-        xorl    %ebp,%ebp
-        call    PASCALMAIN
-
+/* --------------------------------------------------------- */
         .globl  _haltproc
         .globl  _haltproc
         .type   _haltproc,@function
         .type   _haltproc,@function
 _haltproc:
 _haltproc:
-_haltproc2:             # GAS <= 2.15 bug: generates larger jump if a label is exported
-        movl    $252,%eax                /* exit_group */
-        movzwl  operatingsystem_result,%ebx
-        int     $0x80
-        movl    $1,%eax                /* exit */
         movzwl  operatingsystem_result,%ebx
         movzwl  operatingsystem_result,%ebx
-        int     $0x80
-        jmp     _haltproc2
-
+        pushl   %ebx
+        /* Call libc exit() */
+        call    exit
+        
+/* --------------------------------------------------------- */
 .data
 .data
-        .type   __fpucw,@object
-        .size   __fpucw,4
-        .global __fpucw
-___fpucw:
-        .long   0x1332
+/* Define a symbol for the first piece of initialized data.  */
+        .globl __data_start
+__data_start:
+        .long 0
+        .weak data_start
+        data_start = __data_start
 
 
+/* --------------------------------------------------------- */
 .bss
 .bss
-        .type   __stkptr,@object
-        .size   __stkptr,4
-        .global __stkptr
-__stkptr:
-        .skip   4
-
-        .type operatingsystem_parameters,@object
-        .size operatingsystem_parameters,12
-operatingsystem_parameters:
-        .skip 3*4
-
-        .global operatingsystem_parameter_envp
-        .global operatingsystem_parameter_argc
-        .global operatingsystem_parameter_argv
-        .set operatingsystem_parameter_envp,operatingsystem_parameters+0
-        .set operatingsystem_parameter_argc,operatingsystem_parameters+4
-        .set operatingsystem_parameter_argv,operatingsystem_parameters+8
-
-//.section .threadvar,"aw",@nobits
-        .comm   ___fpc_threadvar_offset,4
-.section .note.GNU-stack,"",%progbits
+        .comm __stkptr,4
+        .comm operatingsystem_parameter_envp,4
+        .comm operatingsystem_parameter_argc,4
+        .comm operatingsystem_parameter_argv,4