diff options
author | Joakim Tjernlund <joakim.tjernlund@transmode.se> | 2005-05-25 23:42:40 +0000 |
---|---|---|
committer | Joakim Tjernlund <joakim.tjernlund@transmode.se> | 2005-05-25 23:42:40 +0000 |
commit | fe4154e930920d612cf6499f3f3fd419d6e0fe37 (patch) | |
tree | 860ff70fb5b2e2fd0f125eafa7443dda232e659d /libc/sysdeps/linux/powerpc | |
parent | df0e39281e8fc368208127c67f0fa2f0dcbcca20 (diff) |
Adapt startup code in x86 and PPC to almost match glibc. _init vs. __libc_csu_init and
_fini vs. __libc_csu_fini remains to do.
Diffstat (limited to 'libc/sysdeps/linux/powerpc')
-rw-r--r-- | libc/sysdeps/linux/powerpc/crt1.S | 44 |
1 files changed, 20 insertions, 24 deletions
diff --git a/libc/sysdeps/linux/powerpc/crt1.S b/libc/sysdeps/linux/powerpc/crt1.S index 42040e2ee..916c34a4b 100644 --- a/libc/sysdeps/linux/powerpc/crt1.S +++ b/libc/sysdeps/linux/powerpc/crt1.S @@ -27,60 +27,56 @@ #define r7 7 #define r8 8 #define r9 9 +#define r10 10 #define r13 13 #define r31 31 #include <features.h> - .section ".text" +.text .globl _start - .type _start,@function - .weak _init - .weak _fini - .type __uClibc_start_main,%function - -/* Stick in a dummy reference to main(), so that if an application - * is linking when the main() function is in a static library (.a) - * we can be sure that main() actually gets linked in */ + .type _start,%function + .type _init,%function + .type _fini,%function .type main,%function + .type __uClibc_start_main,%function _start: - /* Save the stack pointer, in case we're statically linked under Linux. */ - mr r9,r1 + mr r9,r1 /* Save the stack pointer */ + clrrwi r1,r1,4 /* Align stack ptr to 16 bytes */ + mr r10,r1 /* Pass aligned stack ptr */ #if defined L_Scrt1 bl _GLOBAL_OFFSET_TABLE_-4@local mflr r31 #endif /* Set up an initial stack frame, and clear the LR. */ - clrrwi r1,r1,4 li r0,0 stwu r1,-16(r1) mtlr r0 stw r0,0(r1) - /* find argc from the stack pointer */ - lwz r3,0(r9) + lwz r4,0(r9) /* find argv one word offset from the stack pointer */ - addi r4,r9,4 + addi r5,r9,4 /* find environment pointer (argv+argc+1) */ - lwz r5,0(r9) - addi r5,r5,1 - rlwinm r5,r5,2,0,29 - add r5,r5,r4 - mr r9,r7 /* Pass _dl_fini from ldso */ + lwz r6,0(r9) + addi r6,r6,1 + rlwinm r6,r6,2,0,29 + add r6,r6,r5 + mr r9,r7 /* Pass _dl_fini from ldso or NULL if statically linked */ /* Ok, now run uClibc's main() -- shouldn't return */ # ifdef L_Scrt1 lwz r6,_init@got(r31) lwz r7,_fini@got(r31) - lwz r8,main@got(r31) + lwz r3,main@got(r31) b __uClibc_start_main@plt # else lis r6,_init@ha # load top 16 bits addi r6,r6,_init@l # load bottom 16 bits - lis r7,_fini@ha # load top 16 bits of &msg + lis r7,_fini@ha # load top 16 bits addi r7,r7,_fini@l # load bottom 16 bits - lis r8,main@ha # load top 16 bits of &msg - addi r8,r8,main@l # load bottom 16 bits + lis r3,main@ha # load top 16 bits + addi r3,r3,main@l # load bottom 16 bits b __uClibc_start_main # endif .size _start,.-_start |