美文网首页OC底层
OC 探索底层原理

OC 探索底层原理

作者: H丶ym | 来源:发表于2020-09-11 12:01 被阅读0次

    OC底层原理学习

    NSObjectalloc为列,我们只能跟到NSObject.h的头文件里


    一般到这也就结束了,接下来介绍三种方法可以让我们继续往下探索和学习

    符号断点

    添加一个alloc的符号断点



    我们可以看到 alloc 的源码在libobjc.A.dylib库中

    使用Step into按钮+符号断点

    Step into 按钮如图


    长按control点击Step into 按钮,点击三次

    再添加符号断点objc_alloc

    汇编跟流程

    xcode 工具栏 选择Debug --> Debug Workflow --> Always Show Disassembly,这个 选项表示 始终显示反汇编 ,即 通过汇编 跟流程



    已经看到接下来要走objc_alloc,再去添加符号断点就可以了

    编译libobjc.A.dylib

    1、Apple 所有开源源码汇总地址,根据相应的版本查找对应的源码,以mac 10.15为例: macOS --> 10.15 --> 选择10.15 --> 搜索 objc
    2、Apple 比较直接的源码下载地址,直接搜索想要下载的源码名称即可,例如objc直接搜索 objc --> objc4/ --> 选择相应的objc的版本

    我们这里下载 objc4-781.tar.gz,解压缩、编译、报错 😆
    底层的探索要不急不燥

    依赖文件

    image.png
    launchd-106.10Mac OS X 10.4.4中下载
    其它的在Mac OS X 10.15中下载

    错误:unable to find sdk 'macosx.internal'


    解决方法
    截屏2020-09-11 下午2.15.32.png

    错误:'***.*' file not found
    解决方法

    • objc4-781的根目录下新建Common文件
    • 设置 header path,添加$(SRCROOT)/Common
    • 在Common文件中创建sys文件
      xnu-6153.11.26/bsd/sys/reason.h文件拷贝到sys文件中

    • 在Common文件中创建mach-o文件
      dyld-733.6/include/mach-o/dyld_priv.h文件拷贝到mach-o文件中
      打开dyld_priv.h,添加代码

    #define DYLD_MACOSX_VERSION_10_11 0x000A0B00
    #define DYLD_MACOSX_VERSION_10_12 0x000A0C00
    #define DYLD_MACOSX_VERSION_10_13 0x000A0D00
    #define DYLD_MACOSX_VERSION_10_14 0x000A0E00
    
    • 在Common文件中创建pthread文件
      libpthread-416.11.1/private/mach-o/tsd_private.h和spinlock_private.h文件拷贝到pthread文件中
    • 在Common文件中创建System文件,在System文件创建machine文件
      下载pthread_machdep.h文件
      Libc-583/pthreads/pthread_machdep.h拷贝到System文件中
      xnu6153.11.26/osfmk/machine/cpu_capabilities.h文件拷贝到machine文件中
    • 在Common文件中创建os文件
      xnu6153.11.26/libsyscall/os/tsd.h文件拷贝到os文件中
    • 下载Libc-825.24
      Libc-825.24/include/CrashReporterClient.h拷贝到Common文件中
      添加LIBC_NO_LIBCRASHREPORTERCLIENT

      修改Other Linker Flags,去掉CrashReporterClient
    • dyld-733.6/include/objc-shared-cache.h拷贝到Common文件中
    • libplatform-220/private/_simple.h拷贝到Common文件中
    • 在Common文件中创建kern文件
      xnu-6153.11.26/osfmk/kern/restartable.h拷贝到kern文件中
    • libclosure-74/Block_private.h拷贝到Common文件中

    错误:can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/AppleInternal/OrderFiles/libobjc.order
    解决方法
    修改Order File 改为 $(SRCROOT)/libobjc.order

    image.png

    错误/xcodebuild:1:1: SDK "macosx.internal" cannot be located.
    解决方法
    修改Run Script(markgc) 中的macosx.internal,改为macosx

    接下来编译通过了 😭

    调试libobjc.A.dylib

    1. 新建一个 target
    1. 绑定objclibobjc.A.dylib
    1. 设置Enable Hardened RuntimeNo

    4.如果遇到断点断不住的情况,把main.m换个位置

    相关文章

      网友评论

        本文标题:OC 探索底层原理

        本文链接:https://www.haomeiwen.com/subject/pupvektx.html