diff options
Diffstat (limited to 'libc/sysdeps/linux/bfin')
-rw-r--r-- | libc/sysdeps/linux/bfin/crt1.S | 27 |
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 |