首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >j__objc_msgSend和objc_msgSend有什么区别?

j__objc_msgSend和objc_msgSend有什么区别?
EN

Stack Overflow用户
提问于 2013-10-18 08:50:31
回答 1查看 250关注 0票数 1

我很惊讶搜索j__objc_msgSend会在堆栈溢出上返回0的结果,而且Google似乎也不太了解它。根据拆解的说法,j__objc_msgSend只调用objc_msgSend,那么既然已经有了objc_msgSend,为什么还需要j__objc_msgSend呢?总的来说,j__objc_msgSend和objc_msgSend有什么区别?

具体来说,在这个屏幕截图中,最右边的分支以“函数的结束”结尾,而最左边的分支没有“函数的结束”,两者有什么区别?这和j__objc_msgSend有关吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-21 20:32:05

  1. 这是ARM RISC代码,ARM的首选编程模式是相对的--不要使用绝对地址,总是使用“IP+/-偏移量”。在这里,被调用的地址超出了直接调用或跳转的范围,编译器使用了他能找到的最接近的地址。它增加了一个额外的跳转(或超过1!)但它是独立的位置。(*) 编译器不能用简单的指令构造到目标地址的跳转,因为您不能立即用RISC程序集加载每个可能的2^32数字。
  2. 如果例程objc_msgSend自己返回,那么这就相当于call objc_msgSend; return --只是更短。从当前函数的角度来看,这两种形式都只执行一次“返回”。

(*)你可以在拆卸截图中看到(?)为什么不发短信?)该R12将加载目标地址和当前地址之间的差异。这个差异是由编译器计算的;在最初的二进制文件中,它不显示为减法,这就是IDA的工作。然后,差异被添加到当前的地址--不管这是什么!即时值objc_msgSend - 0x1AE030使用少量的位,可以在一条指令中加载到R12中(您应该熟悉ARM RISC的特性)。

如果您想知道j__label语法:这只是IDA,告诉您这是直接跳转到一个已知的标签。想必,如果您的代码足够长,您可能会发现到这个标签的距离又太大了,所以您可能会找到j__j__objc_msgSend

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19445381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档