我很惊讶搜索j__objc_msgSend会在堆栈溢出上返回0的结果,而且Google似乎也不太了解它。根据拆解的说法,j__objc_msgSend只调用objc_msgSend,那么既然已经有了objc_msgSend,为什么还需要j__objc_msgSend呢?总的来说,j__objc_msgSend和objc_msgSend有什么区别?
具体来说,在这个屏幕截图中,最右边的分支以“函数的结束”结尾,而最左边的分支没有“函数的结束”,两者有什么区别?这和j__objc_msgSend有关吗?
发布于 2013-10-21 20:32:05
objc_msgSend自己返回,那么这就相当于call objc_msgSend; return --只是更短。从当前函数的角度来看,这两种形式都只执行一次“返回”。(*)你可以在拆卸截图中看到(?)为什么不发短信?)该R12将加载目标地址和当前地址之间的差异。这个差异是由编译器计算的;在最初的二进制文件中,它不显示为减法,这就是IDA的工作。然后,差异被添加到当前的地址--不管这是什么!即时值objc_msgSend - 0x1AE030使用少量的位,可以在一条指令中加载到R12中(您应该熟悉ARM RISC的特性)。
如果您想知道j__的label语法:这只是IDA,告诉您这是直接跳转到一个已知的标签。想必,如果您的代码足够长,您可能会发现到这个标签的距离又太大了,所以您可能会找到j__j__objc_msgSend。
https://stackoverflow.com/questions/19445381
复制相似问题