ARC: ldso: don't use _DYNAMIC@gotpc construct #2
[uclibc-ng.git] / ldso / ldso / arc / dl-startup.h
blobdbce2f0c9a2b3bc616bbe898b8a01b3229a95114
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 " ld r12, [pcl, _dl_skip_args@pcl] \n"
38 " add r2, pcl, _dl_fini@pcl ; finalizer \n"
40 " add2 sp, sp, r12 ; discard argv entries from stack\n"
41 " sub_s r1, r1, r12 ; adjusted argc, on stack \n"
42 " st_s r1, [sp] \n"
44 " j_s.d [r0] ; app entry point \n"
45 " mov_s r0, r2 ; ptr to finalizer _dl_fini \n"
47 ".size _start,.-_start \n"
48 ".previous \n"
52 * Get a pointer to the argv array. On many platforms this can be just
53 * the address if the first argument, on other platforms we need to
54 * do something a little more subtle here.
56 #define GET_ARGV(ARGVP, ARGS) ARGVP = ((unsigned long*) ARGS + 1)
59 * Dynamic loader bootstrapping:
60 * The only relocations that should be found are either R_ARC_RELATIVE for
61 * data relocations (.got, etc) or R_ARC_JMP_SLOT for code relocations
62 * (.plt). It is safe to assume that all of these relocations are word
63 * aligned.
64 * @RELP is the reloc entry being processed
65 * @REL is the pointer to the address we are relocating.
66 * @SYMBOL is the symbol involved in the relocation
67 * @LOAD is the load address.
70 #define PERFORM_BOOTSTRAP_RELOC(RELP,REL,SYMBOL,LOAD,SYMTAB) \
71 do { \
72 int type = ELF32_R_TYPE((RELP)->r_info); \
73 if (likely(type == R_ARC_RELATIVE)) \
74 *REL += (unsigned long) LOAD; \
75 else if (type == R_ARC_JMP_SLOT) \
76 *REL = SYMBOL; \
77 else if (type != R_ARC_NONE) \
78 _dl_exit(1); \
79 }while(0)
82 * This will go away once we have DT_RELACOUNT
84 #define ARCH_NEEDS_BOOTSTRAP_RELOCS
86 /* we dont need to spit out argc, argv etc for debugging */
87 #define NO_EARLY_SEND_STDERR 1