aboutsummaryrefslogtreecommitdiff
path: root/sysdeps/arc/start.S
diff options
context:
space:
mode:
authorVineet Gupta <vgupta@synopsys.com>2018-10-23 12:36:32 -0700
committerVineet Gupta <vgupta@synopsys.com>2020-07-10 16:08:44 -0700
commitdd2e6ef179e1b50496ae6afc057b276a7786a78f (patch)
tree3e42a1dd632555f54983d3ee23179f277613a2cd /sysdeps/arc/start.S
parent0e7d930c4c11de896fe807f67fa1eb756c9c1e05 (diff)
downloadglibc-dd2e6ef179e1b50496ae6afc057b276a7786a78f.tar.xz
glibc-dd2e6ef179e1b50496ae6afc057b276a7786a78f.zip
ARC: startup and dynamic linking code
Code for C runtime startup and dynamic loading including PLT layout. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'sysdeps/arc/start.S')
-rw-r--r--sysdeps/arc/start.S74
1 files changed, 74 insertions, 0 deletions
diff --git a/sysdeps/arc/start.S b/sysdeps/arc/start.S
new file mode 100644
index 0000000000..3c4144bd20
--- /dev/null
+++ b/sysdeps/arc/start.S
@@ -0,0 +1,74 @@
+/* Startup code for ARC.
+ Copyright (C) 2020 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 Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 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
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library. If not, see
+ <https://www.gnu.org/licenses/>. */
+
+#define __ASSEMBLY__ 1
+#include <entry.h>
+#include <sysdep.h>
+
+#ifndef ENTRY_POINT
+# error ENTRY_POINT needs to be defined for ARC
+#endif
+
+/* When we enter this piece of code, the program stack looks like this:
+ argc argument counter (integer)
+ argv[0] program name (pointer)
+ argv[1...N] program args (pointers)
+ argv[argc-1] end of args (integer)
+ NULL
+ env[0...N] environment variables (pointers)
+ NULL. */
+
+ENTRY (ENTRY_POINT)
+
+ /* Needed to make gdb backtraces stop here. */
+ .cfi_label .Ldummy
+ cfi_undefined (blink)
+
+ mov fp, 0
+ ld_s r1, [sp] /* argc. */
+
+ mov_s r5, r0 /* rltd_fini. */
+ add_s r2, sp, 4 /* argv. */
+ and sp, sp, -8
+ mov r6, sp
+
+ /* __libc_start_main (main, argc, argv, init, fini, rtld_fini, stack_end). */
+
+#ifdef SHARED
+ ld r0, [pcl, @main@gotpc]
+ ld r3, [pcl, @__libc_csu_init@gotpc]
+ ld r4, [pcl, @__libc_csu_fini@gotpc]
+ bl __libc_start_main@plt
+#else
+ mov_s r0, main
+ mov_s r3, __libc_csu_init
+ mov r4, __libc_csu_fini
+ bl __libc_start_main
+#endif
+
+ /* Should never get here. */
+ flag 1
+END (ENTRY_POINT)
+
+/* 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