OSDN Git Service

832c3528b7008db2bb872eca28ff0eda4a1874ea
[uclinux-h8/uClibc.git] / ldso / ldso / cris / dl-startup.h
1 /*
2  * Architecture specific code used by dl-startup.c
3  */
4
5 /* This code fixes the stack pointer so that the dynamic linker
6  * can find argc, argv and auxvt (Auxillary Vector Table).  */
7 #ifdef __arch_v32
8
9 __asm__(""                                      \
10 "       .text\n"                        \
11 "       .globl _start\n"                \
12 "       .type _start,@function\n"       \
13 "_start:\n"                             \
14 "       move.d  $sp,$r10\n"             \
15 "       lapc    _dl_start,$r9\n"        \
16 "       jsr     $r9\n"                  \
17 "       nop\n"                          \
18 "       moveq   0,$r8\n"                \
19 "       jump    $r10\n"                 \
20 "       move    $r8,$srp\n"             \
21 "       .size _start,.-_start\n"        \
22 "       .previous\n"                    \
23 );
24
25 #else
26
27 __asm__(""                                      \
28 "       .text\n"                        \
29 "       .globl _start\n"                \
30 "       .type _start,@function\n"       \
31 "_start:\n"                             \
32 "       move.d  $sp,$r10\n"             \
33 "       move.d  $pc,$r9\n"              \
34 "       add.d   _dl_start - ., $r9\n"   \
35 "       jsr     $r9\n"                  \
36 "       moveq   0,$r8\n"                \
37 "       move    $r8,$srp\n"             \
38 "       jump    $r10\n"                 \
39 "       .size _start,.-_start\n"        \
40 "       .previous\n"                    \
41 );
42
43 #endif /* __arch_v32 */
44
45 /* Get a pointer to the argv array.  On many platforms this can be just
46  * the address if the first argument, on other platforms we need to
47  * do something a little more subtle here.  */
48 #define GET_ARGV(ARGVP, ARGS) ARGVP = (((unsigned long *) ARGS)+1)
49
50
51 /* We can't call functions earlier in the dl startup process */
52 #define NO_FUNCS_BEFORE_BOOTSTRAP
53
54
55 /* Handle relocation of the symbols in the dynamic loader. */
56 static inline
57 void PERFORM_BOOTSTRAP_RELOC(ELF_RELOC *rpnt, unsigned long *reloc_addr,
58         unsigned long symbol_addr, unsigned long load_addr, Elf32_Sym *symtab)
59 {
60         switch (ELF32_R_TYPE(rpnt->r_info)) {
61                 case R_CRIS_GLOB_DAT:
62                 case R_CRIS_JUMP_SLOT:
63                 case R_CRIS_32:
64                         *reloc_addr = symbol_addr;
65                         break;
66                 case R_CRIS_16_PCREL:
67                         *(short *) *reloc_addr = symbol_addr + rpnt->r_addend - *reloc_addr - 2;
68                         break;
69                 case R_CRIS_32_PCREL:
70                         *reloc_addr = symbol_addr + rpnt->r_addend - *reloc_addr - 4;
71                         break;
72                 case R_CRIS_NONE:
73                         break;
74                 case R_CRIS_RELATIVE:
75                         *reloc_addr = load_addr + rpnt->r_addend;
76                         break;
77                 default:
78                         _dl_exit(1);
79                         break;
80         }
81 }