|
@@ -56,6 +56,35 @@ _start:
|
|
|
/* Push the stack_end, rtld_fini and fini func onto the stack */
|
|
|
mov.l r6,@-r15
|
|
|
mov.l r4,@-r15
|
|
|
+
|
|
|
+#ifdef __PIC__
|
|
|
+ mova L_got, r0
|
|
|
+ mov.l L_got, r12
|
|
|
+ add r0, r12
|
|
|
+
|
|
|
+ mov.l L_fini,r0
|
|
|
+ add r12, r0
|
|
|
+ mov.l r0,@-r15
|
|
|
+
|
|
|
+ /* Set up the main/init funcs that go in registers */
|
|
|
+ mov.l L_main, r4
|
|
|
+ add r12, r4
|
|
|
+ mov.l L_init, r7
|
|
|
+ add r12, r7
|
|
|
+
|
|
|
+ /* __uClibc_main (main, argc, argv, init, fini, rtld_fini, stack_end) */
|
|
|
+
|
|
|
+ /* Let the libc call main and exit with its return code. */
|
|
|
+ mov.l L_uClibc_main,r0
|
|
|
+ mov.l @(r0,r12),r1
|
|
|
+ jsr @r1
|
|
|
+ nop
|
|
|
+ /* We should not get here. */
|
|
|
+ mov.l L_abort,r0
|
|
|
+ mov.l @(r0,r12),r1
|
|
|
+ jsr @r1
|
|
|
+ nop
|
|
|
+#else
|
|
|
mov.l L_fini,r0
|
|
|
mov.l r0,@-r15
|
|
|
|
|
@@ -73,10 +102,25 @@ _start:
|
|
|
mov.l L_abort,r1
|
|
|
jmp @r1
|
|
|
nop
|
|
|
+#endif
|
|
|
|
|
|
.size _start,.-_start
|
|
|
.align 2
|
|
|
|
|
|
+#ifdef __PIC__
|
|
|
+L_got:
|
|
|
+ .long _GLOBAL_OFFSET_TABLE_
|
|
|
+L_main:
|
|
|
+ .long main@GOTOFF
|
|
|
+L_init:
|
|
|
+ .long _init@GOTOFF
|
|
|
+L_fini:
|
|
|
+ .long _fini@GOTOFF
|
|
|
+L_uClibc_main:
|
|
|
+ .long __uClibc_main@GOT
|
|
|
+L_abort:
|
|
|
+ .long abort@GOT
|
|
|
+#else
|
|
|
L_main:
|
|
|
.long main
|
|
|
L_init:
|
|
@@ -87,6 +131,7 @@ L_uClibc_main:
|
|
|
.long __uClibc_main
|
|
|
L_abort:
|
|
|
.long abort
|
|
|
+#endif
|
|
|
|
|
|
/* Define a symbol for the first piece of initialized data. */
|
|
|
.data
|