mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-11-25 09:57:21 +01:00
439 lines
7.4 KiB
ActionScript
439 lines
7.4 KiB
ActionScript
#
|
|
# $Id: cprt0.as,v 1.2 2004/01/04 01:13:23 marco Exp $
|
|
# This file is part of the Free Pascal run time library.
|
|
# Copyright (c) 1999-2000 by Marco van de Voort, Michael Van Canneyt
|
|
# and Peter Vreman
|
|
# 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.
|
|
#
|
|
#**********************************************************************}
|
|
#
|
|
# NetBSD standard (shared) ELF/i386 startup code for Free Pascal
|
|
#
|
|
|
|
.file "crt0.c"
|
|
.version "01.01"
|
|
gcc2_compiled.:
|
|
.globl __progname
|
|
.section .rodata
|
|
.LC0:
|
|
.ascii "\0"
|
|
.data
|
|
.align 4
|
|
.type __progname,@object
|
|
.size __progname,4
|
|
__progname:
|
|
.long .LC0
|
|
.globl __ps_strings
|
|
.align 4
|
|
.type __ps_strings,@object
|
|
.size __ps_strings,4
|
|
__ps_strings:
|
|
.long 0
|
|
.align 4
|
|
___fpucw:
|
|
.long 0x1332
|
|
.globl ___fpc_brk_addr /* heap management */
|
|
.type ___fpc_brk_addr,@object
|
|
.size ___fpc_brk_addr,4
|
|
___fpc_brk_addr:
|
|
.long 0
|
|
|
|
#APP
|
|
.weak _DYNAMIC
|
|
|
|
.text
|
|
.align 4
|
|
.globl __start
|
|
.globl _start
|
|
_start:
|
|
__start:
|
|
pushl %ebx # ps_strings
|
|
pushl %ecx # obj
|
|
pushl %edx # cleanup
|
|
movl 12(%esp),%eax
|
|
leal 20(%esp,%eax,4),%ecx
|
|
leal 16(%esp),%edx
|
|
pushl %ecx
|
|
pushl %edx
|
|
pushl %eax
|
|
movl %eax,U_SYSTEM_ARGC
|
|
movl %edx,U_SYSTEM_ARGV
|
|
call ___start
|
|
|
|
#NO_APP
|
|
.text
|
|
.align 4
|
|
.globl ___start
|
|
.type ___start,@function
|
|
___start:
|
|
pushl %ebp
|
|
movl %esp,%ebp
|
|
pushl %edi
|
|
pushl %esi
|
|
pushl %ebx
|
|
call .L12
|
|
.L12:
|
|
popl %ebx
|
|
addl $_GLOBAL_OFFSET_TABLE_+[.-.L12],%ebx
|
|
movl 12(%ebp),%esi
|
|
movl 16(%ebp),%edx
|
|
movl 28(%ebp),%edi
|
|
movl environ@GOT(%ebx),%eax
|
|
movl %edx,(%eax)
|
|
movl %edx,U_SYSTEM_ENVP
|
|
movl __progname@GOT(%ebx),%edx
|
|
movl (%esi),%eax
|
|
movl %eax,(%edx)
|
|
testl %eax,%eax
|
|
je .L6
|
|
pushl $47
|
|
movl __progname@GOT(%ebx),%eax
|
|
pushl (%eax)
|
|
call _strrchr@PLT
|
|
movl %eax,%edx
|
|
movl __progname@GOT(%ebx),%eax
|
|
movl %edx,(%eax)
|
|
addl $8,%esp
|
|
testl %edx,%edx
|
|
jne .L7
|
|
movl __progname@GOT(%ebx),%edx
|
|
movl (%esi),%eax
|
|
movl %eax,(%edx)
|
|
jmp .L6
|
|
.align 4
|
|
.L7:
|
|
movl __progname@GOT(%ebx),%eax
|
|
incl %edx
|
|
movl %edx,(%eax)
|
|
.L6:
|
|
testl %edi,%edi
|
|
je .L9
|
|
movl __ps_strings@GOT(%ebx),%eax
|
|
movl %edi,(%eax)
|
|
.L9:
|
|
cmpl $0,_DYNAMIC@GOT(%ebx)
|
|
je .L10
|
|
pushl 24(%ebp)
|
|
pushl 20(%ebp)
|
|
call _rtld_setup@PLT
|
|
addl $8,%esp
|
|
.L10:
|
|
pushl _fini@GOT(%ebx)
|
|
call atexit@PLT
|
|
call _init@PLT
|
|
# movl environ@GOT(%ebx),%eax
|
|
# pushl (%eax)
|
|
# pushl %esi
|
|
# pushl 8(%ebp)
|
|
# call main@PLT
|
|
|
|
finit /* initialize fpu */
|
|
fwait
|
|
fldcw ___fpucw
|
|
|
|
// xorl %ebp,%ebp /* Detect main from nested */
|
|
/* procs/unwinding? */
|
|
pushl (%eax)
|
|
pushl (%esi)
|
|
pushl 8(%ebp)
|
|
call main
|
|
pushl %eax
|
|
pushl %eax
|
|
call exit@PLT
|
|
|
|
.p2align 2,0x90
|
|
.globl _haltproc
|
|
.type _haltproc,@function
|
|
|
|
_haltproc:
|
|
mov $1,%eax
|
|
movzwl U_SYSTEM_EXITCODE,%ebx
|
|
pushl %ebx
|
|
call _actualsyscall
|
|
addl $4,%esp
|
|
jmp _haltproc
|
|
|
|
_actualsyscall:
|
|
int $0x80
|
|
jb .LErrorcode
|
|
xor %ebx,%ebx
|
|
ret
|
|
.LErrorcode:
|
|
mov %eax,%ebx
|
|
mov $-1,%eax
|
|
ret
|
|
.p2align 2,0x90
|
|
|
|
|
|
.Lfe1:
|
|
.size ___start,.Lfe1-___start
|
|
.align 4
|
|
.type _strrchr,@function
|
|
_strrchr:
|
|
pushl %ebp
|
|
movl %esp,%ebp
|
|
subl $4,%esp
|
|
pushl %esi
|
|
movl 8(%ebp),%eax
|
|
movb 12(%ebp),%cl
|
|
movb %cl,-1(%ebp)
|
|
xorl %esi,%esi
|
|
.align 4
|
|
.L14:
|
|
movb (%eax),%dl
|
|
cmpb -1(%ebp),%dl
|
|
jne .L17
|
|
movl %eax,%esi
|
|
.L17:
|
|
testb %dl,%dl
|
|
je .L16
|
|
incl %eax
|
|
jmp .L14
|
|
.align 4
|
|
.L16:
|
|
movl %esi,%eax
|
|
movl -8(%ebp),%esi
|
|
leave
|
|
ret
|
|
.Lfe2:
|
|
.size _strrchr,.Lfe2-_strrchr
|
|
.section .rodata
|
|
.align 32
|
|
.LC1:
|
|
.ascii "Corrupt Obj_Entry pointer in GOT\0"
|
|
.align 32
|
|
.LC2:
|
|
.ascii "Dynamic linker version mismatch\0"
|
|
.text
|
|
.align 4
|
|
.globl _rtld_setup
|
|
.type _rtld_setup,@function
|
|
_rtld_setup:
|
|
pushl %ebp
|
|
movl %esp,%ebp
|
|
pushl %esi
|
|
pushl %ebx
|
|
call .L35
|
|
.L35:
|
|
popl %ebx
|
|
addl $_GLOBAL_OFFSET_TABLE_+[.-.L35],%ebx
|
|
movl 12(%ebp),%esi
|
|
testl %esi,%esi
|
|
je .L22
|
|
cmpl $-716130182,(%esi)
|
|
je .L21
|
|
.L22:
|
|
pushl $33
|
|
leal .LC1@GOTOFF(%ebx),%eax
|
|
pushl %eax
|
|
pushl $2
|
|
pushl $4
|
|
call __syscall@PLT
|
|
pushl $1
|
|
pushl $1
|
|
call __syscall@PLT
|
|
addl $24,%esp
|
|
.align 4
|
|
.L21:
|
|
cmpl $1,4(%esi)
|
|
je .L28
|
|
pushl $32
|
|
leal .LC2@GOTOFF(%ebx),%eax
|
|
pushl %eax
|
|
pushl $2
|
|
pushl $4
|
|
call __syscall@PLT
|
|
pushl $1
|
|
pushl $1
|
|
call __syscall@PLT
|
|
addl $24,%esp
|
|
.align 4
|
|
.L28:
|
|
pushl 8(%ebp)
|
|
call atexit@PLT
|
|
leal -8(%ebp),%esp
|
|
popl %ebx
|
|
popl %esi
|
|
leave
|
|
ret
|
|
.Lfe3:
|
|
.size _rtld_setup,.Lfe3-_rtld_setup
|
|
#APP
|
|
.weak dlopen ; dlopen = _dlopen
|
|
.weak dlclose ; dlclose = _dlclose
|
|
.weak dlsym ; dlsym = _dlsym
|
|
.weak dlerror ; dlerror = _dlerror
|
|
.weak dladdr ; dladdr = _dladdr
|
|
#NO_APP
|
|
.align 4
|
|
.globl _dlopen
|
|
.type _dlopen,@function
|
|
_dlopen:
|
|
pushl %ebp
|
|
movl %esp,%ebp
|
|
pushl %ebx
|
|
call .L40
|
|
.L40:
|
|
popl %ebx
|
|
addl $_GLOBAL_OFFSET_TABLE_+[.-.L40],%ebx
|
|
movl __mainprog_obj@GOT(%ebx),%eax
|
|
movl (%eax),%eax
|
|
testl %eax,%eax
|
|
je .L37
|
|
pushl 12(%ebp)
|
|
pushl 8(%ebp)
|
|
movl 80(%eax),%eax
|
|
call *%eax
|
|
jmp .L38
|
|
.align 4
|
|
.L37:
|
|
xorl %eax,%eax
|
|
.L38:
|
|
movl -4(%ebp),%ebx
|
|
leave
|
|
ret
|
|
.Lfe4:
|
|
.size _dlopen,.Lfe4-_dlopen
|
|
.align 4
|
|
.globl _dlclose
|
|
.type _dlclose,@function
|
|
_dlclose:
|
|
pushl %ebp
|
|
movl %esp,%ebp
|
|
pushl %ebx
|
|
call .L45
|
|
.L45:
|
|
popl %ebx
|
|
addl $_GLOBAL_OFFSET_TABLE_+[.-.L45],%ebx
|
|
movl __mainprog_obj@GOT(%ebx),%eax
|
|
movl (%eax),%eax
|
|
testl %eax,%eax
|
|
je .L42
|
|
pushl 8(%ebp)
|
|
movl 92(%eax),%eax
|
|
call *%eax
|
|
jmp .L43
|
|
.align 4
|
|
.L42:
|
|
movl $-1,%eax
|
|
.L43:
|
|
movl -4(%ebp),%ebx
|
|
leave
|
|
ret
|
|
.Lfe5:
|
|
.size _dlclose,.Lfe5-_dlclose
|
|
.align 4
|
|
.globl _dlsym
|
|
.type _dlsym,@function
|
|
_dlsym:
|
|
pushl %ebp
|
|
movl %esp,%ebp
|
|
pushl %ebx
|
|
call .L50
|
|
.L50:
|
|
popl %ebx
|
|
addl $_GLOBAL_OFFSET_TABLE_+[.-.L50],%ebx
|
|
movl __mainprog_obj@GOT(%ebx),%eax
|
|
movl (%eax),%eax
|
|
testl %eax,%eax
|
|
je .L47
|
|
pushl 12(%ebp)
|
|
pushl 8(%ebp)
|
|
movl 84(%eax),%eax
|
|
call *%eax
|
|
jmp .L48
|
|
.align 4
|
|
.L47:
|
|
xorl %eax,%eax
|
|
.L48:
|
|
movl -4(%ebp),%ebx
|
|
leave
|
|
ret
|
|
.Lfe6:
|
|
.size _dlsym,.Lfe6-_dlsym
|
|
.section .rodata
|
|
.align 32
|
|
.LC3:
|
|
.ascii "Dynamic linker interface not available\0"
|
|
.text
|
|
.align 4
|
|
.globl _dlerror
|
|
.type _dlerror,@function
|
|
_dlerror:
|
|
pushl %ebp
|
|
movl %esp,%ebp
|
|
pushl %ebx
|
|
call .L55
|
|
.L55:
|
|
popl %ebx
|
|
addl $_GLOBAL_OFFSET_TABLE_+[.-.L55],%ebx
|
|
movl __mainprog_obj@GOT(%ebx),%eax
|
|
movl (%eax),%eax
|
|
testl %eax,%eax
|
|
je .L52
|
|
movl 88(%eax),%eax
|
|
call *%eax
|
|
jmp .L53
|
|
.align 4
|
|
.L52:
|
|
leal .LC3@GOTOFF(%ebx),%eax
|
|
.L53:
|
|
movl -4(%ebp),%ebx
|
|
leave
|
|
ret
|
|
.Lfe7:
|
|
.size _dlerror,.Lfe7-_dlerror
|
|
.align 4
|
|
.globl _dladdr
|
|
.type _dladdr,@function
|
|
_dladdr:
|
|
pushl %ebp
|
|
movl %esp,%ebp
|
|
pushl %ebx
|
|
call .L60
|
|
.L60:
|
|
popl %ebx
|
|
addl $_GLOBAL_OFFSET_TABLE_+[.-.L60],%ebx
|
|
movl __mainprog_obj@GOT(%ebx),%eax
|
|
movl (%eax),%eax
|
|
testl %eax,%eax
|
|
je .L57
|
|
pushl 12(%ebp)
|
|
pushl 8(%ebp)
|
|
movl 96(%eax),%eax
|
|
call *%eax
|
|
jmp .L58
|
|
.align 4
|
|
.L57:
|
|
movl $-1,%eax
|
|
.L58:
|
|
movl -4(%ebp),%ebx
|
|
leave
|
|
ret
|
|
.Lfe8:
|
|
.size _dladdr,.Lfe8-_dladdr
|
|
.comm environ,4,4
|
|
.comm __mainprog_obj,4,4
|
|
|
|
|
|
|
|
# This section is needed for NetBSD to recognize a NetBSD binary as such.
|
|
# otherwise it will be startup in Linux emulation mode.
|
|
|
|
.section ".note.netbsd.ident","a"
|
|
.p2align 2
|
|
|
|
.long 7
|
|
.long 4
|
|
# ELF NOTE TYPE NETBSD TAG
|
|
.long 1
|
|
.ascii "NetBSD\0\0"
|
|
.long 199905
|