美文网首页
OC源码编译

OC源码编译

作者: 苍眸之宝宝 | 来源:发表于2021-08-27 15:19 被阅读0次

    简介:

      源码编译是学习高级语言底层的最直接的方法,你可以打断点进行各种花样玩法。该篇文章是记录自己编译源码遇到的问题和解决方法。

    环境:

      源码版本:objc4-818
      MacOS版本:11.5
      Xcode版本:12.5
      源码文件浏览链接:https://opensource.apple.com/source/
      源码文件下载链接:https://opensource.apple.com/tarballs/

    需要源码库:

    • dyld-852.2:App启动加载库,将代码文件加载进内存等一些列处理
    • Libc-1439.40.11:c标准库
    • libclosure-79:App启动闭包库,iOS13新增与dyld3对应
    • libdispatch-1271.120.2:GCD底层支持库
    • libplatform-254.80.2:MacOS底层Darwin系统平台库
    • libpthread-454.80.2:线程底层库
    • objc4-818.2:runtime源码
    • xnu-7195.141.2:XNU内核库
      1.png

    编译和解决问题过程:

    1.Showing Recent Messages unable to find sdk 'macosx.internal'

      打开objc4-818.2的工程文件比编译,报错:


    2.png
      解决方法:Target -> objc/objc-trampolines -> Build Setting -> Base SDK -> macOS,如下图: 3.png
      注意:objc和objc-trampolines都要选中macOS。
    2. 'sys/reason.h' file not found

      选中Target objc编译,报错:


    4.png

      解决方法:

    1. 在工程中添加放置文件的文件夹:
        注意:Compile文件夹名称随意取,sys文件固定。

    2. 添加reason.h文件:
        获取步骤:xnu-7195.141.2 -> bsd -> sys -> reason.h;
        获取后添加到上一步的sys文件夹下。

    3. 修改工程中文件检索路径:
        修改步骤:Build Settings -> Header Search Paths -> $(SRCROOT)/Compile


      5.png
    3.'mach-o/dyld_priv.h' file not found

      解决方法与2中相同,在Compile添加mach-o文件夹,按照dyld-852.2 -> include -> mach-o -> dyld_priv.h找到dyld_priv.h文件,添加到mach-o文件夹中。
      编译后dyld_priv.h中会报错,将报错的代码全部注释或者将bridgeos(3.0)去掉。


    6.png
    4.'os/lock_private.h' file not found

      解决方法与2中相同,在Compile添加os文件夹,按照libplatform-254.80.2 -> private -> os -> lock_private.h找到lock_private.h文件,添加到os文件夹中。


    7.png
    5.'os/base_private.h' file not found

      解决方法与2中相同,按照xnu-7195.141.2 -> libkern -> os -> base_private.h找到base_private.h文件,添加到os文件夹中。
      添加文件后编译报错,同3中将代码注释或者将bridgeos(4.0)去掉,这里将bridgeos(4.0)去掉。


    8.png
    6.'pthread/tsd_private.h' file not found

      解决方法与2中相同,在Compile添加pthread文件夹,按照libpthread-454.80.2 -> private -> pthread -> tsd_private.h找到tsd_private.h文件,添加到pthread文件夹中。


    9.png
    7.'System/machine/cpu_capabilities.h' file not found

      解决方法与2中相同,在Compile添加System文件夹,在System文件夹添加machine文件夹,按照xnu-7195.141.2 -> osfmk -> machine -> cpu_capabilities.h找到cpu_capabilities.h文件,添加到machine文件夹中。


    10.png
    8.'os/tsd.h' file not found

      解决方法与2中相同,按照xnu-7195.141.2 -> libsyscall -> os -> tsd.h找到tsd.h文件,添加到os文件夹中。

    9.'pthread/spinlock_private.h' file not found

      按照libpthread-454.80.2 -> private -> pthread -> spinlock_private.h找到spinlock_private.h文件,添加到pthread文件夹中。


    11.png
    10.'System/pthread_machdep.h' file not found/'CrashReporterClient.h' file not found

      将这两个文件的引入注释掉即可。


    12.png
    11.'Block_private.h' file not found

      按照libclosure-79 -> Block_private.h找到Block_private.h文件,添加到Compile文件夹中。

    12.'Cambria/Traps.h' file not found/'Cambria/Cambria.h' file not found/'os/feature_private.h' file not found

      将这两个文件的引入注释掉即可。

    13.'_simple.h' file not found

      按照libplatform-254.80.2 -> private -> _simple.h找到_simple.h文件,添加到Compile文件夹中。

    14.'objc-shared-cache.h' file not found

      按照dyld-852.2 -> include -> objc-shared-cache.h找到objc-shared-cache.h文件,添加到Compile文件夹中。

    15.'os/linker_set.h' file not found

      按照Libc-1439.40.11 -> os -> linker_set.h找到linker_set.h文件,添加到os文件夹中。

    16.'kern/restartable.h' file not found

      在Compile文件夹下添加kern文件夹;按照xnu-7195.141.2 -> osfmk -> kern -> restartable.h找到restartable.h文件,添加到kern文件夹中。

    17.'objc-bp-assist.h' file not found

      注释该引入文件代码。

    18.'os/reason_private.h' file not found/'os/variant_private.h' file not found

      按照xnu-7195.141.2 -> libkern -> os -> reason_private.h找到reason_private.h文件,添加到os文件夹中;按照Libc-1439.40.11 -> os -> variant_private.h找到variant_private.h文件,添加到os文件夹中。

    19.因为注释文件导致的编译错误:

      如CRGetCrashLogMessage、dyld_fall_2020_os_versions、dyld_platform_version_macOS_10_13、STATIC_ASSERT错误等,将错误代码注释即可;将sdkIsAtLeast(10_12, 10_0, 10_0, 3_0, 2_0)、bridgeos(4.0)、bridgeos代码去除。
      将各种file not found错误和相关错误干掉后,文件目录如下图:


    16.png
    20.can't open order file: /.../OrderFiles/libobjc.order

      libobjc.order加载路径问题,将绝对路径改为相对路径;Target -> Build Settings -> Order File -> 双击添加$(SRCROOT)/libobjc.order。


    13.png
    21.Showing Recent Messages Library not found for -lCrashReporterClient

      Target -> Build Settings -> Other Linker Flags -> 删除-lCrashReporterClient和-loah即可。


    14.png
    22. SDK "macosx.internal" cannot be located.

      Target -> objc -> Build Phases -> Run Script(markgc)把脚本文本macosx.internal 改成 macosx


    15.png

      编译成功,此处应该有掌声~啪啪啪,不要高兴的太早,这还是个中场啊。

    开启多灾多难的源码编译调试旅程:

    1.工程内部添加一个Target

      工程内部添加一个Target;按照File -> New -> Target -> macOS -> Application -> Command Line Tool添加Target,编辑一些Target必要信息,点击next,完成Target创建。


    17.png 18.png
    2.绑定依赖库

      Target -> 创建的Target -> Build Phases -> Dependencies/Link Binary With Libraries添加依赖和链接的库。


    19.png
    2.添加类和调试代码

      选中创建的Target文件夹下,添加类和代码,在main文件中引入调用,断点打上,激动人心的时刻来临了,run运行下,我去,不走断点,什么鬼?

    20.png
      解决方法:Xcode调试断点无效中的第3条.
    21.png
      main中的断点是可以调试,但是runtime源码中的断点还是调试不了?
      解决方法:Target -> Build Settings -> Enable Hardended Runtime -> 设置为NO。
    22.png
      终于搞定了,多灾多难的过程啊,这还只源码调试的开始而已啊!
    23.png

    相关文章

      网友评论

          本文标题:OC源码编译

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