summaryrefslogtreecommitdiff
path: root/sysdeps/alpha/elf/crtbegin.S
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/alpha/elf/crtbegin.S')
-rw-r--r--sysdeps/alpha/elf/crtbegin.S91
1 files changed, 91 insertions, 0 deletions
diff --git a/sysdeps/alpha/elf/crtbegin.S b/sysdeps/alpha/elf/crtbegin.S
new file mode 100644
index 0000000000..f75673e35f
--- /dev/null
+++ b/sysdeps/alpha/elf/crtbegin.S
@@ -0,0 +1,91 @@
+/* Copyright (C) 1996 Free Software Foundation, Inc.
+ Contributed by Richard Henderson (rth@tamu.edu)
+
+ 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. */
+
+
+/*
+ * Heads of the constructor/destructor lists.
+ */
+
+/* The __*TOR_LIST__ symbols are not global because when this file is used
+ in a shared library, we do not want the symbol to fall over to the
+ application's lists. */
+
+.section .ctors,"aw"
+
+ .align 3
+__CTOR_LIST__:
+ .quad -1
+
+.section .dtors,"aw"
+
+ .align 3
+__DTOR_LIST__:
+ .quad -1
+
+
+/*
+ * Fragment of the ELF _fini routine that invokes our dtor cleanup.
+ */
+
+.section .fini,"ax"
+
+ /* Since the bits of the _fini function are spread across many
+ object files, each potentially with its own GP, we must
+ assume we need to load ours. Further, our .fini section
+ can easily be more than 4MB away from our .text bits so we
+ can't use bsr. */
+
+ br $gp,1f
+1: ldgp $gp,0($gp)
+ jsr $26,__do_global_dtors_aux
+
+ /* Must match the alignment we got from crti.o else we get
+ zero-filled holes in our _fini function and thense SIGILL. */
+ .align 3
+
+/*
+ * Invoke our destructors in order.
+ */
+
+.text
+
+ .align 3
+ .ent __do_global_dtors_aux
+
+__do_global_dtors_aux:
+ .frame $sp,16,$26,0
+ /* GP already loaded in .fini */
+ lda $sp,-16($sp)
+ stq $9,8($sp)
+ stq $26,0($sp)
+ .mask (1<<26)|(1<<9), -16
+ .prologue 1
+
+ lda $9,__DTOR_LIST__
+ br 1f
+0: jsr $26,($27)
+1: ldq $27,8($9)
+ addq $9,8,$9
+ bne $27,0b
+
+ ldq $26,0($sp)
+ ldq $9,8($sp)
+ lda $sp,16($sp)
+ ret
+
+ .end __do_global_dtors_aux