diff options
-rw-r--r-- | libc/sysdeps/linux/x86_64/crt1.S (renamed from libc/sysdeps/linux/x86_64/crt0.S) | 86 |
1 files changed, 24 insertions, 62 deletions
diff --git a/libc/sysdeps/linux/x86_64/crt0.S b/libc/sysdeps/linux/x86_64/crt1.S index fa08278d9..04cf691ef 100644 --- a/libc/sysdeps/linux/x86_64/crt0.S +++ b/libc/sysdeps/linux/x86_64/crt1.S @@ -1,5 +1,5 @@ /* Startup code compliant to the ELF x86-64 ABI. - Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + Copyright (C) 2001, 2002, 2003, 2005 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Andreas Jaeger <aj@suse.de>, 2001. @@ -59,24 +59,25 @@ #include <features.h> .text - .global _start - .type _start,%function -#if defined L_crt0 || defined L_Scrt0 || ! defined __UCLIBC_CTOR_DTOR__ - .type __uClibc_main,%function +.global _start +.type _start,@function +#if defined(__UCLIBC_CTOR_DTOR__) +.type _init,@function +.type _fini,@function #else - .weak _init - .weak _fini - .type __uClibc_start_main,%function +.weak _init +.weak _fini #endif +.type __uClibc_main,@function /* Stick in a dummy reference to main(), so that if an application * is linking when the main() function is in a static library (.a) * we can be sure that main() actually gets linked in */ - .type main,%function +.type main,@function _start: /* Clear the frame pointer. The ABI suggests this be done, to mark the outermost frame obviously. */ - xorq %rbp, %rbp + xorl %ebp, %ebp /* Extract the arguments as encoded on the stack and set up the arguments for __libc_start_main (int (*main) (int, char **, char **), @@ -92,8 +93,6 @@ _start: rtld_fini: %r9 stack_end: stack. */ -#if 0 - /* glibc */ movq %rdx, %r9 /* Address of the shared library termination function. */ popq %rsi /* Pop the argument count. */ movq %rsp, %rdx /* argv starts just at the current stack top. */ @@ -101,16 +100,7 @@ _start: addq $8, %rbx shl $0x3, %rbx /* envp *= 8 */ addq %rdx, %rbx /* envp += argv */ -#else - /* uclibc */ - movq %rdx, %r9 /* Address of the shared library termination function. */ - popq %rdi /* Pop the argument count. */ - movq %rsp, %rsi /* argv starts just at the current stack top. */ - movq %rdi, %rdx /* now we calc envp ... envp = argc */ - addq $8, %rdx - shl $0x3, %rdx /* envp *= 8 */ - addq %rsi, %rdx /* envp += argv */ -#endif + /* Align the stack to a 16 byte boundary to follow the ABI. */ andq $~15, %rsp @@ -120,53 +110,25 @@ _start: which grow downwards). */ pushq %rsp + /* Give address for main() */ + movq $main, %rdi + + /* setup init/fini address */ + movq $_init, %rcx + movq $_fini, %r8 + /************** * START TODO */ -#if defined L_Scrt0 || defined L_Scrt1 +#if defined(L_Scrt1) call .L0 .L0: popq %rbx addq $_GLOBAL_OFFSET_TABLE_+[.-.L0],%rbx -#endif - -#if (defined L_crt1 || defined L_Scrt1) && defined __UCLIBC_CTOR_DTOR__ - /* Push .init and .fini arguments to __uClibc_start_main() on the stack */ -#ifdef L_Scrt1 - pushl _fini@GOT(%rip) - pushl _init@GOT(%rip) -#else - pushl $_fini - pushl $_init -#endif - /* Push envp, argc, and argc arguments to __uClibc_start_main() on the stack */ -#if 0 - pushq %rdx /* Environment pointer */ - pushq %rsi /* Argument pointer */ - pushq %rdi /* And the argument count */ -#endif - - /* Ok, now run uClibc's main() -- shouldn't return */ -#ifdef L_Scrt1 - call *__uClibc_start_main@GOT(%rip) -#else - call __uClibc_start_main -#endif -#else - - /* Push envp, argc, and argc arguments to __uClibc_start_main() on the stack */ -#if 0 - pushq %rdx /* Environment pointer */ - pushq %rsi /* Argument pointer */ - pushq %rdi /* And the argument count */ -#endif - -#ifdef L_Scrt0 call *__uClibc_main@GOT(%rip) #else call __uClibc_main #endif -#endif /* END TODO * ************/ @@ -174,9 +136,9 @@ _start: .size _start,.-_start /* Define a symbol for the first piece of initialized data. */ - .data - .globl __data_start +.data +.globl __data_start __data_start: - .long 0 - .weak data_start +.long 0 +.weak data_start data_start = __data_start |