@@ -15,165 +15,163 @@ #include "config.h" #include "platform.h" -.intel_syntax noprefix - -.globl of_forward -.globl of_forward_stret - -.section .text -of_forward: - push ebp - mov ebp, esp - - push ebx - sub esp, 20 - - call get_eip - 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] - 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] - mov [esp+4], eax - call objc_msg_lookup@PLT - - mov edx, [ebp+8] - mov [esp], edx - lea edx, [ebx+sel_forwardingTargetForSelector_@GOTOFF] - mov [esp+4], edx - mov edx, [ebp+12] - mov [esp+8], edx - call eax - - test eax, eax - jz short 0f - cmp eax, [ebp+8] - je short 0f - - mov [ebp+8], eax - mov [esp], eax - mov eax, [ebp+12] - mov [esp+4], eax - call objc_msg_lookup@PLT - - add esp, 20 - pop ebx - pop ebp - - jmp eax - -0: - lea eax, [ebx+of_method_not_found@GOTOFF] - - add esp, 20 - pop ebx - pop ebp - - jmp eax -.type of_forward, %function -.size of_forward, .-of_forward - -of_forward_stret: - push ebp - mov ebp, esp - - push ebx - sub esp, 20 - - call get_eip - 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] - 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] - mov [esp+4], eax - call objc_msg_lookup@PLT - - mov edx, [ebp+12] - mov [esp], edx - lea edx, [ebx+sel_forwardingTargetForSelector_@GOTOFF] - mov [esp+4], edx - mov edx, [ebp+16] - mov [esp+8], edx - call eax - - test eax, eax - jz short 0f - cmp eax, [ebp+12] - je short 0f - - mov [ebp+12], eax - mov [esp], eax - mov eax, [ebp+16] - mov [esp+4], eax - call objc_msg_lookup_stret@PLT - - add esp, 20 - pop ebx - pop ebp - - jmp eax - -0: - lea eax, [ebx+of_method_not_found_stret@GOTOFF] - - add esp, 20 - pop ebx - pop ebp - - jmp eax -.type of_forward_stret, %function -.size of_forward_stret, .-of_forward_stret - -init: - push ebp - mov ebp, esp - - push ebx - sub esp, 4 - - call get_eip - add ebx, offset _GLOBAL_OFFSET_TABLE_ - - lea eax, [ebx+module@GOTOFF] - mov [esp], eax - call __objc_exec_class@PLT - - add esp, 4 - pop ebx - pop ebp +.globl OFForward +.globl OFForward_stret + +.section .text +OFForward: + pushl %ebp + movl %esp, %ebp + + pushl %ebx + subl $20, %esp + + call get_eip + addl $_GLOBAL_OFFSET_TABLE_, %ebx + + movl 8(%ebp), %eax + movl %eax, (%esp) + call object_getClass@PLT + + movl %eax, (%esp) + leal sel_forwardingTargetForSelector_@GOTOFF(%ebx), %eax + movl %eax, 4(%esp) + call class_respondsToSelector@PLT + + testl %eax, %eax + jz 0f + + movl 8(%ebp), %eax + movl %eax, (%esp) + leal sel_forwardingTargetForSelector_@GOTOFF(%ebx), %eax + movl %eax, 4(%esp) + call objc_msg_lookup@PLT + + movl 8(%ebp), %edx + movl %edx, (%esp) + leal sel_forwardingTargetForSelector_@GOTOFF(%ebx), %edx + movl %edx, 4(%esp) + movl 12(%ebp), %edx + movl %edx, 8(%esp) + call *%eax + + testl %eax, %eax + jz 0f + cmpl 8(%ebp), %eax + je 0f + + movl %eax, 8(%ebp) + movl %eax, (%esp) + movl 12(%ebp), %eax + movl %eax, 4(%esp) + call objc_msg_lookup@PLT + + addl $20, %esp + popl %ebx + popl %ebp + + jmp *%eax + +0: + leal OFMethodNotFound@GOTOFF(%ebx), %eax + + addl $20, %esp + popl %ebx + popl %ebp + + jmp *%eax +.type OFForward, %function +.size OFForward, .-OFForward + +OFForward_stret: + pushl %ebp + movl %esp, %ebp + + pushl %ebx + subl $20, %esp + + call get_eip + addl $_GLOBAL_OFFSET_TABLE_, %ebx + + movl 12(%ebp), %eax + movl %eax, (%esp) + call object_getClass@PLT + + movl %eax, (%esp) + leal sel_forwardingTargetForSelector_@GOTOFF(%ebx), %eax + movl %eax, 4(%esp) + call class_respondsToSelector@PLT + + testl %eax, %eax + jz 0f + + movl 12(%ebp), %eax + movl %eax, (%esp) + leal sel_forwardingTargetForSelector_@GOTOFF(%ebx), %eax + movl %eax, 4(%esp) + call objc_msg_lookup@PLT + + movl 12(%ebp), %edx + movl %edx, (%esp) + leal sel_forwardingTargetForSelector_@GOTOFF(%ebx), %edx + movl %edx, 4(%esp) + movl 16(%ebp), %edx + movl %edx, 8(%esp) + call *%eax + + testl %eax, %eax + jz 0f + cmpl 12(%ebp), %eax + je 0f + + movl %eax, 12(%ebp) + movl %eax, (%esp) + movl 16(%ebp), %eax + movl %eax, 4(%esp) + call objc_msg_lookup_stret@PLT + + addl $20, %esp + popl %ebx + popl %ebp + + jmp *%eax + +0: + leal OFMethodNotFound_stret@GOTOFF(%ebx), %eax + + addl $20, %esp + popl %ebx + popl %ebp + + jmp *%eax +.type OFForward_stret, %function +.size OFForward_stret, .-OFForward_stret + +init: + pushl %ebp + movl %esp, %ebp + + pushl %ebx + subl $4, %esp + + call get_eip + addl $_GLOBAL_OFFSET_TABLE_, %ebx + + leal module@GOTOFF(%ebx), %eax + movl %eax, (%esp) + call __objc_exec_class@PLT + + addl $4, %esp + popl %ebx + popl %ebp ret get_eip: - mov ebx, [esp] + movl (%esp), %ebx ret #ifdef OF_SOLARIS .section .init_array, "aw" #else