ARC: Conditionalise certain relocations as provided by TLS tools only
[uclibc-ng.git] / ldso / ldso / arc / dl-startup.h
blobef89b5317216b6a805b0d48f12e60bfa7ebfe07b
1 /*
2 * Copyright (C) 2013 Synopsys, Inc. (www.synopsys.com)
4 * Licensed under the LGPL v2.1 or later, see the file COPYING.LIB in this tarball.
5 */
7 /*
8 * vineetg: Refactoring/cleanup of loader entry point
9 * Removed 6 useless insns
10 * Joern Improved it even further:
11 * -better insn scheduling
12 * -no need for conditional code for _dl_skip_args
13 * -use of assembler .&2 expressions vs. @gotpc refs (avoids need for GP)
15 * What this code does:
16 * -ldso starts execution here when kernel returns from execve()
17 * -calls into generic ldso entry point _dl_start( )
18 * -optionally adjusts argc for executable if exec passed as cmd
19 * -calls into app main with address of finaliser
21 __asm__(
22 ".section .text \n"
23 ".align 4 \n"
24 ".global _start \n"
25 ".hidden _start \n"
26 ".type _start,@function \n"
28 "_start: \n"
29 " ; ldso entry point, returns app entry point \n"
30 " bl.d _dl_start \n"
31 " mov_s r0, sp ; pass ptr to aux vector tbl \n"
33 " ; If ldso ran as cmd with executable file nm as arg \n"
34 " ; skip the extra args calc by dl_start() \n"
35 " ld_s r1, [sp] ; orig argc from aux-vec Tbl \n"
37 #ifdef __UCLIBC_HAS_THREADS_NATIVE__
38 " ld r12, [pcl, _dl_skip_args@pcl] \n"
40 " add r2, pcl, _dl_fini@pcl ; finalizer \n"
41 #else
42 " add r12, pcl, _dl_skip_args-.+(.&2) \n"
43 " ld r12, [r12] \n"
44 " add r2, pcl, _dl_fini-.+(.&2) ; finalizer \n"
45 #endif
47 " add2 sp, sp, r12 ; discard argv entries from stack\n"
48 " sub_s r1, r1, r12 ; adjusted argc, on stack \n"
49 " st_s r1, [sp] \n"
51 " j_s.d [r0] ; app entry point \n"
52 " mov_s r0, r2 ; ptr to finalizer _dl_fini \n"
54 ".size _start,.-_start \n"
55 ".previous \n"
59 * Get a pointer to the argv array. On many platforms this can be just
60 * the address if the first argument, on other platforms we need to
61 * do something a little more subtle here.
63 #define GET_ARGV(ARGVP, ARGS) ARGVP = ((unsigned long*) ARGS + 1)
66 * Dynamic loader bootstrapping:
67 * Since we don't modify text at runtime, these can only be data relos
68 * (so safe to assume that they are word aligned).
69 * And also they HAVE to be RELATIVE relos only
70 * @RELP is the relo entry being processed
71 * @REL is the pointer to the address we are relocating.
72 * @SYMBOL is the symbol involved in the relocation
73 * @LOAD is the load address.
76 #define PERFORM_BOOTSTRAP_RELOC(RELP,REL,SYMBOL,LOAD,SYMTAB) \
77 do { \
78 int type = ELF32_R_TYPE((RELP)->r_info); \
79 if (likely(type == R_ARC_RELATIVE)) \
80 *REL += (unsigned long) LOAD; \
81 else \
82 _dl_exit(1); \
83 }while(0)
86 * This will go away once we have DT_RELACOUNT
88 #define ARCH_NEEDS_BOOTSTRAP_RELOCS
90 /* we dont need to spit out argc, argv etc for debugging */
91 #define NO_EARLY_SEND_STDERR 1