Modified src/forwarding/apple-forwarding-amd64.S
from [5acd78427e]
to [51cce4e244].
︙ | | |
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
-
+
-
-
+
+
|
.att_syntax
/* Use uppercase instruction to avoid recursion. */
JMP $0
.intel_syntax noprefix
.endmacro
.section __TEXT, __objc_methname, cstring_literals
str_forwardingTargetForSelector_:
Lstr_forwardingTargetForSelector_:
.asciz "forwardingTargetForSelector:"
.section __DATA, __objc_selrefs, literal_pointers, no_dead_strip
sel_forwardingTargetForSelector_:
.quad str_forwardingTargetForSelector_
Lsel_forwardingTargetForSelector_:
.quad Lstr_forwardingTargetForSelector_
.section __DATA, __objc_imageinfo, regular, no_dead_strip
.long 0, 0
.section __TEXT, __text, regular, pure_instructions
_OFForward:
push rbp
|
︙ | | |
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
|
-
+
-
+
|
movaps [rbp - 0xA0], xmm5
movaps [rbp - 0xB0], xmm6
movaps [rbp - 0xC0], xmm7
call _object_getClass
mov rdi, rax
mov rsi, [rip + sel_forwardingTargetForSelector_]
mov rsi, [rip + Lsel_forwardingTargetForSelector_]
call _class_respondsToSelector
test rax, rax
jz 0f
mov rdi, [rbp - 0x10]
mov rsi, [rip + sel_forwardingTargetForSelector_]
mov rsi, [rip + Lsel_forwardingTargetForSelector_]
mov rdx, [rbp - 0x18]
call _objc_msgSend
test rax, rax
jz 0f
cmp rax, [rbp - 0x10]
je 0f
|
︙ | | |
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
-
+
-
+
|
movaps [rbp - 0xB0], xmm6
movaps [rbp - 0xC0], xmm7
mov rdi, rsi
call _object_getClass
mov rdi, rax
mov rsi, [rip + sel_forwardingTargetForSelector_]
mov rsi, [rip + Lsel_forwardingTargetForSelector_]
call _class_respondsToSelector
test rax, rax
jz 0f
mov rdi, [rbp - 0x18]
mov rsi, [rip + sel_forwardingTargetForSelector_]
mov rsi, [rip + Lsel_forwardingTargetForSelector_]
mov rdx, [rbp - 0x20]
call _objc_msgSend
test rax, rax
jz 0f
cmp rax, [rbp - 0x18]
je 0f
|
︙ | | |
Modified src/forwarding/apple-forwarding-arm.S
from [3ab429edb9]
to [2386bdcec6].
︙ | | |
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
|
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
|
-
+
-
+
-
+
|
#include "config.h"
.globl _OFForward
.globl _OFForward_stret
.section __TEXT, __objc_methname, cstring_literals
str_forwardingTargetForSelector_:
Lstr_forwardingTargetForSelector_:
.asciz "forwardingTargetForSelector:"
.section __DATA, __objc_selrefs, literal_pointers, no_dead_strip
sel_forwardingTargetForSelector_:
Lsel_forwardingTargetForSelector_:
.long str_forwardingTargetForSelector_
.section __DATA, __objc_imageinfo, regular, no_dead_strip
.long 0, 0
.section __TEXT, __text, regular, pure_instructions
.arm
.align 2
_OFForward:
stmfd sp!, {r0-r4, lr}
vstmdb sp!, {d0-d7}
ldr r4, sel_forwardingTargetForSelector_$indirect_L0
ldr r4, Lsel_forwardingTargetForSelector_$indirect_L0
L0:
ldr r4, [pc, r4]
blx _object_getClass
mov r1, r4
blx _class_respondsToSelector
|
︙ | | |
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
|
-
-
+
+
-
+
|
0:
vldmia sp!, {d0-d7}
ldmfd sp!, {r0-r4, lr}
b _OFMethodNotFound
.data_region
sel_forwardingTargetForSelector_$indirect_L0:
.long sel_forwardingTargetForSelector_-(L0+8)
Lsel_forwardingTargetForSelector_$indirect_L0:
.long Lsel_forwardingTargetForSelector_-(L0+8)
.end_data_region
.align 2
_OFForward_stret:
stmfd sp!, {r0-r4, lr}
vstmdb sp!, {d0-d7}
ldr r4, sel_forwardingTargetForSelector_$indirect_L1
ldr r4, Lsel_forwardingTargetForSelector_$indirect_L1
L1:
ldr r4, [pc, r4]
mov r0, r1
blx _object_getClass
mov r1, r4
|
︙ | | |
115
116
117
118
119
120
121
122
123
124
|
115
116
117
118
119
120
121
122
123
124
|
-
-
+
+
|
0:
vldmia sp!, {d0-d7}
ldmfd sp!, {r0-r4, lr}
b _OFMethodNotFound_stret
.data_region
sel_forwardingTargetForSelector_$indirect_L1:
.long sel_forwardingTargetForSelector_-(L1+8)
Lsel_forwardingTargetForSelector_$indirect_L1:
.long Lsel_forwardingTargetForSelector_-(L1+8)
.end_data_region
|
Modified src/forwarding/apple-forwarding-arm64.S
from [63e754588e]
to [f4650e9fb4].
︙ | | |
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
-
+
-
-
+
+
|
#include "config.h"
.globl _OFForward
.globl _OFForward_stret
.section __TEXT, __objc_methname, cstring_literals
str_forwardingTargetForSelector_:
Lstr_forwardingTargetForSelector_:
.asciz "forwardingTargetForSelector:"
.section __DATA, __objc_selrefs, literal_pointers, no_dead_strip
sel_forwardingTargetForSelector_:
.quad str_forwardingTargetForSelector_
Lsel_forwardingTargetForSelector_:
.quad Lstr_forwardingTargetForSelector_
.section __DATA, __objc_imageinfo, regular, no_dead_strip
.long 0, 0
.section __TEXT, __text, regular, pure_instructions
.align 2
_OFForward:
|
︙ | | |
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
-
-
+
+
|
stp q0, q1, [sp, #80]
stp q2, q3, [sp, #112]
stp q4, q5, [sp, #144]
stp q6, q7, [sp, #176]
bl _object_getClass
adrp x19, sel_forwardingTargetForSelector_@PAGE
add x19, x19, sel_forwardingTargetForSelector_@PAGEOFF
adrp x19, Lsel_forwardingTargetForSelector_@PAGE
add x19, x19, Lsel_forwardingTargetForSelector_@PAGEOFF
ldr x19, [x19]
mov x1, x19
bl _class_respondsToSelector
cbz x0, 0f
|
︙ | | |
Modified src/forwarding/apple-forwarding-powerpc.S
from [d8e9e96515]
to [01c664deae].
︙ | | |
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
-
+
-
-
+
+
|
#include "config.h"
.globl _OFForward
.globl _OFForward_stret
.section __TEXT, __cstring, cstring_literals
str_forwardingTargetForSelector_:
Lstr_forwardingTargetForSelector_:
.asciz "forwardingTargetForSelector:"
.section __OBJC, __message_refs
sel_forwardingTargetForSelector_:
.long str_forwardingTargetForSelector_
Lsel_forwardingTargetForSelector_:
.long Lstr_forwardingTargetForSelector_
.section __OBJC, __image_info
.long 0, 0
.section __TEXT, __text, regular, pure_instructions
_OFForward:
mflr r0
|
︙ | | |
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
-
-
+
+
|
stfd f13, 184(r1)
bl _object_getClass
bl 0f
0:
mflr r13
addis r13, r13, ha16(sel_forwardingTargetForSelector_-0b)
lwz r13, lo16(sel_forwardingTargetForSelector_-0b)(r13)
addis r13, r13, ha16(Lsel_forwardingTargetForSelector_-0b)
lwz r13, lo16(Lsel_forwardingTargetForSelector_-0b)(r13)
mr r4, r13
bl _class_respondsToSelector
cmpwi r3, 0
beq- 0f
|
︙ | | |
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
|
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
|
-
-
+
+
|
mr r3, r4
bl _object_getClass
bl 0f
0:
mflr r13
addis r13, r13, ha16(sel_forwardingTargetForSelector_-0b)
lwz r13, lo16(sel_forwardingTargetForSelector_-0b)(r13)
addis r13, r13, ha16(Lsel_forwardingTargetForSelector_-0b)
lwz r13, lo16(Lsel_forwardingTargetForSelector_-0b)(r13)
mr r4, r13
bl _class_respondsToSelector
cmpwi r3, 0
beq- 0f
|
︙ | | |
Modified src/forwarding/apple-forwarding-x86.S
from [c3da6554d1]
to [fe22007392].
︙ | | |
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
-
+
-
-
+
+
-
+
-
+
-
+
|
.att_syntax
/* Use uppercase instruction to avoid recursion. */
JMP $0
.intel_syntax noprefix
.endmacro
.section __TEXT, __cstring, cstring_literals
str_forwardingTargetForSelector_:
Lstr_forwardingTargetForSelector_:
.asciz "forwardingTargetForSelector:"
.section __OBJC, __message_refs, literal_pointers, no_dead_strip
sel_forwardingTargetForSelector_:
.long str_forwardingTargetForSelector_
Lsel_forwardingTargetForSelector_:
.long Lstr_forwardingTargetForSelector_
.section __OBJC, __image_info
.long 0, 0
.section __TEXT, __text, regular, pure_instructions
_OFForward:
push ebp
mov ebp, esp
push ebx
sub esp, 20
call getEIP
call LgetEIP
0:
mov eax, [ebp + 8]
mov [esp], eax
call _object_getClass
mov [esp], eax
mov eax, [ebx + sel_forwardingTargetForSelector_ - 0b]
mov eax, [ebx + Lsel_forwardingTargetForSelector_ - 0b]
mov [esp + 4], eax
call _class_respondsToSelector
test eax, eax
jz 0f
mov eax, [ebp + 8]
mov [esp], eax
mov eax, [ebx + sel_forwardingTargetForSelector_ - 0b]
mov eax, [ebx + Lsel_forwardingTargetForSelector_ - 0b]
mov [esp + 4], eax
mov eax, [ebp + 12]
mov [esp + 8], eax
call _objc_msgSend
test eax, eax
jz 0f
|
︙ | | |
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
-
+
-
+
-
+
|
_OFForward_stret:
push ebp
mov ebp, esp
push ebx
sub esp, 20
call getEIP
call LgetEIP
0:
mov eax, [ebp + 12]
mov [esp], eax
call _object_getClass
mov [esp], eax
mov eax, [ebx + sel_forwardingTargetForSelector_ - 0b]
mov eax, [ebx + Lsel_forwardingTargetForSelector_ - 0b]
mov [esp + 4], eax
call _class_respondsToSelector
test eax, eax
jz 0f
mov eax, [ebp + 12]
mov [esp], eax
mov eax, [ebx + sel_forwardingTargetForSelector_ - 0b]
mov eax, [ebx + Lsel_forwardingTargetForSelector_ - 0b]
mov [esp + 4], eax
mov eax, [ebp + 16]
mov [esp + 8], eax
call _objc_msgSend
test eax, eax
jz 0f
|
︙ | | |
142
143
144
145
146
147
148
149
150
151
|
142
143
144
145
146
147
148
149
150
151
|
-
+
|
0:
add esp, 20
pop ebx
pop ebp
jmp _OFMethodNotFound_stret
getEIP:
LgetEIP:
mov ebx, [esp]
ret
|
Modified src/forwarding/forwarding-amd64-elf.S
from [6b28668374]
to [60cb5f07a9].
︙ | | |
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
-
+
-
+
-
+
|
movaps [rbp - 0xA0], xmm5
movaps [rbp - 0xB0], xmm6
movaps [rbp - 0xC0], xmm7
call object_getClass@PLT
mov rdi, rax
lea rsi, [rip + sel_forwardingTargetForSelector_]
lea rsi, [rip + .Lsel_forwardingTargetForSelector_]
call class_respondsToSelector@PLT
test rax, rax
jz short 0f
mov rdi, [rbp - 0x10]
lea rsi, [rip + sel_forwardingTargetForSelector_]
lea rsi, [rip + .Lsel_forwardingTargetForSelector_]
call objc_msg_lookup@PLT
mov rdi, [rbp - 0x10]
lea rsi, [rip + sel_forwardingTargetForSelector_]
lea rsi, [rip + .Lsel_forwardingTargetForSelector_]
mov rdx, [rbp - 0x18]
call rax
test rax, rax
jz short 0f
cmp rax, [rbp - 0x10]
je short 0f
|
︙ | | |
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
|
-
+
-
+
-
+
|
movaps [rbp - 0xB0], xmm6
movaps [rbp - 0xC0], xmm7
mov rdi, rsi
call object_getClass@PLT
mov rdi, rax
lea rsi, [rip + sel_forwardingTargetForSelector_]
lea rsi, [rip + .Lsel_forwardingTargetForSelector_]
call class_respondsToSelector@PLT
test rax, rax
jz short 0f
mov rdi, [rbp - 0x18]
lea rsi, [rip + sel_forwardingTargetForSelector_]
lea rsi, [rip + .Lsel_forwardingTargetForSelector_]
call objc_msg_lookup@PLT
mov rdi, [rbp - 0x18]
lea rsi, [rip + sel_forwardingTargetForSelector_]
lea rsi, [rip + .Lsel_forwardingTargetForSelector_]
mov rdx, [rbp - 0x20]
call rax
test rax, rax
jz short 0f
cmp rax, [rbp - 0x18]
je short 0f
|
︙ | | |
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
|
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
|
-
-
+
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
|
mov rsp, rbp
pop rbp
jmp OFMethodNotFound_stret@PLT
.type OFForward_stret, %function
.size OFForward_stret, .-OFForward_stret
init:
lea rdi, [rip + module]
.Linit:
lea rdi, [rip + .Lmodule]
jmp __objc_exec_class@PLT
#ifdef OF_SOLARIS
.section .init_array, "aw"
#else
.section .ctors, "aw", %progbits
#endif
.quad init
.quad .Linit
.section .rodata
str_forwardingTargetForSelector_:
.Lstr_forwardingTargetForSelector_:
.asciz "forwardingTargetForSelector:"
.section .data
sel_forwardingTargetForSelector_:
.quad str_forwardingTargetForSelector_, 0
.Lsel_forwardingTargetForSelector_:
.quad .Lstr_forwardingTargetForSelector_, 0
.quad 0, 0
symtab:
.quad 0, sel_forwardingTargetForSelector_
.Lsymtab:
.quad 0, .Lsel_forwardingTargetForSelector_
.short 0, 0
.long 0
.quad 0
module:
.quad 8, 32, 0, symtab
.Lmodule:
.quad 8, 32, 0, .Lsymtab
#if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD)
.section .note.GNU-stack, "", %progbits
#endif
|
Modified src/forwarding/forwarding-amd64-macho.S
from [0969f9a066]
to [197daf8bf7].
︙ | | |
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
-
+
-
+
-
+
|
movaps [rbp - 0xA0], xmm5
movaps [rbp - 0xB0], xmm6
movaps [rbp - 0xC0], xmm7
call _object_getClass
mov rdi, rax
lea rsi, [rip + sel_forwardingTargetForSelector_]
lea rsi, [rip + Lsel_forwardingTargetForSelector_]
call _class_respondsToSelector
test rax, rax
jz 0f
mov rdi, [rbp - 0x10]
lea rsi, [rip + sel_forwardingTargetForSelector_]
lea rsi, [rip + Lsel_forwardingTargetForSelector_]
call _objc_msg_lookup
movq rdi, [rbp - 0x10]
leaq rsi, [rip + sel_forwardingTargetForSelector_]
leaq rsi, [rip + Lsel_forwardingTargetForSelector_]
movq rdx, [rbp - 0x18]
call *%rax
test rax, rax
jz 0f
cmp rax, [rbp - 0x10]
je 0f
|
︙ | | |
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
|
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
|
-
+
-
+
-
+
|
movaps [rbp - 0xB0], xmm6
movaps [rbp - 0xC0], xmm7
mov rdi, rsi
call _object_getClass
mov rdi, rax
lea rsi, [rip + sel_forwardingTargetForSelector_]
lea rsi, [rip + Lsel_forwardingTargetForSelector_]
call _class_respondsToSelector
test rax, rax
jz 0f
mov rdi, [rbp - 0x18]
lea rsi, [rip + sel_forwardingTargetForSelector_]
lea rsi, [rip + Lsel_forwardingTargetForSelector_]
call _objc_msg_lookup
mov rdi, [rbp - 0x18]
lea rsi, [rip + sel_forwardingTargetForSelector_]
lea rsi, [rip + Lsel_forwardingTargetForSelector_]
mov rdx, [rbp - 0x20]
call *%rax
test rax, rax
jz 0f
cmp rax, [rbp - 0x18]
je 0f
|
︙ | | |
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
|
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
|
-
-
+
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
|
mov rdx, [rbp - 0x20]
mov rsp, rbp
pop rbp
jmp _OFMethodNotFound_stret
init:
lea rdi, [rip + module]
Linit:
lea rdi, [rip + Lmodule]
jmp ___objc_exec_class
.section __DATA, __mod_init_func, mod_init_funcs
.quad init
.quad Linit
.section __TEXT, __cstring, cstring_literals
str_forwardingTargetForSelector_:
Lstr_forwardingTargetForSelector_:
.asciz "forwardingTargetForSelector:"
.section __DATA, __data
sel_forwardingTargetForSelector_:
.quad str_forwardingTargetForSelector_, 0
Lsel_forwardingTargetForSelector_:
.quad Lstr_forwardingTargetForSelector_, 0
.quad 0, 0
symtab:
.quad 0, sel_forwardingTargetForSelector_
Lsymtab:
.quad 0, Lsel_forwardingTargetForSelector_
.short 0, 0
.long 0
.quad 0
module:
.quad 8, 32, 0, symtab
Lmodule:
.quad 8, 32, 0, Lsymtab
|
Modified src/forwarding/forwarding-amd64-win64.S
from [66e90d878f]
to [bb16226b9b].
︙ | | |
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
-
+
-
+
-
+
|
movaps [rbp - 0x70], xmm1
movaps [rbp - 0x80], xmm2
movaps [rbp - 0x90], xmm3
call object_getClass
mov rcx, rax
lea rdx, [rip + sel_forwardingTargetForSelector_]
lea rdx, [rip + .Lsel_forwardingTargetForSelector_]
call class_respondsToSelector
test rax, rax
jz short 0f
mov rcx, [rbp - 0x30]
lea rdx, [rip + sel_forwardingTargetForSelector_]
lea rdx, [rip + .Lsel_forwardingTargetForSelector_]
call objc_msg_lookup
mov rcx, [rbp - 0x30]
lea rdx, [rip + sel_forwardingTargetForSelector_]
lea rdx, [rip + .Lsel_forwardingTargetForSelector_]
mov r8, [rbp - 0x38]
call rax
test rax, rax
jz short 0f
cmp rax, [rbp - 0x30]
je short 0f
|
︙ | | |
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
|
-
+
-
+
-
+
|
movaps [rbp - 0x80], xmm2
movaps [rbp - 0x90], xmm3
mov rcx, rdx
call object_getClass
mov rcx, rax
lea rdx, [rip + sel_forwardingTargetForSelector_]
lea rdx, [rip + .Lsel_forwardingTargetForSelector_]
call class_respondsToSelector
test rax, rax
jz short 0f
mov rcx, [rbp - 0x38]
lea rdx, [rip + sel_forwardingTargetForSelector_]
lea rdx, [rip + .Lsel_forwardingTargetForSelector_]
call objc_msg_lookup
mov rcx, [rbp - 0x38]
lea rdx, [rip + sel_forwardingTargetForSelector_]
lea rdx, [rip + .Lsel_forwardingTargetForSelector_]
mov r8, [rbp - 0x40]
call rax
test rax, rax
jz short 0f
cmp rax, [rbp - 0x38]
je short 0f
|
︙ | | |
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
|
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
|
-
-
+
+
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
+
|
jmp OFMethodNotFound_stret
.def OFForward_stret
.scl 2
.type 32
.endef
init:
lea rcx, [rip + module]
.Linit:
lea rcx, [rip + .Lmodule]
jmp __objc_exec_class
.section .ctors, "aw"
.quad init
.quad .Linit
.section .rodata
str_forwardingTargetForSelector_:
.Lstr_forwardingTargetForSelector_:
.asciz "forwardingTargetForSelector:"
.section .data
sel_forwardingTargetForSelector_:
.quad str_forwardingTargetForSelector_, 0
.Lsel_forwardingTargetForSelector_:
.quad .Lstr_forwardingTargetForSelector_, 0
.quad 0, 0
symtab:
.Lsymtab:
.long 0, 0
.quad sel_forwardingTargetForSelector_
.quad .Lsel_forwardingTargetForSelector_
.short 0, 0
.long 0
.quad 0
module:
.Lmodule:
.long 8, 32
.quad 0, symtab
.quad 0, .Lsymtab
|
Modified src/forwarding/forwarding-arm-elf.S
from [594651911a]
to [cb34b0f842].
︙ | | |
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
-
+
|
.section .text
OFForward:
#ifdef HAVE_VFP2
vstmdb sp!, {d0-d7}
#endif
stmfd sp!, {r0-r4, lr}
ldr r4, sel_forwardingTargetForSelector_$indirect_.L0
ldr r4, .Lsel_forwardingTargetForSelector_$indirect_.L0
.L0:
add r4, pc
bl object_getClass(PLT)
mov r1, r4
bl class_respondsToSelector(PLT)
|
︙ | | |
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
-
+
|
OFForward_stret:
#ifdef HAVE_VFP2
vstmdb sp!, {d0-d7}
#endif
stmfd sp!, {r0-r4, lr}
ldr r4, sel_forwardingTargetForSelector_$indirect_.L1
ldr r4, .Lsel_forwardingTargetForSelector_$indirect_.L1
.L1:
add r4, pc
mov r0, r1
bl object_getClass(PLT)
mov r1, r4
|
︙ | | |
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
|
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
|
-
-
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
|
#ifdef HAVE_VFP2
vldmia sp!, {d0-d7}
#endif
b OFMethodNotFound_stret(PLT)
.type OFForward_stret, %function
.size OFForward_stret, .-OFForward_stret
init:
ldr r0, module$indirect_.L2
.Linit:
ldr r0, .Lmodule$indirect_.L2
.L2:
add r0, pc
b __objc_exec_class(PLT)
sel_forwardingTargetForSelector_$indirect_.L0:
.long sel_forwardingTargetForSelector_-(.L0+8)
sel_forwardingTargetForSelector_$indirect_.L1:
.long sel_forwardingTargetForSelector_-(.L1+8)
module$indirect_.L2:
.long module-(.L2+8)
.Lsel_forwardingTargetForSelector_$indirect_.L0:
.long .Lsel_forwardingTargetForSelector_-(.L0+8)
.Lsel_forwardingTargetForSelector_$indirect_.L1:
.long .Lsel_forwardingTargetForSelector_-(.L1+8)
.Lmodule$indirect_.L2:
.long .Lmodule-(.L2+8)
.section .init_array, "aw", %init_array
.long init
.long .Linit
.section .rodata
str_forwardingTargetForSelector_:
.Lstr_forwardingTargetForSelector_:
.asciz "forwardingTargetForSelector:"
.section .data
sel_forwardingTargetForSelector_:
.long str_forwardingTargetForSelector_, 0
.Lsel_forwardingTargetForSelector_:
.long .Lstr_forwardingTargetForSelector_, 0
.long 0, 0
symtab:
.long 0, sel_forwardingTargetForSelector_
.Lsymtab:
.long 0, .Lsel_forwardingTargetForSelector_
.short 0, 0
.long 0
.long 0
module:
.long 8, 16, 0, symtab
.Lmodule:
.long 8, 16, 0, .Lsymtab
#if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD)
.section .note.GNU-stack, "", %progbits
#endif
|
Modified src/forwarding/forwarding-arm64-elf.S
from [0aaed32730]
to [3a26ad261d].
︙ | | |
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
|
-
-
+
+
|
stp q0, q1, [sp, #80]
stp q2, q3, [sp, #112]
stp q4, q5, [sp, #144]
stp q6, q7, [sp, #176]
bl object_getClass
adrp x19, sel_forwardingTargetForSelector_
add x19, x19, :lo12:sel_forwardingTargetForSelector_
adrp x19, .Lsel_forwardingTargetForSelector_
add x19, x19, :lo12:.Lsel_forwardingTargetForSelector_
mov x1, x19
bl class_respondsToSelector
cbz x0, 0f
ldr x0, [sp]
|
︙ | | |
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
|
-
-
-
+
+
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
|
b OFMethodNotFound
.type OFForward, %function
.size OFForward, .-OFForward
.type OFForward_stret, %function
.size OFForward_stret, .-OFForward_stret
init:
adrp x0, module
add x0, x0, :lo12:module
.Linit:
adrp x0, .Lmodule
add x0, x0, :lo12:.Lmodule
b __objc_exec_class
.section .init_array, "aw", %init_array
.xword init
.xword .Linit
.section .rodata
str_forwardingTargetForSelector_:
.Lstr_forwardingTargetForSelector_:
.asciz "forwardingTargetForSelector:"
.section .data
sel_forwardingTargetForSelector_:
.xword str_forwardingTargetForSelector_, 0
.Lsel_forwardingTargetForSelector_:
.xword .Lstr_forwardingTargetForSelector_, 0
.xword 0, 0
symtab:
.xword 0, sel_forwardingTargetForSelector_
.Lsymtab:
.xword 0, .Lsel_forwardingTargetForSelector_
.short 0, 0
.long 4
.xword 0
module:
.xword 8, 32, 0, symtab
.Lmodule:
.xword 8, 32, 0, .Lsymtab
#if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD)
.section .note.GNU-stack, "", %progbits
#endif
|
Modified src/forwarding/forwarding-mips-elf.S
from [27b4e12fcc]
to [073f3a69c2].
︙ | | |
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
-
+
-
+
-
+
|
swc1 $f17, 80($sp)
swc1 $f18, 84($sp)
swc1 $f19, 88($sp)
#endif
move $s0, $gp
#ifdef OF_PIC
lw $s1, %got(sel_forwardingTargetForSelector_)($gp)
lw $s1, %got(.Lsel_forwardingTargetForSelector_)($gp)
#else
lui $s1, %hi(sel_forwardingTargetForSelector_)
lui $s1, %hi(.Lsel_forwardingTargetForSelector_)
#endif
addiu $s1, $s1, %lo(sel_forwardingTargetForSelector_)
addiu $s1, $s1, %lo(.Lsel_forwardingTargetForSelector_)
jal_pic object_getClass
move $gp, $s0
move $a0, $v0
move $a1, $s1
jal_pic class_respondsToSelector
|
︙ | | |
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
|
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
|
-
+
-
+
-
+
|
swc1 $f17, 80($sp)
swc1 $f18, 84($sp)
swc1 $f19, 88($sp)
#endif
move $s0, $gp
#ifdef OF_PIC
lw $s1, %got(sel_forwardingTargetForSelector_)($gp)
lw $s1, %got(.Lsel_forwardingTargetForSelector_)($gp)
#else
lui $s1, %hi(sel_forwardingTargetForSelector_)
lui $s1, %hi(.Lsel_forwardingTargetForSelector_)
#endif
addiu $s1, $s1, %lo(sel_forwardingTargetForSelector_)
addiu $s1, $s1, %lo(.Lsel_forwardingTargetForSelector_)
move $a0, $a1
jal_pic object_getClass
move $gp, $s0
move $a0, $v0
move $a1, $s1
|
︙ | | |
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
|
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
|
-
+
-
-
+
+
-
-
+
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
|
addiu $sp, $sp, 96
j_pic of_method_not_found_stret
.type OFForward_stret, %function
.size OFForward_stret, .-OFForward_stret
init:
.Linit:
#ifdef OF_PIC
lui $gp, %hi(_gp_disp)
addiu $gp, $gp, %lo(_gp_disp)
addu $gp, $gp, $t9
lw $a0, %got(module)($gp)
addiu $a0, $a0, %lo(module)
lw $a0, %got(.Lmodule)($gp)
addiu $a0, $a0, %lo(.Lmodule)
lw $t9, %call16(__objc_exec_class)($gp)
jr $t9
#else
lui $a0, %hi(module)
addiu $a0, $a0, %lo(module)
lui $a0, %hi(.Lmodule)
addiu $a0, $a0, %lo(.Lmodule)
j __objc_exec_class
#endif
.section .ctors, "aw", %progbits
.long init
.long .Linit
.section .rodata
str_forwardingTargetForSelector_:
.Lstr_forwardingTargetForSelector_:
.asciz "forwardingTargetForSelector:"
.section .data
sel_forwardingTargetForSelector_:
.long str_forwardingTargetForSelector_, 0
.Lsel_forwardingTargetForSelector_:
.long .Lstr_forwardingTargetForSelector_, 0
.long 0, 0
symtab:
.long 0, sel_forwardingTargetForSelector_
.Lsymtab:
.long 0, .Lsel_forwardingTargetForSelector_
.short 0, 0
.long 0
.long 0
module:
.long 8, 16, 0, symtab
.Lmodule:
.long 8, 16, 0, .Lsymtab
#if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD)
.section .note.GNU-stack, "", %progbits
#endif
|
Modified src/forwarding/forwarding-powerpc-elf.S
from [22c25e7609]
to [6d0e0a93e0].
︙ | | |
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
-
-
+
+
-
-
+
+
-
-
+
+
|
bl object_getClass+0x8000@plt
lwz %r4, .Lgot_sel_forwardingTargetForSelector_-.Lbiased_got2(%r30)
bl class_respondsToSelector+0x8000@plt
#else
bl object_getClass
lis %r4, sel_forwardingTargetForSelector_@ha
la %r4, sel_forwardingTargetForSelector_@l(%r4)
lis %r4, .Lsel_forwardingTargetForSelector_@ha
la %r4, .Lsel_forwardingTargetForSelector_@l(%r4)
bl class_respondsToSelector
#endif
cmpwi %r3, 0
beq- 0f
lwz %r3, 8(%r1)
#ifdef OF_PIC
lwz %r4, .Lgot_sel_forwardingTargetForSelector_-.Lbiased_got2(%r30)
bl objc_msg_lookup+0x8000@plt
#else
lis %r4, sel_forwardingTargetForSelector_@ha
la %r4, sel_forwardingTargetForSelector_@l(%r4)
lis %r4, .Lsel_forwardingTargetForSelector_@ha
la %r4, .Lsel_forwardingTargetForSelector_@l(%r4)
bl objc_msg_lookup
#endif
mtctr %r3
lwz %r3, 8(%r1)
#ifdef OF_PIC
lwz %r4, .Lgot_sel_forwardingTargetForSelector_-.Lbiased_got2(%r30)
#else
lis %r4, sel_forwardingTargetForSelector_@ha
la %r4, sel_forwardingTargetForSelector_@l(%r4)
lis %r4, .Lsel_forwardingTargetForSelector_@ha
la %r4, .Lsel_forwardingTargetForSelector_@l(%r4)
#endif
lwz %r5, 12(%r1)
bctrl
cmpwi %r3, 0
beq- 0f
lwz %r4, 8(%r1)
|
︙ | | |
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
|
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
|
-
-
+
+
-
-
+
+
-
-
+
+
|
bl object_getClass+0x8000@plt
lwz %r4, .Lgot_sel_forwardingTargetForSelector_-.Lbiased_got2(%r30)
bl class_respondsToSelector+0x8000@plt
#else
bl object_getClass
lis %r4, sel_forwardingTargetForSelector_@ha
la %r4, sel_forwardingTargetForSelector_@l(%r4)
lis %r4, .Lsel_forwardingTargetForSelector_@ha
la %r4, .Lsel_forwardingTargetForSelector_@l(%r4)
bl class_respondsToSelector
#endif
cmpwi %r3, 0
beq- 0f
lwz %r3, 12(%r1)
#ifdef OF_PIC
lwz %r4, .Lgot_sel_forwardingTargetForSelector_-.Lbiased_got2(%r30)
bl objc_msg_lookup+0x8000@plt
#else
lis %r4, sel_forwardingTargetForSelector_@ha
la %r4, sel_forwardingTargetForSelector_@l(%r4)
lis %r4, .Lsel_forwardingTargetForSelector_@ha
la %r4, .Lsel_forwardingTargetForSelector_@l(%r4)
bl objc_msg_lookup
#endif
mtctr %r3
lwz %r3, 12(%r1)
#ifdef OF_PIC
lwz %r4, .Lgot_sel_forwardingTargetForSelector_-.Lbiased_got2(%r30)
#else
lis %r4, sel_forwardingTargetForSelector_@ha
la %r4, sel_forwardingTargetForSelector_@l(%r4)
lis %r4, .Lsel_forwardingTargetForSelector_@ha
la %r4, .Lsel_forwardingTargetForSelector_@l(%r4)
#endif
lwz %r5, 16(%r1)
bctrl
cmpwi %r3, 0
beq- 0f
lwz %r4, 12(%r1)
|
︙ | | |
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
|
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
|
-
+
-
-
+
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
-
+
-
+
|
bctr
#else
b OFMethodNotFound_stret
#endif
.type OFForward_stret, @function
.size OFForward_stret, .-OFForward_stret
init:
.Linit:
stwu %r1, -16(%r1)
mflr %r0
stw %r0, 20(%r1)
#ifdef OF_PIC
stw %r30, 8(%r1)
bl 0f
0:
mflr %r30
addis %r30, %r30, .Lbiased_got2-0b@ha
addi %r30, %r30, .Lbiased_got2-0b@l
lwz %r3, .Lgot_module-.Lbiased_got2(%r30)
bl __objc_exec_class+0x8000@plt
lwz %r30, 8(%r1)
#else
lis %r3, module@ha
la %r3, module@l(%r3)
lis %r3, .Lmodule@ha
la %r3, .Lmodule@l(%r3)
bl __objc_exec_class
#endif
lwz %r0, 20(%r1)
addi %r1, %r1, 16
mtlr %r0
blr
.section .ctors, "aw", @progbits
.long init
.long .Linit
.section .rodata
str_forwardingTargetForSelector_:
.Lstr_forwardingTargetForSelector_:
.asciz "forwardingTargetForSelector:"
.section .data
sel_forwardingTargetForSelector_:
.long str_forwardingTargetForSelector_, 0
.Lsel_forwardingTargetForSelector_:
.long .Lstr_forwardingTargetForSelector_, 0
.long 0, 0
symtab:
.long 0, sel_forwardingTargetForSelector_
.Lsymtab:
.long 0, .Lsel_forwardingTargetForSelector_
.short 0, 0
.long 0
.long 0
module:
.long 8, 16, 0, symtab
.Lmodule:
.long 8, 16, 0, .Lsymtab
#ifdef OF_PIC
.section .got2, "aw"
.Lbiased_got2 = .+0x8000
.Lgot_module:
.long module
.long .Lmodule
.Lgot_sel_forwardingTargetForSelector_:
.long sel_forwardingTargetForSelector_
.long .Lsel_forwardingTargetForSelector_
.Lgot_OFMethodNotFound:
.long OFMethodNotFound
.Lgot_OFMethodNotFound_stret:
.long OFMethodNotFound_stret
#endif
#if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD)
.section .note.GNU-stack, "", @progbits
#endif
|
Modified src/forwarding/forwarding-sparc-elf.S
from [40522bfc56]
to [a31829b32d].
︙ | | |
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
56
57
58
59
60
61
62
63
64
65
66
67
|
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
56
57
58
59
60
61
62
63
64
65
66
67
|
-
-
+
+
-
-
+
+
-
-
+
+
|
add %l7, %lo(_GLOBAL_OFFSET_TABLE_ + 4), %l7
#endif
mov %i0, %o0
call object_getClass
nop
sethi %hi(sel_forwardingTargetForSelector_), %o1
or %o1, %lo(sel_forwardingTargetForSelector_), %o1
sethi %hi(.Lsel_forwardingTargetForSelector_), %o1
or %o1, %lo(.Lsel_forwardingTargetForSelector_), %o1
#ifdef OF_PIC
ld [%l7 + %o1], %o1
#endif
call class_respondsToSelector
nop
cmp %o0, 0
be 0f
mov %i0, %o0
sethi %hi(sel_forwardingTargetForSelector_), %o1
or %o1, %lo(sel_forwardingTargetForSelector_), %o1
sethi %hi(.Lsel_forwardingTargetForSelector_), %o1
or %o1, %lo(.Lsel_forwardingTargetForSelector_), %o1
#ifdef OF_PIC
ld [%l7 + %o1], %o1
#endif
call objc_msg_lookup
nop
mov %o0, %l0
mov %i0, %o0
sethi %hi(sel_forwardingTargetForSelector_), %o1
or %o1, %lo(sel_forwardingTargetForSelector_), %o1
sethi %hi(.Lsel_forwardingTargetForSelector_), %o1
or %o1, %lo(.Lsel_forwardingTargetForSelector_), %o1
#ifdef OF_PIC
ld [%l7 + %o1], %o1
#endif
jmpl %l0, %o7
mov %i1, %o2
cmp %o0, 0
|
︙ | | |
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
-
-
+
+
-
-
+
+
-
-
+
+
|
add %l7, %lo(_GLOBAL_OFFSET_TABLE_ + 4), %l7
#endif
mov %i1, %o0
call object_getClass
nop
sethi %hi(sel_forwardingTargetForSelector_), %o1
or %o1, %lo(sel_forwardingTargetForSelector_), %o1
sethi %hi(.Lsel_forwardingTargetForSelector_), %o1
or %o1, %lo(.Lsel_forwardingTargetForSelector_), %o1
#ifdef OF_PIC
ld [%l7 + %o1], %o1
#endif
call class_respondsToSelector
nop
cmp %o0, 0
be 0f
mov %i1, %o0
sethi %hi(sel_forwardingTargetForSelector_), %o1
or %o1, %lo(sel_forwardingTargetForSelector_), %o1
sethi %hi(.Lsel_forwardingTargetForSelector_), %o1
or %o1, %lo(.Lsel_forwardingTargetForSelector_), %o1
#ifdef OF_PIC
ld [%l7 + %o1], %o1
#endif
call objc_msg_lookup
nop
mov %o0, %l0
mov %i1, %o0
sethi %hi(sel_forwardingTargetForSelector_), %o1
or %o1, %lo(sel_forwardingTargetForSelector_), %o1
sethi %hi(.Lsel_forwardingTargetForSelector_), %o1
or %o1, %lo(.Lsel_forwardingTargetForSelector_), %o1
#ifdef OF_PIC
ld [%l7 + %o1], %o1
#endif
jmpl %l0, %o7
mov %i2, %o2
cmp %o0, 0
|
︙ | | |
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
|
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
|
-
+
-
-
+
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
|
0:
call OFMethodNotFound_stret
restore
.type OFForward_stret, %function
.size OFForward_stret, .-OFForward_stret
init:
.Linit:
save %sp, -96, %sp
#ifdef OF_PIC
sethi %hi(_GLOBAL_OFFSET_TABLE_ - 4), %l7
call add_pc
add %l7, %lo(_GLOBAL_OFFSET_TABLE_ + 4), %l7
#endif
sethi %hi(module), %i0
or %i0, %lo(module), %i0
sethi %hi(.Lmodule), %i0
or %i0, %lo(.Lmodule), %i0
#ifdef OF_PIC
ld [%l7 + %i0], %i0
#endif
call __objc_exec_class
restore
#ifdef OF_PIC
add_pc:
jmp %o7 + 8
add %l7, %o7, %l7
#endif
#ifdef OF_SOLARIS
.section .init_array, "aw"
#else
.section .ctors, "aw", %progbits
#endif
.word init
.word .Linit
.section .rodata
str_forwardingTargetForSelector_:
.Lstr_forwardingTargetForSelector_:
.asciz "forwardingTargetForSelector:"
.section .data
sel_forwardingTargetForSelector_:
.word str_forwardingTargetForSelector_, 0
.Lsel_forwardingTargetForSelector_:
.word .Lstr_forwardingTargetForSelector_, 0
.word 0, 0
symtab:
.word 0, sel_forwardingTargetForSelector_
.Lsymtab:
.word 0, .Lsel_forwardingTargetForSelector_
.half 0, 0
.word 0
.word 0
module:
.word 8, 16, 0, symtab
.Lmodule:
.word 8, 16, 0, .Lsymtab
#if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD)
.section .note.GNU-stack, "", %progbits
#endif
|
Modified src/forwarding/forwarding-sparc64-elf.S
from [67cee61a30]
to [4ecc2cf437].
︙ | | |
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
-
+
-
-
+
+
-
-
+
+
-
-
+
+
|
std %f22, [%sp + BIAS + 264]
std %f24, [%sp + BIAS + 272]
std %f26, [%sp + BIAS + 280]
std %f28, [%sp + BIAS + 288]
std %f30, [%sp + BIAS + 296]
sethi %hi(_GLOBAL_OFFSET_TABLE_ - 4), %l7
call add_pc
call .LaddPC
add %l7, %lo(_GLOBAL_OFFSET_TABLE_ + 4), %l7
mov %i0, %o0
call object_getClass
nop
sethi %hi(sel_forwardingTargetForSelector_), %o1
or %o1, %lo(sel_forwardingTargetForSelector_), %o1
sethi %hi(.Lsel_forwardingTargetForSelector_), %o1
or %o1, %lo(.Lsel_forwardingTargetForSelector_), %o1
ldx [%l7 + %o1], %o1
call class_respondsToSelector
nop
brz,pn %o0, 0f
mov %i0, %o0
sethi %hi(sel_forwardingTargetForSelector_), %o1
or %o1, %lo(sel_forwardingTargetForSelector_), %o1
sethi %hi(.Lsel_forwardingTargetForSelector_), %o1
or %o1, %lo(.Lsel_forwardingTargetForSelector_), %o1
ldx [%l7 + %o1], %o1
call objc_msg_lookup
nop
mov %o0, %l0
mov %i0, %o0
sethi %hi(sel_forwardingTargetForSelector_), %o1
or %o1, %lo(sel_forwardingTargetForSelector_), %o1
sethi %hi(.Lsel_forwardingTargetForSelector_), %o1
or %o1, %lo(.Lsel_forwardingTargetForSelector_), %o1
ldx [%l7 + %o1], %o1
jmpl %l0, %o7
mov %i1, %o2
brz,pn %o0, 0f
cmp %o0, %i0
be,pn %xcc, 0f
|
︙ | | |
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
|
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
|
-
+
-
-
+
+
-
-
+
+
-
-
+
+
|
std %f22, [%sp + BIAS + 264]
std %f24, [%sp + BIAS + 272]
std %f26, [%sp + BIAS + 280]
std %f28, [%sp + BIAS + 288]
std %f30, [%sp + BIAS + 296]
sethi %hi(_GLOBAL_OFFSET_TABLE_ - 4), %l7
call add_pc
call .LaddPC
add %l7, %lo(_GLOBAL_OFFSET_TABLE_ + 4), %l7
mov %i1, %o0
call object_getClass
nop
sethi %hi(sel_forwardingTargetForSelector_), %o1
or %o1, %lo(sel_forwardingTargetForSelector_), %o1
sethi %hi(.Lsel_forwardingTargetForSelector_), %o1
or %o1, %lo(.Lsel_forwardingTargetForSelector_), %o1
ldx [%l7 + %o1], %o1
call class_respondsToSelector
nop
brz,pn %o0, 0f
mov %i1, %o0
sethi %hi(sel_forwardingTargetForSelector_), %o1
or %o1, %lo(sel_forwardingTargetForSelector_), %o1
sethi %hi(.Lsel_forwardingTargetForSelector_), %o1
or %o1, %lo(.Lsel_forwardingTargetForSelector_), %o1
ldx [%l7 + %o1], %o1
call objc_msg_lookup
nop
mov %o0, %l0
mov %i1, %o0
sethi %hi(sel_forwardingTargetForSelector_), %o1
or %o1, %lo(sel_forwardingTargetForSelector_), %o1
sethi %hi(.Lsel_forwardingTargetForSelector_), %o1
or %o1, %lo(.Lsel_forwardingTargetForSelector_), %o1
ldx [%l7 + %o1], %o1
jmpl %l0, %o7
mov %i2, %o2
brz,pn %o0, 0f
cmp %o0, %i1
be,pn %xcc, 0f
|
︙ | | |
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
|
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
|
-
+
-
+
-
-
+
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
|
0:
call OFMethodNotFound_stret
restore
.type OFForward_stret, %function
.size OFForward_stret, .-OFForward_stret
init:
.Linit:
save %sp, -176, %sp
sethi %hi(_GLOBAL_OFFSET_TABLE_ - 4), %l7
call add_pc
call .LaddPC
add %l7, %lo(_GLOBAL_OFFSET_TABLE_ + 4), %l7
sethi %hi(module), %i0
or %i0, %lo(module), %i0
sethi %hi(.Lmodule), %i0
or %i0, %lo(.Lmodule), %i0
ldx [%l7 + %i0], %i0
call __objc_exec_class
restore
add_pc:
.LaddPC:
jmp %o7 + 8
add %l7, %o7, %l7
#ifdef OF_SOLARIS
.section .init_array, "aw"
#else
.section .ctors, "aw", %progbits
#endif
.xword init
.xword .Linit
.section .rodata
str_forwardingTargetForSelector_:
.Lstr_forwardingTargetForSelector_:
.asciz "forwardingTargetForSelector:"
.section .data
sel_forwardingTargetForSelector_:
.xword str_forwardingTargetForSelector_, 0
.Lsel_forwardingTargetForSelector_:
.xword .Lstr_forwardingTargetForSelector_, 0
.xword 0, 0
symtab:
.xword 0, sel_forwardingTargetForSelector_
.Lsymtab:
.xword 0, .Lsel_forwardingTargetForSelector_
.half 0, 0
.word 0
.xword 0
module:
.xword 8, 32, 0, symtab
.Lmodule:
.xword 8, 32, 0, .Lsymtab
#if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD)
.section .note.GNU-stack, "", %progbits
#endif
|
Modified src/forwarding/forwarding-x86-elf.S
from [4b872d6763]
to [7d07165df3].
︙ | | |
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
56
57
58
59
60
61
62
63
|
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
56
57
58
59
60
61
62
63
|
-
+
-
+
-
+
-
+
|
OFForward:
push ebp
mov ebp, esp
push ebx
sub esp, 20
call getEIP
call .LgetEIP
add ebx, offset _GLOBAL_OFFSET_TABLE_
mov eax, [ebp + 8]
mov [esp], eax
call object_getClass@PLT
mov [esp], eax
lea eax, [ebx + sel_forwardingTargetForSelector_@GOTOFF]
lea eax, [ebx + .Lsel_forwardingTargetForSelector_@GOTOFF]
mov [esp + 4], eax
call class_respondsToSelector@PLT
test eax, eax
jz short 0f
mov eax, [ebp + 8]
mov [esp], eax
lea eax, [ebx + sel_forwardingTargetForSelector_@GOTOFF]
lea eax, [ebx + .Lsel_forwardingTargetForSelector_@GOTOFF]
mov [esp + 4], eax
call objc_msg_lookup@PLT
mov edx, [ebp + 8]
mov [esp], edx
lea edx, [ebx + sel_forwardingTargetForSelector_@GOTOFF]
lea edx, [ebx + .Lsel_forwardingTargetForSelector_@GOTOFF]
mov [esp + 4], edx
mov edx, [ebp + 12]
mov [esp + 8], edx
call eax
test eax, eax
jz short 0f
|
︙ | | |
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
|
-
+
-
+
-
+
-
+
|
OFForward_stret:
push ebp
mov ebp, esp
push ebx
sub esp, 20
call getEIP
call .LgetEIP
add ebx, offset _GLOBAL_OFFSET_TABLE_
mov eax, [ebp + 12]
mov [esp], eax
call object_getClass@PLT
mov [esp], eax
lea eax, [ebx + sel_forwardingTargetForSelector_@GOTOFF]
lea eax, [ebx + .Lsel_forwardingTargetForSelector_@GOTOFF]
mov [esp + 4], eax
call class_respondsToSelector@PLT
test eax, eax
jz short 0f
mov eax, [ebp + 12]
mov [esp], eax
lea eax, [ebx + sel_forwardingTargetForSelector_@GOTOFF]
lea eax, [ebx + .Lsel_forwardingTargetForSelector_@GOTOFF]
mov [esp + 4], eax
call objc_msg_lookup@PLT
mov edx, [ebp + 12]
mov [esp], edx
lea edx, [ebx + sel_forwardingTargetForSelector_@GOTOFF]
lea edx, [ebx + .Lsel_forwardingTargetForSelector_@GOTOFF]
mov [esp + 4], edx
mov edx, [ebp + 16]
mov [esp + 8], edx
call eax
test eax, eax
jz short 0f
|
︙ | | |
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
|
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
|
-
+
-
+
-
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
|
pop ebx
pop ebp
jmp eax
.type OFForward_stret, %function
.size OFForward_stret, .-OFForward_stret
init:
.Linit:
push ebp
mov ebp, esp
push ebx
sub esp, 4
call getEIP
call .LgetEIP
add ebx, offset _GLOBAL_OFFSET_TABLE_
lea eax, [ebx + module@GOTOFF]
lea eax, [ebx + .Lmodule@GOTOFF]
mov [esp], eax
call __objc_exec_class@PLT
add esp, 4
pop ebx
pop ebp
ret
getEIP:
.LgetEIP:
mov ebx, [esp]
ret
#ifdef OF_SOLARIS
.section .init_array, "aw"
#else
.section .ctors, "aw", %progbits
#endif
.long init
.long .Linit
.section .rodata
str_forwardingTargetForSelector_:
.Lstr_forwardingTargetForSelector_:
.asciz "forwardingTargetForSelector:"
.section .data
sel_forwardingTargetForSelector_:
.long str_forwardingTargetForSelector_, 0
.Lsel_forwardingTargetForSelector_:
.long .Lstr_forwardingTargetForSelector_, 0
.long 0, 0
symtab:
.long 0, sel_forwardingTargetForSelector_
.Lsymtab:
.long 0, .Lsel_forwardingTargetForSelector_
.short 0, 0
.long 0
.long 0
module:
.long 8, 16, 0, symtab
.Lmodule:
.long 8, 16, 0, .Lsymtab
#if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD)
.section .note.GNU-stack, "", %progbits
#endif
|
Modified src/forwarding/forwarding-x86-win32.S
from [c9c79ec3ea]
to [a9803a8051].
︙ | | |
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
56
57
58
|
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
56
57
58
|
-
+
-
+
-
+
|
sub esp, 20
mov eax, [ebp + 8]
mov [esp], eax
call _object_getClass
mov [esp], eax
mov eax, offset sel_forwardingTargetForSelector_
mov eax, offset .Lsel_forwardingTargetForSelector_
mov [esp + 4], eax
call _class_respondsToSelector
test eax, eax
jz short 0f
mov eax, [ebp + 8]
mov [esp], eax
mov eax, offset sel_forwardingTargetForSelector_
mov eax, offset .Lsel_forwardingTargetForSelector_
mov [esp + 4], eax
call _objc_msg_lookup
mov edx, [ebp + 8]
mov [esp], edx
mov edx, offset sel_forwardingTargetForSelector_
mov edx, offset .Lsel_forwardingTargetForSelector_
mov [esp + 4], edx
mov edx, [ebp + 12]
mov [esp + 8], edx
call eax
test eax, eax
jz short 0f
|
︙ | | |
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
|
-
+
-
+
-
+
|
sub esp, 20
mov eax, [ebp + 12]
mov [esp], eax
call _object_getClass
mov [esp], eax
mov eax, offset sel_forwardingTargetForSelector_
mov eax, offset .Lsel_forwardingTargetForSelector_
mov [esp + 4], eax
call _class_respondsToSelector
test eax, eax
jz short 0f
mov eax, [ebp + 12]
mov [esp], eax
mov eax, offset sel_forwardingTargetForSelector_
mov eax, offset .Lsel_forwardingTargetForSelector_
mov [esp + 4], eax
call _objc_msg_lookup
mov edx, [ebp + 12]
mov [esp], edx
mov edx, offset sel_forwardingTargetForSelector_
mov edx, offset .Lsel_forwardingTargetForSelector_
mov [esp + 4], edx
mov edx, [ebp + 16]
mov [esp + 8], edx
call eax
test eax, eax
jz short 0f
|
︙ | | |
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
|
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
|
-
+
-
+
-
+
-
+
-
-
+
+
-
-
+
+
-
-
+
+
|
jmp _OFMethodNotFound_stret
.def _OFForward_stret
.scl 2
.type 32
.endef
init:
.Linit:
push ebp
mov ebp, esp
push ebx
sub esp, 4
mov eax, offset module
mov eax, offset .Lmodule
mov [esp], eax
call ___objc_exec_class
add esp, 4
pop ebx
pop ebp
ret
.section .ctors, "aw"
.long init
.long .Linit
.section .rodata
str_forwardingTargetForSelector_:
.Lstr_forwardingTargetForSelector_:
.asciz "forwardingTargetForSelector:"
.section .data
sel_forwardingTargetForSelector_:
.long str_forwardingTargetForSelector_, 0
.Lsel_forwardingTargetForSelector_:
.long .Lstr_forwardingTargetForSelector_, 0
.long 0, 0
symtab:
.long 0, sel_forwardingTargetForSelector_
.Lsymtab:
.long 0, .Lsel_forwardingTargetForSelector_
.short 0, 0
.long 0
.long 0
module:
.long 8, 16, 0, symtab
.Lmodule:
.long 8, 16, 0, .Lsymtab
|
Modified src/runtime/lookup-asm/lookup-asm-amd64-elf.S
from [23159b41e1]
to [d1cf6bd700].
︙ | | |
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
-
+
|
.globl objc_msg_lookup_super
.globl objc_msg_lookup_super_stret
.section .text
.macro GENERATE_LOOKUP name notFound
\name:
test rdi, rdi
jz short returnNilMethod
jz short .LreturnNilMethod
test dil, 1
jnz short .LtaggedPointer_\name
mov r8, [rdi]
mov r8, [r8 + 64]
|
︙ | | |
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
|
-
+
-
-
+
+
-
+
|
.endm
.macro GENERATE_LOOKUP_SUPER name lookup
\name:
mov r8, rdi
mov rdi, [rdi]
test rdi, rdi
jz short returnNilMethod
jz short .LreturnNilMethod
mov r8, [r8 + 8]
mov r8, [r8 + 64]
jmp short .Lmain_\lookup
.type \name, %function
.size \name, .-\name
.endm
GENERATE_LOOKUP objc_msg_lookup objc_methodNotFound
GENERATE_LOOKUP objc_msg_lookup_stret objc_methodNotFound_stret
GENERATE_LOOKUP_SUPER objc_msg_lookup_super objc_msg_lookup
GENERATE_LOOKUP_SUPER objc_msg_lookup_super_stret objc_msg_lookup_stret
returnNilMethod:
lea rax, [rip + nilMethod]
.LreturnNilMethod:
lea rax, [rip + .LnilMethod]
ret
nilMethod:
.LnilMethod:
xor rax, rax
ret
#if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD)
.section .note.GNU-stack, "", %progbits
#endif
|
Modified src/runtime/lookup-asm/lookup-asm-amd64-macho.S
from [ca53a90db3]
to [b3182ba60d].
︙ | | |
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
|
-
+
|
.intel_syntax noprefix
.endmacro
.section __TEXT, __text, regular, pure_instructions
.macro GENERATE_LOOKUP
$0:
test rdi, rdi
jz returnNilMethod
jz LreturnNilMethod
test dil, 1
jnz LtaggedPointer_$0
mov r8, [rdi]
mov r8, [r8 + 64]
|
︙ | | |
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
-
+
-
-
+
+
-
+
|
.endmacro
.macro GENERATE_LOOKUP_SUPER
$0:
mov r8, rdi
mov rdi, [rdi]
test rdi, rdi
jz returnNilMethod
jz LreturnNilMethod
movq r8, [r8 + 8]
movq r8, [r8 + 64]
jmp Lmain_$1
.endmacro
GENERATE_LOOKUP _objc_msg_lookup, _objc_methodNotFound
GENERATE_LOOKUP _objc_msg_lookup_stret, _objc_methodNotFound_stret
GENERATE_LOOKUP_SUPER _objc_msg_lookup_super, _objc_msg_lookup
GENERATE_LOOKUP_SUPER _objc_msg_lookup_super_stret, _objc_msg_lookup_stret
returnNilMethod:
lea rax, [rip + nilMethod]
LreturnNilMethod:
lea rax, [rip + LnilMethod]
ret
nilMethod:
LnilMethod:
xor rax, rax
ret
|
Modified src/runtime/lookup-asm/lookup-asm-amd64-win64.S
from [56a0df9bbf]
to [2fecd29e3d].
︙ | | |
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
-
+
|
.globl objc_msg_lookup_super
.globl objc_msg_lookup_super_stret
.section .text
.macro GENERATE_LOOKUP name notFound
\name:
test rcx, rcx
jz short returnNilMethod
jz short .LreturnNilMethod
test cl, 1
jnz short .LtaggedPointer_\name
mov r8, [rcx]
mov r8, [r8 + 56]
|
︙ | | |
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
-
+
-
-
+
+
-
+
|
.endm
.macro GENERATE_LOOKUP_SUPER name lookup
\name:
mov r8, rcx
mov rcx, [rcx]
test rcx, rcx
jz short returnNilMethod
jz short .LreturnNilMethod
mov r8, [r8 + 8]
mov r8, [r8 + 56]
jmp short .Lmain_\lookup
.def \name
.scl 2
.type 32
.endef
.endm
GENERATE_LOOKUP objc_msg_lookup objc_methodNotFound
GENERATE_LOOKUP objc_msg_lookup_stret objc_methodNotFound_stret
GENERATE_LOOKUP_SUPER objc_msg_lookup_super objc_msg_lookup
GENERATE_LOOKUP_SUPER objc_msg_lookup_super_stret objc_msg_lookup_stret
returnNilMethod:
lea rax, [rip + nilMethod]
.LreturnNilMethod:
lea rax, [rip + .LnilMethod]
ret
nilMethod:
.LnilMethod:
xor rax, rax
ret
|
Modified src/runtime/lookup-asm/lookup-asm-arm-elf.S
from [30c6881b76]
to [2b6e55a11d].
︙ | | |
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
-
+
|
.globl objc_msg_lookup_super
.globl objc_msg_lookup_super_stret
.section .text
.macro GENERATE_LOOKUP name notFound
\name:
cmp r0, #0
beq returnNilMethod
beq .LreturnNilMethod
tst r0, #1
bne .LtaggedPointer_\name
ldr r2, [r0, #0]
ldr r2, [r2, #32]
|
︙ | | |
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
-
+
-
-
+
+
-
+
|
.endm
.macro GENERATE_LOOKUP_SUPER name lookup
\name:
mov r2, r0
ldr r0, [r0, #0]
cmp r0, #0
beq returnNilMethod
beq .LreturnNilMethod
ldr r2, [r2, #4]
ldr r2, [r2, #32]
b .Lmain_\lookup
.type \name, %function
.size \name, .-\name
.endm
GENERATE_LOOKUP objc_msg_lookup objc_methodNotFound
GENERATE_LOOKUP objc_msg_lookup_stret objc_methodNotFound_stret
GENERATE_LOOKUP_SUPER objc_msg_lookup_super objc_msg_lookup
GENERATE_LOOKUP_SUPER objc_msg_lookup_super_stret objc_msg_lookup_stret
returnNilMethod:
adr r0, nilMethod
.LreturnNilMethod:
adr r0, .LnilMethod
bx lr
nilMethod:
.LnilMethod:
mov r0, #0
bx lr
#if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD)
.section .note.GNU-stack, "", %progbits
#endif
|
Modified src/runtime/lookup-asm/lookup-asm-arm64-elf.S
from [761debfa49]
to [2db12deb2a].
︙ | | |
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
-
+
|
.globl objc_msg_lookup_stret
.globl objc_msg_lookup_super
.globl objc_msg_lookup_super_stret
.section .text
.macro GENERATE_LOOKUP name notFound
\name:
cbz x0, returnNilMethod
cbz x0, .LreturnNilMethod
tst x0, #1
b.ne .LtaggedPointer_\name
ldr x2, [x0]
ldr x2, [x2, #64]
|
︙ | | |
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
-
+
-
-
+
+
-
+
|
.size \name, .-\name
.endm
.macro GENERATE_LOOKUP_SUPER name lookup
\name:
mov x2, x0
ldr x0, [x0]
cbz x0, returnNilMethod
cbz x0, .LreturnNilMethod
ldr x2, [x2, #8]
ldr x2, [x2, #64]
b .Lmain_\lookup
.type \name, %function
.size \name, .-\name
.endm
GENERATE_LOOKUP objc_msg_lookup objc_methodNotFound
GENERATE_LOOKUP objc_msg_lookup_stret objc_methodNotFound_stret
GENERATE_LOOKUP_SUPER objc_msg_lookup_super objc_msg_lookup
GENERATE_LOOKUP_SUPER objc_msg_lookup_super_stret objc_msg_lookup_stret
returnNilMethod:
adr x0, nilMethod
.LreturnNilMethod:
adr x0, .LnilMethod
ret
nilMethod:
.LnilMethod:
mov x0, #0
ret
#if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD)
.section .note.GNU-stack, "", %progbits
#endif
|
Modified src/runtime/lookup-asm/lookup-asm-mips-elf.S
from [67d5199bae]
to [5d4df4c5f3].
︙ | | |
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
|
-
+
-
+
|
#endif
move $v0, $t0
jr $ra
0:
#ifdef OF_PIC
addiu $v0, $t9, nilMethod-\name
addiu $v0, $t9, .LnilMethod-\name
#else
la $v0, nilMethod
la $v0, .LnilMethod
#endif
jr $ra
#ifdef OF_PIC
1:
lui $gp, %hi(_gp_disp)
addiu $gp, $gp, %lo(_gp_disp)
|
︙ | | |
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
-
+
-
+
-
+
|
lw $t0, 32($t0)
addiu $t9, $t9, \lookup-\name
b .Lmain_\lookup
0:
#ifdef OF_PIC
addiu $v0, $t9, nilMethod-\name
addiu $v0, $t9, .LnilMethod-\name
#else
la $v0, nilMethod
la $v0, .LnilMethod
#endif
jr $ra
.type \name, %function
.size \name, .-\name
.endm
GENERATE_LOOKUP objc_msg_lookup objc_methodNotFound
GENERATE_LOOKUP objc_msg_lookup_stret objc_methodNotFound_stret
GENERATE_LOOKUP_SUPER objc_msg_lookup_super objc_msg_lookup
GENERATE_LOOKUP_SUPER objc_msg_lookup_super_stret objc_msg_lookup_stret
nilMethod:
.LnilMethod:
move $v0, $zero
jr $ra
#if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD)
.section .note.GNU-stack, "", %progbits
#endif
|
Modified src/runtime/lookup-asm/lookup-asm-mips64-n64-elf.S
from [b34841fe09]
to [79d05fd5cc].
︙ | | |
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
-
+
|
move $v0, $t0
jr $ra
0:
lui $v0, %hi(%neg(%gp_rel(\name)))
daddiu $v0, $v0, %lo(%neg(%gp_rel(\name)))
daddu $v0, $v0, $t9
ld $v0, %got_disp(nilMethod)($v0)
ld $v0, %got_disp(.LnilMethod)($v0)
jr $ra
1:
lui $t0, %hi(%neg(%gp_rel(\name)))
daddiu $t0, $t0, %lo(%neg(%gp_rel(\name)))
daddu $t0, $t0, $t9
ld $t9, %got_disp(\notFound)($t0)
|
︙ | | |
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
|
-
+
-
+
|
daddiu $t9, $t9, \lookup-\name
b .Lmain_\lookup
0:
lui $v0, %hi(%neg(%gp_rel(\name)))
daddiu $v0, $v0, %lo(%neg(%gp_rel(\name)))
daddu $v0, $v0, $t9
ld $v0, %got_disp(nilMethod)($v0)
ld $v0, %got_disp(.LnilMethod)($v0)
jr $ra
.type \name, %function
.size \name, .-\name
.endm
GENERATE_LOOKUP objc_msg_lookup objc_methodNotFound
GENERATE_LOOKUP objc_msg_lookup_stret objc_methodNotFound_stret
GENERATE_LOOKUP_SUPER objc_msg_lookup_super objc_msg_lookup
GENERATE_LOOKUP_SUPER objc_msg_lookup_super_stret objc_msg_lookup_stret
nilMethod:
.LnilMethod:
move $v0, $zero
jr $ra
#if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD)
.section .note.GNU-stack, "", %progbits
#endif
|
Modified src/runtime/lookup-asm/lookup-asm-powerpc-elf.S
from [3fdc637787]
to [131ef264f4].
︙ | | |
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
-
+
|
.globl objc_msg_lookup_super
.globl objc_msg_lookup_super_stret
.section .text
.macro GENERATE_LOOKUP name notFound
\name:
cmpwi %r3, 0
beq- returnNilMethod
beq- .LreturnNilMethod
andi. %r0, %r3, 1
bne- .LtaggedPointer_\name
lwz %r5, 0(%r3)
lwz %r5, 32(%r5)
|
︙ | | |
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
-
+
-
+
-
+
-
+
-
+
-
+
|
.endm
.macro GENERATE_LOOKUP_SUPER name lookup
\name:
mr %r5, %r3
lwz %r3, 0(%r3)
cmpwi %r3, 0
beq- returnNilMethod
beq- .LreturnNilMethod
lwz %r5, 4(%r5)
lwz %r5, 32(%r5)
b .Lmain_\lookup
.type \name, @function
.size \name, .-\name
.endm
GENERATE_LOOKUP objc_msg_lookup objc_methodNotFound
GENERATE_LOOKUP objc_msg_lookup_stret objc_methodNotFound_stret
GENERATE_LOOKUP_SUPER objc_msg_lookup_super objc_msg_lookup
GENERATE_LOOKUP_SUPER objc_msg_lookup_super_stret objc_msg_lookup_stret
returnNilMethod:
.LreturnNilMethod:
mflr %r0
bl getPC
bl .LgetPC
mtlr %r0
0:
addi %r3, %r3, nilMethod-0b
addi %r3, %r3, .LnilMethod-0b
blr
nilMethod:
.LnilMethod:
li %r3, 0
blr
getPC:
.LgetPC:
mflr %r3
blr
#ifdef OF_PIC
.section .got2, "aw"
.Lbiased_got2 = .+0x8000
.Lgot_objc_methodNotFound:
|
︙ | | |
Modified src/runtime/lookup-asm/lookup-asm-powerpc64-elf.S
from [0383174096]
to [44421eb613].
︙ | | |
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
|
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
|
-
-
+
+
-
-
-
-
+
+
+
+
-
+
-
-
+
+
|
GENERATE_LOOKUP objc_msg_lookup objc_methodNotFound
GENERATE_LOOKUP objc_msg_lookup_stret objc_methodNotFound_stret
GENERATE_LOOKUP_SUPER objc_msg_lookup_super objc_msg_lookup
GENERATE_LOOKUP_SUPER objc_msg_lookup_super_stret objc_msg_lookup_stret
.LreturnNilMethod:
addis %r3, %r2, nilMethod@toc@ha
addi %r3, %r3, nilMethod@toc@l
addis %r3, %r2, .LnilMethod@toc@ha
addi %r3, %r3, .LnilMethod@toc@l
blr
#if defined(_CALL_ELF) && _CALL_ELF == 2
nilMethod:
addis %r2, %r12, .TOC.-nilMethod@ha
addi %r2, %r2, .TOC.-nilMethod@l
.localentry nilMethod, .-nilMethod
.LnilMethod:
addis %r2, %r12, .TOC.-.LnilMethod@ha
addi %r2, %r2, .TOC.-.LnilMethod@l
.localentry .LnilMethod, .-.LnilMethod
#else
.section .opd, "aw", @progbits
nilMethod:
.LnilMethod:
.p2align 3
.quad .Lbegin_nilMethod
.quad .TOC.@tocbase
.quad 0
.section .text
#endif
.Lbegin_nilMethod:
li %r3, 0
blr
.type nilMethod, @function
.size nilMethod, .-.Lbegin_nilMethod
.type .LnilMethod, @function
.size .LnilMethod, .-.Lbegin_nilMethod
#if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD)
.section .note.GNU-stack, "", @progbits
#endif
|
Modified src/runtime/lookup-asm/lookup-asm-sparc-elf.S
from [06d51d4229]
to [be37fefc0d].
︙ | | |
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
-
+
|
.globl objc_msg_lookup_super
.globl objc_msg_lookup_super_stret
.section .text
.macro GENERATE_LOOKUP name notFound
\name:
tst %o0
bz returnNilMethod
bz .LreturnNilMethod
btst 1, %o0
bnz .LtaggedPointer_\name
nop
ld [%o0], %o2
ld [%o2 + 32], %o2
|
︙ | | |
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
-
+
-
+
-
-
+
+
-
+
-
+
-
+
|
.endm
.macro GENERATE_LOOKUP_SUPER name lookup
\name:
mov %o0, %o2
ld [%o0], %o0
cmp %o0, 0
be returnNilMethod
be .LreturnNilMethod
nop
ld [%o2 + 4], %o2
ba .Lmain_\lookup
ld [%o2 + 32], %o2
.type \name, %function
.size \name, .-\name
.endm
GENERATE_LOOKUP objc_msg_lookup objc_methodNotFound
GENERATE_LOOKUP objc_msg_lookup_stret objc_methodNotFound_stret
GENERATE_LOOKUP_SUPER objc_msg_lookup_super objc_msg_lookup
GENERATE_LOOKUP_SUPER objc_msg_lookup_super_stret objc_msg_lookup_stret
returnNilMethod:
.LreturnNilMethod:
#ifdef OF_PIC
mov %o7, %g1
sethi %hi(_GLOBAL_OFFSET_TABLE_ - 4), %o1
call 0f
add %o1, %lo(_GLOBAL_OFFSET_TABLE_ + 4), %o1
0:
add %o7, %o1, %o1
sethi %hi(nilMethod), %o0
or %o0, %lo(nilMethod), %o0
sethi %hi(.LnilMethod), %o0
or %o0, %lo(.LnilMethod), %o0
jmpl %g1 + 8, %g0
ld [%o1 + %o0], %o0
#else
sethi %hi(nilMethod), %o0
sethi %hi(.LnilMethod), %o0
retl
or %o0, %lo(nilMethod), %o0
or %o0, %lo(.LnilMethod), %o0
#endif
nilMethod:
.LnilMethod:
retl
clr %o0
#if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD)
.section .note.GNU-stack, "", %progbits
#endif
|
Modified src/runtime/lookup-asm/lookup-asm-sparc64-elf.S
from [bf52d34777]
to [e9f5517a42].
︙ | | |
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
-
+
|
.globl objc_msg_lookup_stret
.globl objc_msg_lookup_super
.globl objc_msg_lookup_super_stret
.section .text
.macro GENERATE_LOOKUP name notFound
\name:
brz,pn %o0, returnNilMethod
brz,pn %o0, .LreturnNilMethod
and %o0, 1, %o2
brnz,pn %o2, .LtaggedPointer_\name
nop
ldx [%o0], %o2
ldx [%o2 + 64], %o2
|
︙ | | |
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
-
+
-
+
-
-
+
+
-
+
-
+
-
+
|
.size \name, .-\name
.endm
.macro GENERATE_LOOKUP_SUPER name lookup
\name:
mov %o0, %o2
ldx [%o0], %o0
brz,pn %o0, returnNilMethod
brz,pn %o0, .LreturnNilMethod
nop
ldx [%o2 + 8], %o2
ba .Lmain_\lookup
ldx [%o2 + 64], %o2
.type \name, %function
.size \name, .-\name
.endm
GENERATE_LOOKUP objc_msg_lookup objc_methodNotFound
GENERATE_LOOKUP objc_msg_lookup_stret objc_methodNotFound_stret
GENERATE_LOOKUP_SUPER objc_msg_lookup_super objc_msg_lookup
GENERATE_LOOKUP_SUPER objc_msg_lookup_super_stret objc_msg_lookup_stret
returnNilMethod:
.LreturnNilMethod:
#ifdef OF_PIC
mov %o7, %g1
sethi %hi(_GLOBAL_OFFSET_TABLE_ - 4), %o1
call 0f
or %o1, %lo(_GLOBAL_OFFSET_TABLE_ + 4), %o1
0:
add %o7, %o1, %o1
sethi %hi(nilMethod), %o0
or %o0, %lo(nilMethod), %o0
sethi %hi(.LnilMethod), %o0
or %o0, %lo(.LnilMethod), %o0
jmpl %g1 + 8, %g0
ldx [%o1 + %o0], %o0
#else
sethi %hi(nilMethod), %o0
sethi %hi(.LnilMethod), %o0
retl
or %o0, %lo(nilMethod), %o0
or %o0, %lo(.LnilMethod), %o0
#endif
nilMethod:
.LnilMethod:
retl
clr %o0
#if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD)
.section .note.GNU-stack, "", %progbits
#endif
|
Modified src/runtime/lookup-asm/lookup-asm-x86-elf.S
from [a240f9cb41]
to [cd6507b46d].
︙ | | |
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
-
+
|
.globl objc_msg_lookup_super_stret
.section .text
.macro GENERATE_LOOKUP name notFound
\name:
mov edx, [esp + 4]
test edx, edx
jz short returnNilMethod
jz short .LreturnNilMethod
test dl, 1
jnz short .LtaggedPointer_\name
mov edx, [edx]
mov edx, [edx + 32]
|
︙ | | |
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
|
-
+
-
+
|
test eax, eax
jz short 0f
ret
0:
call getEIP
call .LgetEIP
add eax, offset _GLOBAL_OFFSET_TABLE_
mov eax, [eax + \notFound@GOT]
jmp eax
.LtaggedPointer_\name:
call getEIP
call .LgetEIP
add eax, offset _GLOBAL_OFFSET_TABLE_
mov ecx, [eax + objc_taggedPointerSecret@GOT]
xor edx, [ecx]
and dl, 0xE
movzx edx, dl
|
︙ | | |
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
-
+
-
-
+
+
-
+
-
+
-
+
|
.endm
.macro GENERATE_LOOKUP_SUPER name lookup
\name:
mov edx, [esp + 4]
mov eax, [edx]
test eax, eax
jz short returnNilMethod
jz short .LreturnNilMethod
mov [esp + 4], eax
mov edx, [edx + 4]
mov edx, [edx + 32]
jmp short .Lmain_\lookup
.type \name, %function
.size \name, .-\name
.endm
GENERATE_LOOKUP objc_msg_lookup objc_methodNotFound
GENERATE_LOOKUP objc_msg_lookup_stret objc_methodNotFound_stret
GENERATE_LOOKUP_SUPER objc_msg_lookup_super objc_msg_lookup
GENERATE_LOOKUP_SUPER objc_msg_lookup_super_stret objc_msg_lookup_stret
returnNilMethod:
call getEIP
.LreturnNilMethod:
call .LgetEIP
add eax, offset _GLOBAL_OFFSET_TABLE_
lea eax, [eax + nilMethod@GOTOFF]
lea eax, [eax + .LnilMethod@GOTOFF]
ret
nilMethod:
.LnilMethod:
xor eax, eax
ret
getEIP:
.LgetEIP:
mov eax, [esp]
ret
#if defined(OF_LINUX) || defined(OF_HAIKU) || defined(OF_HURD)
.section .note.GNU-stack, "", %progbits
#endif
|
Modified src/runtime/lookup-asm/lookup-asm-x86-win32.S
from [045420d8bf]
to [d9ae57eae0].
︙ | | |
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
-
+
|
.globl _objc_msg_lookup_super_stret
.section .text
.macro GENERATE_LOOKUP name notFound
\name:
mov edx, [esp + 4]
test edx, edx
jz short returnNilMethod
jz short .LreturnNilMethod
test dl, 1
jnz short .LtaggedPointer_\name
mov edx, [edx]
mov edx, [edx + 32]
|
︙ | | |
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
-
+
-
-
+
+
-
+
|
.endm
.macro GENERATE_LOOKUP_SUPER name lookup
\name:
mov edx, [esp + 4]
mov eax, [edx]
test eax, eax
jz short returnNilMethod
jz short .LreturnNilMethod
mov [esp + 4], eax
mov edx, [edx + 4]
mov edx, [edx + 32]
jmp short .Lmain_\lookup
.def \name
.scl 2
.type 32
.endef
.endm
GENERATE_LOOKUP _objc_msg_lookup _objc_methodNotFound
GENERATE_LOOKUP _objc_msg_lookup_stret _objc_methodNotFound_stret
GENERATE_LOOKUP_SUPER _objc_msg_lookup_super _objc_msg_lookup
GENERATE_LOOKUP_SUPER _objc_msg_lookup_super_stret _objc_msg_lookup_stret
returnNilMethod:
mov eax, offset nilMethod
.LreturnNilMethod:
mov eax, offset .LnilMethod
ret
nilMethod:
.LnilMethod:
xor eax, eax
ret
|