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
|