summaryrefslogtreecommitdiffstats
path: root/mdk-stage1/dietlibc/libdl/_dl_jump.S
diff options
context:
space:
mode:
Diffstat (limited to 'mdk-stage1/dietlibc/libdl/_dl_jump.S')
-rw-r--r--mdk-stage1/dietlibc/libdl/_dl_jump.S53
1 files changed, 50 insertions, 3 deletions
diff --git a/mdk-stage1/dietlibc/libdl/_dl_jump.S b/mdk-stage1/dietlibc/libdl/_dl_jump.S
index 134f31ea5..bd7115258 100644
--- a/mdk-stage1/dietlibc/libdl/_dl_jump.S
+++ b/mdk-stage1/dietlibc/libdl/_dl_jump.S
@@ -1,8 +1,55 @@
.text
.global _dl_jump
_dl_jump:
+
+#ifdef __i386__
+.type _dl_jump,@function
+
+ pushl %eax # save register args...
+ pushl %ecx
+ pushl %edx
+
+ pushl %ebx
+
+ pushl 20(%esp) # 2. arg from plt
+ pushl 20(%esp) # 1. arg from plt
+
+#ifdef __DYN_LIB
+ call 1f
+1: popl %ebx
+ addl $_GLOBAL_OFFSET_TABLE_+[.-1b],%ebx
+ call do_rel@PLT
+#else
call do_rel
- pop %edx
- pop %edx
- jmp *%eax
+#endif
+ addl $8, %esp
+
+ popl %ebx
+
+ popl %edx # restore register args...
+ popl %ecx
+
+ xchgl %eax, (%esp) # restore eax and save function pointer (for return)
+
+ ret $8 # remove arguments from plt and jump to REAL function
+
+#endif
+
+#ifdef __arm__
+.type _dl_jump,function
+
+ stmdb sp!, {r0, r1, r2, r3}
+ sub r1, ip, lr
+ sub r1, r1, #4
+ add r1, r1, r1 /* dyntab entry */
+ ldr r0, [lr, #-4] /* dynlib handle */
+#ifdef __DYN_LIB
+ bl do_rel(PLT)
+#else
+ bl do_rel
+#endif
+ mov r12, r0
+ ldmia sp!, {r0, r1, r2, r3, lr}
+ mov pc, r12
+#endif