summaryrefslogtreecommitdiff
path: root/libc/sysdeps/linux/bfin
diff options
context:
space:
mode:
Diffstat (limited to 'libc/sysdeps/linux/bfin')
-rw-r--r--libc/sysdeps/linux/bfin/crt1.S27
1 files changed, 10 insertions, 17 deletions
diff --git a/libc/sysdeps/linux/bfin/crt1.S b/libc/sysdeps/linux/bfin/crt1.S
index ffbd6e9af..156654437 100644
--- a/libc/sysdeps/linux/bfin/crt1.S
+++ b/libc/sysdeps/linux/bfin/crt1.S
@@ -83,6 +83,7 @@ __start:
L3 = 0;
#ifdef __ID_SHARED_LIB__
+ /* We know we have a local copy, so we can avoid the GOT. */
CALL ___shared_flat_add_library;
#endif
/* Load register R1 (argc) from the stack to its final resting place */
@@ -92,24 +93,15 @@ __start:
/* Copy argv pointer into R2 -- which its final resting place */
R2 = P0;
-/* Skip to the end of argv and put a pointer to the environment in
- [SP + 12] */
- R3 = R1;
- R3 <<= 2;
- R3 += 4;
- R3 = R2 + R3;
-
- P2 = SP;
- SP += -32;
- [SP + 12] = R3;
+ SP += -28;
#ifndef __BFIN_FDPIC__
R7 = 0;
#endif
/* Pass highest stack pointer to the app. */
- [SP + 28] = P2;
+ [SP + 24] = P2;
/* Store the pointer to ld.so's fini that we got in P1. */
- [SP + 24] = R7;
+ [SP + 20] = R7;
/* Ok, now run uClibc's main() -- shouldn't return */
#if defined L_crt1 && defined __UCLIBC_CTOR_DTOR__
@@ -123,7 +115,8 @@ __start:
R3.H = __init;
R3.L = __init;
#endif
- [SP+16] = R3;
+ [SP+12] = R3;
+
#ifdef __BFIN_FDPIC__
R3 = [P3 + __fini@FUNCDESC_GOT17M4];
@@ -133,11 +126,11 @@ __start:
R3.H = __fini;
R3.L = __fini;
#endif
- [SP+20] = R3;
+ [SP+16] = R3;
#else /* no ctor/dtor handling */
R3 = 0;
+ [SP + 12] = R3;
[SP + 16] = R3;
- [SP + 20] = R3;
#endif
#ifdef __BFIN_FDPIC__
@@ -162,8 +155,8 @@ __start:
.type lib_main,@function
lib_main:
RETS = [SP++];
- P0 = [P5 + ___shared_flat_add_library@GOT];
- JUMP (P0);
+ /* We know we have a local copy, so we can avoid the GOT. */
+ JUMP.L ___shared_flat_add_library;
.hidden _current_shared_library_p5_offset_
#endif