1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 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
#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
|