123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438 |
- #
- # $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
|