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