idlebox / 2006 / SDIOS06 / sdios06 / src / ia32-crt0.S.html (Download File)
//
// File:  src/test/ia32-crt0.S
//
// Description: Simple startupcode
//

.text

        .global _start
_start:
        /* dont' load the stack pointer for our small stack any more! */

        /* save environment given from elfexec. the third param is at -8 because
        there is no return address on the stack. */
    mov 8(%esp), %ebx
        mov %ebx, environ
       
        /* initialize libc */
        call __libc_init

        /* Start the constructors of global objects (supporting C++) */
    leal __section_ctors_start, %ebx
2:
        cmp $__section_ctors_end, %ebx
    je 3f
        call *(%ebx)
        add $4,%ebx
        jmp 2b
3:

        /* push a return address to catch main ending (should never happen) */
        pushl   $___return_from_main
        jmp     main /* call main() */

___return_from_main:
        pushl   %eax                            /* save return code as a parameter to exit */
               
        /* run the destructors of global objects (supporting C++) */
        leal __section_dtors_start, %ebx
5:
        cmp $__section_dtors_end, %ebx
        je 6f
        call *(%ebx)
        add $4,%ebx
        jmp 5b
6:

        /* Kill ourself */
        call exit

        /* Enter kdebug (this is what never should happen)
        WARNING: only L4Ka::Pistachio KDebug enter */
        int     $3
        jmp     8f
        mov     $7f, %eax
        .section .rodata
7:      .asciz "***System stopped***"
        .previous
8:      jmp 6b /* Loop forever on the enter_kdebug */
       
.data
        /* save envp pointer to environment here */
        .global environ
environ:
        .long 0
               
        /* symbols which are expected to exist */
        .global __heap_start_ptr

__heap_start_ptr:
        .long __elf_end
RSS 2.0 Weblog Feed Atom 1.0 Weblog Feed Valid XHTML 1.1 Valid CSS (2.1)