aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/cris/elf
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2001-04-10 03:10:20 +0000
committerUlrich Drepper <drepper@redhat.com>2001-04-10 03:10:20 +0000
commit1dc843f70a0b231da05b0acd238d76968aec279b (patch)
tree024ac56d734d3cd28ab061b63f82c69d16907640 /sysdeps/cris/elf
parentc44a663dca2b0e3f3ac9e9e010bc83d58912803e (diff)
downloadglibc-1dc843f70a0b231da05b0acd238d76968aec279b.tar
glibc-1dc843f70a0b231da05b0acd238d76968aec279b.tar.gz
glibc-1dc843f70a0b231da05b0acd238d76968aec279b.tar.bz2
glibc-1dc843f70a0b231da05b0acd238d76968aec279b.zip
Update.
2001-04-09 Ulrich Drepper <drepper@redhat.com> * libio/Makefile (distribute): Add fd_to_filename.h.
Diffstat (limited to 'sysdeps/cris/elf')
-rw-r--r--sysdeps/cris/elf/start.S123
1 files changed, 123 insertions, 0 deletions
diff --git a/sysdeps/cris/elf/start.S b/sysdeps/cris/elf/start.S
new file mode 100644
index 0000000000..f6336d2dab
--- /dev/null
+++ b/sysdeps/cris/elf/start.S
@@ -0,0 +1,123 @@
+/* Startup code compliant to the ELF CRIS ABI (to-be-written).
+ Copyright (C) 2001 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library 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. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <sysdep.h>
+
+/* This is the canonical entry point, usually the first thing in the text
+ segment. When the entry point runs, most registers' values are
+ unspecified, except for:
+
+ R10 Contains a function pointer to be registered with `atexit'.
+ This is how the dynamic linker arranges to have DT_FINI
+ functions called for shared libraries that have been loaded
+ before this code runs.
+
+ SP The stack contains the arguments and environment:
+ [SP] argc
+ [SP+4] argv[0]
+ ...
+ [SP+4*argc] NULL
+ [SP+4*(argc+1)] envp[0]
+ ...
+ NULL
+*/
+
+ .syntax no_register_prefix
+
+ .text
+ .globl _start
+_start:
+ /* Clear the frame pointer, to mark the outermost frame. */
+ moveq 0,r8
+
+ /* Move the shared library termination function to the right place
+ for __libc_main. */
+ move.d r10,r9
+
+ /* Extract the arguments as encoded on the stack and set up the
+ arguments for `main': argc, argv. envp will be determined
+ later in __libc_start_main. */
+
+ /* Get the argument count. */
+ move.d [sp],r11
+
+ /* Store the stack pointer as end of stack. We overwrite
+ the incoming argc. */
+ move.d sp,[sp]
+
+ /* The argument vector starts just after the argument count. */
+ move.d sp,r12
+ addq 4,r12
+
+ /* There are seven arguments to __libc_start_main:
+ r10: main - Address of it.
+ r11: argc
+ r12: argv
+ r13: init - Function to call.
+
+ [sp]: fini - Function to register with atexit.
+ [sp+4]: rtld_fini - Another function to register with atexit.
+ [sp+8]: stack_end - Top of stack (actually same as argv).
+
+ The last two are passed on stack. */
+
+ /* Store the fini function coming from the dynamic loader. */
+ push r9
+
+ /* Get the addresses of our own entry points to `.fini' and
+ `.init'. */
+
+#ifdef __PIC__
+ /* If for some reason this program is compiled as PIC, set up R0. */
+ move.d pc,r0
+ sub.d .:GOTOFF,r0
+
+ move.d _init:PLTG,r13
+ add.d r0,r13
+ move.d _fini:PLTG,r9
+ add.d r0,r9
+ move.d main:PLTG,r10
+ add.d r0,r10
+#else
+ move.d _init,r13
+ move.d _fini,r9
+ move.d main,r10
+#endif
+ push r9
+
+ /* Call the user's main function, and exit with its value. But
+ let the libc call main. */
+ PLTCALL (__libc_start_main)
+
+ /* Crash if somehow `exit' does return. We have at least 8192
+ invalid addresses to choose from. */
+ test.d [6502]
+
+ /* Stop the unstoppable. */
+0:
+ ba 0b
+ nop
+
+/* Define a symbol for the first piece of initialized data. */
+ .data
+ .globl __data_start
+__data_start:
+ .long 0
+ .weak data_start
+ data_start = __data_start