|
@@ -0,0 +1,230 @@
|
|
|
+{
|
|
|
+ This file is part of the Free Pascal run time library.
|
|
|
+ Copyright (c) 2005 by Michael Van Canneyt, Peter Vreman,
|
|
|
+ & Daniel Mantione, 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/x86 ELF startup code for Free Pascal
|
|
|
+
|
|
|
+ Stack layout at program start:
|
|
|
+
|
|
|
+ nil
|
|
|
+ envn
|
|
|
+ ....
|
|
|
+ .... ENVIRONMENT VARIABLES
|
|
|
+ env1
|
|
|
+ env0
|
|
|
+ nil
|
|
|
+ argn
|
|
|
+ ....
|
|
|
+ .... COMMAND LINE OPTIONS
|
|
|
+ arg1
|
|
|
+ arg0
|
|
|
+ argc <--- esp
|
|
|
+}
|
|
|
+
|
|
|
+var
|
|
|
+ libc_fpc_ret, libc_fpc_ret_ebx, libc_fpc_ret_ebp: ptrint; { return address to libc }
|
|
|
+ __progname : pchar; cvar;
|
|
|
+
|
|
|
+procedure get_rtld_cleanup; external name 'get_rtld_cleanup';
|
|
|
+procedure atexit; external name 'atexit';
|
|
|
+procedure init_tls; external name '_init_tls';
|
|
|
+procedure libc_start_main; external name '__libc_start_main';
|
|
|
+
|
|
|
+procedure PASCALMAIN; external name 'PASCALMAIN';
|
|
|
+
|
|
|
+var progname : pchar cvar; // = '';
|
|
|
+ __fpucw : word; cvar; // = 0x1332;
|
|
|
+
|
|
|
+{******************************************************************************
|
|
|
+ libc 2.1 library start/halt
|
|
|
+ ******************************************************************************}
|
|
|
+{$asmmode ATT}
|
|
|
+
|
|
|
+procedure _FPC_libc_start; assembler; nostackframe; public name '_start';
|
|
|
+asm
|
|
|
+ pushl %ebp
|
|
|
+ movl %esp,%ebp
|
|
|
+ subl $40,%esp
|
|
|
+ call get_rtld_cleanup
|
|
|
+ movl %eax,%edx
|
|
|
+
|
|
|
+ pushl %edi
|
|
|
+ pushl %esi
|
|
|
+ pushl %ebx
|
|
|
+#APP
|
|
|
+ movl %edx,%edx
|
|
|
+#NO_APP
|
|
|
+ leal 8(%ebp),%edi
|
|
|
+ movl %edi,operatingsystem_parameter_argv
|
|
|
+ mov -4(%edi),%eax
|
|
|
+ movl %eax,operatingsystem_parameter_argc
|
|
|
+ movl 4(%ebp),%ebx
|
|
|
+ leal 12(%ebp,%ebx,4),%esi
|
|
|
+ movl %esi,operatingsystem_parameter_envp
|
|
|
+ movl %esi,environ
|
|
|
+ testl %ebx,%ebx
|
|
|
+ jle .L2
|
|
|
+ movl 8(%ebp),%eax
|
|
|
+ testl %eax,%eax
|
|
|
+ je .L2
|
|
|
+ movl %eax,__progname
|
|
|
+ cmpb $0,(%eax)
|
|
|
+ je .L2
|
|
|
+ .p2align 2,0x90
|
|
|
+.L6:
|
|
|
+ cmpb $47,(%eax)
|
|
|
+ jne .L5
|
|
|
+ leal 1(%eax),%ecx
|
|
|
+ movl %ecx,__progname
|
|
|
+.L5:
|
|
|
+ incl %eax
|
|
|
+ cmpb $0,(%eax)
|
|
|
+ jne .L6
|
|
|
+.L2:
|
|
|
+ movl $_DYNAMIC,%eax
|
|
|
+ testl %eax,%eax
|
|
|
+ je .LTLS
|
|
|
+ pushl %edx
|
|
|
+ call atexit
|
|
|
+ addl $4,%esp
|
|
|
+.L9:
|
|
|
+ pushl $_fini
|
|
|
+ call atexit
|
|
|
+ call _init
|
|
|
+# pushl %esi
|
|
|
+# pushl %edi
|
|
|
+# pushl %ebx
|
|
|
+# call main
|
|
|
+# pushl %eax
|
|
|
+# call exit
|
|
|
+
|
|
|
+
|
|
|
+ finit /* initialize fpu */
|
|
|
+ fwait
|
|
|
+ fldcw ___fpucw
|
|
|
+
|
|
|
+ xorl %ebp,%ebp
|
|
|
+
|
|
|
+ call main
|
|
|
+ pushl %eax
|
|
|
+ jmp _haltproc
|
|
|
+.LTLS:
|
|
|
+ call _init_tls
|
|
|
+ jmp .L9
|
|
|
+get_rtld_cleanup:
|
|
|
+ pushl %ebp
|
|
|
+ movl %esp, %ebp
|
|
|
+ subl $4, %esp
|
|
|
+#APP
|
|
|
+ movl %edx,-4(%ebp)
|
|
|
+#NO_APP
|
|
|
+ movl -4(%ebp), %eax
|
|
|
+ leave
|
|
|
+ ret
|
|
|
+end;
|
|
|
+
|
|
|
+procedure _FPC_libc_haltproc; assembler; nostackframe; public name '_haltproc';
|
|
|
+asm
|
|
|
+ mov $1,%eax
|
|
|
+ movzwl operatingsystem_result,%ebx
|
|
|
+ pushl %ebx
|
|
|
+ call .Lactualsyscall
|
|
|
+ addl $4,%esp
|
|
|
+ jmp _haltproc
|
|
|
+
|
|
|
+.Lactualsyscall:
|
|
|
+ int $0x80
|
|
|
+ jb .LErrorcode
|
|
|
+ xor %ebx,%ebx
|
|
|
+ ret
|
|
|
+.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
|
|
|
+
|
|
|
+.LErrorcode:
|
|
|
+ mov %eax,%ebx
|
|
|
+ mov $-1,%eax
|
|
|
+end;
|
|
|
+
|
|
|
+
|
|
|
+ .file "cprt0.as"
|
|
|
+ .ident "FreePascal 2.2.x series dynlinked"
|
|
|
+
|
|
|
+ .section .rodata.str1.1,"aMS",@progbits,1
|
|
|
+.LC0:
|
|
|
+ .string ""
|
|
|
+ .data
|
|
|
+ .p2align 2
|
|
|
+ .globl __progname
|
|
|
+ .type __progname,@object
|
|
|
+ .size __progname,4
|
|
|
+__progname:
|
|
|
+ .long .LC0
|
|
|
+ .text
|
|
|
+ .p2align 2,,3
|
|
|
+ .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
|
|
|
+___fpc_brk_addr:
|
|
|
+ .long 0
|
|
|
+
|
|
|
+ .text
|
|
|
+ .p2align 4,,15
|
|
|
+.globl _start
|
|
|
+ .type _start,@function
|
|
|
+_start:
|
|
|
+
|
|
|
+ .p2align 2,0x90
|
|
|
+.Lfe1:
|
|
|
+ .size _start,.Lfe1-_start
|
|
|
+ .comm environ,4,4
|
|
|
+ .p2align 4,,15
|
|
|
+ .type get_rtld_cleanup, @function
|
|
|
+
|
|
|
+ .weak _DYNAMIC
|
|
|
+ .ident "GCC: (GNU) 3.4.2 - FPC: 2.2.0"
|
|
|
+
|
|
|
+.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
|