summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoakim Tjernlund <joakim.tjernlund@transmode.se>2005-12-15 07:50:05 +0000
committerJoakim Tjernlund <joakim.tjernlund@transmode.se>2005-12-15 07:50:05 +0000
commit813349ca63e3987cb6a2567cbfbd8572ae78554f (patch)
tree4831fdba8138f839542f11596c65387d9c0f70e2
parentf68a5cd995f89baba6e6500612fcfb6962f41555 (diff)
Fix static apps on linux 2.6. Linux clobbers r7 in 2.6, so
use r3 instead to pass _dl_fini.
-rw-r--r--ldso/ldso/powerpc/dl-startup.h6
-rw-r--r--libc/sysdeps/linux/powerpc/crt1.S3
2 files changed, 6 insertions, 3 deletions
diff --git a/ldso/ldso/powerpc/dl-startup.h b/ldso/ldso/powerpc/dl-startup.h
index 6fdf74301..e6fd814e5 100644
--- a/ldso/ldso/powerpc/dl-startup.h
+++ b/ldso/ldso/powerpc/dl-startup.h
@@ -42,8 +42,10 @@ asm(
" bne 2b\n"
" addi 6,6,4\n"
#endif
- /* Pass a termination function pointer (in this case _dl_fini) in r7. */
- " lwz 7,_dl_fini@got(31)\n"
+ /* Pass a termination function pointer (in this case _dl_fini) in r3. */
+ /* Paulus promized he would keep r3 zero in the exec ABI. */
+ " lwz 3,_dl_fini@got(31)\n"
+ " mr 7,3\n" /* Pass _dl_fini in r7 to maintain compat */
" bctr\n" /* Jump to entry point */
" .size _start,.-_start\n"
" .previous\n"
diff --git a/libc/sysdeps/linux/powerpc/crt1.S b/libc/sysdeps/linux/powerpc/crt1.S
index c042462e9..47419bb52 100644
--- a/libc/sysdeps/linux/powerpc/crt1.S
+++ b/libc/sysdeps/linux/powerpc/crt1.S
@@ -60,7 +60,8 @@ _start:
lwz r4,0(r9)
/* find argv one word offset from the stack pointer */
addi r5,r9,4
- mr r8,r7 /* Pass _dl_fini from ldso or NULL if statically linked */
+ mr r8,r3 /* Pass _dl_fini from ldso or NULL if statically linked
+ Note: using r3 instead of r7, since linux 2.6 clobbers r7 */
/* Ok, now run uClibc's main() -- shouldn't return */
#ifdef __PIC__
lwz r6,_init@got(r31)