Ошибка селектора при использовании 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. Я продолжу его исследовать.

Другие вопросы по тегам