Ошибка селектора при использовании ARM в сборе для достижения цели-c Метод
Я хочу использовать сборку ARM для достижения метода target-c, например:
NSLog(@"%@",objc_msgSend((id)objc_getClass("NSString"),sel_registerName("stringWithUTF8String:"),"abcdefg"));
поэтому я написал такую программу сборки:
.data
.align 4
output_str:
.string "The answer is right"
nsstring:
.string "NSString"
stringWithUTF8String:
.string "stringWithUTF8String:"
.text
.align 4
.globl _my_arm_test
.globl _my_thumb_test
.globl _my_arm_test2
.extern _printf
.extern _objc_getClass
.extern _objc_msgSend
.extern _NSLog
.extern _sel_getUid
.extern _sel_registerName
.arm
.align 4
_my_arm_test2:
push {r0,lr}
sub sp, #0x28
ldr r0,=stringWithUTF8String
bl _sel_registerName
cmp r0,0
beq out
str r0, [sp]
ldr r1, [sp]
ldr r0, =nsstring
bl _objc_getClass
ldr r2,=output_str
bl _objc_msgSend
bl _NSLog
out:
add sp, #0x28
pop {r0,pc}
программа может работать, но я обнаружил следующую ошибку, которая показала, что с селектором что-то не так:
*** NSForwarding: warning: selector (0x3a43b0b0) for message '' does not match selector known to Objective C runtime (0x200be0)-- abort
И я уверен, что возвращение _sel_registerName является правильным, так что было что-то еще, что я проигнорировал????
1 ответ
ДА, я решил эту проблему. Ключевым моментом является то, что метод objc_getClass изменит значение для r1...... однако этому методу нужен только один параметр и вернется объект Class. Я продолжу его исследовать.