内联汇编使用objMsgSend调用静态函数出错

 __asm__ volatile(
                  "mov x0, %[testClassAddr]\n"
                  "mov x1, %[pShareInstanceStr]\n"
                  "mov x21, %[objecMsgSendStubAddr]\n"
                  "BLR x21\n"
                  "mov %[test_object],x0\n"
                  :[test_object]"=r"(test_object)
                  : [testClassAddr]"r"(testClassAddr),[pShareInstanceStr]"r"(pShareInstanceStr),[objecMsgSendStubAddr]"r"(objecMsgSendStubAddr)
                  :"x0","x1","x21"
                  );

直接崩溃
*** NSForwarding: warning: selector (0x105c81057) for message ‘shareInstance’ does not match selector known to Objective C runtime (0x196ac5910)-- abort

+[Test shareInstance]: unrecognized selector sent to class 0x104898eb0

其实就是调用 +[Test shareInstance] 函数
x0的地址肯定是正确 x0是类 Test的指针 shareInstance也是实现的
我的实现方法可能有问题 新手求指教 :rofl: :rofl:

1 个赞

注入的环境

ObjC的SEL严格意义上不完全是字符串,必须由ObjC运行时返回的SEL才能使用,我猜是这个原因?

另外, ObjC 的Underlying有很多很多细节由运行时和编译器在你看不到的地方帮你完成了, 你想做的大概率不是什么好主意

1 个赞

太感谢了 改成你说的用系统内存中的字符串可以正常调用了

objc_selrefs:0000000004707820 selRef_shareInstance DCQ sel_shareInstance

“LDR x1,[%[shareInstanceStrRefAddr]]\n”

正确的做法是用sel_registerName返回的指针

1 个赞

好的 感谢 我试试 刚才android转过来学习不太懂 :joy: :joy: