summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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