clang, libojc, dyld 的关系
clang 可以 -rewrite-objc
libobjc.A.dylib 是一个动态库,向上是OC的运行时环境,
MachO 编译完成时,会看到 _objc_classname, _objc_methodname, _objc_methtype section
IDA查看libojc.A.dylib , 发现道出了大量 __objc_*
的接口和少量的数据,所以肯定确定 clang 在编译 oc文件的时候,会把oc转换成c/c++接口进行编译。
OC类,可以视为带方法的结构体,并且结构体里存储的是方法的指针,以保证运行时可以rebind的特性。
所以在MachO里可以存储类的结构,在OC运行时环境加载时,runtime环境会初始化程序内部的oc类。
一些好文章:
https://juejin.im/post/6874391520334577677 Clang Rewrite视角OC类结构分析与部分常见考点
https://juejin.im/post/6846687597478019079 WWDC20 iOS14 Runtime优化
https://developer.apple.com/videos/play/wwdc2020/10163/ wwdc2020
https://github.com/draveness/analyze/blob/master/contents/objc/%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90%20ObjC%20%E4%B8%AD%E6%96%B9%E6%B3%95%E7%9A%84%E7%BB%93%E6%9E%84.md#%E6%B7%B1%E5%85%A5%E8%A7%A3%E6%9E%90-objc-%E4%B8%AD%E6%96%B9%E6%B3%95%E7%9A%84%E7%BB%93%E6%9E%84
深入解析-objc-中方法的结构
objc4源码: https://opensource.apple.com/source/objc4/
编译 libobjc: https://www.jianshu.com/p/28150fa0c085
TODO:
OC了解runtime版本间的代码差异 diff
看 深入解析-objc-中方法的结构
找一下Mach-o文件结构的资料
了解dyld
fishhook