前言

自从XCode体系升级到macOC Monterey,以往的Objc4-818.2源码就不能跑了,最近发现苹果更新了objc4-838 源码,所以迫不及待的来一波编译。

准备工作

    1. 下载 objc4-838 源码
    1. 下载 dyld-940 源码
    1. 下载 libc-1506.40.4 源码
    1. 下载 Libc-825.40.1 源码
    1. 下载 libclosure-79 源码
    1. 下载 libplatform-273.40.1 源码
    1. 下载 libplatform-220.100.1
    1. 下载 libpthread-485.40.4 源码
    1. 下载 xnu-8019-41.5 源码

编译环境

  • MAC 2015
  • macOC Monterey + Xcode 13

编译前修正

打开objc4工程

1. 修正脚本

  • Targets -> Run Script (markgc)macosx.internal改成macosx

    iOS objc4-838编译流程,可在macOS Monterey运行

2. 修正Base SDK

  • Project -> build setting -> Base SDK,挑选macOS

    iOS objc4-838编译流程,可在macOS Monterey运行

3. 挑选编译方针

iOS objc4-838编译流程,可在macOS Monterey运行

编译并增加缺失库

  • 挑选Targets -> objc

  • 在项目根目录创立一个文件,本项目里创立的叫WSLib,在Targets -> Build Settings -> Header Search Paths装备WSLib路径:

    iOS objc4-838编译流程,可在macOS Monterey运行

  • 下面进行编译并处理报错

1. 'sys/reason.h' file not found

  • 在下载的源码xnu-mainbsd -> sys中,找到reason.h并仿制,并在自己创立的目录WSLib中创立sys文件,然后张贴reason.h文件

    iOS objc4-838编译流程,可在macOS Monterey运行

  • 持续编译

2. 'mach-o/dyld_priv.h' file not found

  • 在下载的dyld-main的目录 include -> mach-o中找到dyld_priv.h文件并仿制,然后在WSLib中创立mach-o文件,并张贴dyld_priv.h

  • 打开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
    
  • 持续编译

3. 'os/lock_private.h' file not found

  • 在下载的源码libplatform-main中,private -> os中找到lock_private.h文件并仿制,然后在WSLib中创立os文件,并张贴lock_private.h

  • 持续编译

4. Expected ',' 报错(dyld_priv.h文件中)

  • 删去文件中所以报错处的bridgeos(3.0)参数与前面的,

    iOS objc4-838编译流程,可在macOS Monterey运行

  • 删去后,持续编译

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

  • 在下载的源码 libplatform-220.100.1中,在目录private -> os中找到base_private.h文件并仿制,并张贴到WSLib中的os文件

  • 持续编译

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

  • 此处报错在lock_private.h文件中,里边有两个错:
    • 首先要去掉文件里边的 bridgeos(4.0)参数
    • 其次在下载的libpthread-main源码中,在目录private -> pthread中找到tsd_private.h并仿制,然后在WSLib中创立pthread目录,并张贴文件
  • 持续编译

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

  • 在下载的源码xnu-main中,在目录osfmk -> machine找到 cpu_capabilities.h文件并仿制,然后在WSLib中创立System文件,然后在System文件中创立machine文件,并张贴cpu_capabilities.h

  • 持续编译

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

  • 在下载的源码xnu-main中,在目录libsyscall -> os中找到tsd.h并仿制,然后在WSLib中的os文件中张贴

  • 持续编译

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

  • 在下载的源码libpthread-main中,在目录private -> pthread中找到spinlock_private.h文件并仿制,然后张贴到WSLib中的pthread文件中

  • 持续编译

10. 'System/pthread_machdep.h' file not found

  • 在下载的文件Libc-825.40.1中,在目录pthreads中找到pthread_machdep.h文件并仿制,并张贴到WSLib -> System目录

  • 持续编译

11. 'CrashReporterClient.h' file not found

  • 在下载的文件Libc-825.40.1中,找到 CrashReporterClient.h文件并仿制,然后张贴到WSLib文件中

    • 此刻编译还会报错,有两种计划:
        1. CrashReporterClient.h中增加宏界说
        #define LIBC_NO_LIBCRASHREPORTERCLIENT
        
        1. Targets -> objc -> Build Settings -> Preprocessor Macros中,增加LIBC_NO_LIBCRASHREPORTERCLIENT
        iOS objc4-838编译流程,可在macOS Monterey运行

  • 持续编译

12. 注释declaration ofTypedef redefinition with

  • 此处报错在pthread_machdep.h文件中,有四处
      1. Typedef redefinition with different types ('int' vs 'volatile OSSpinLock' (aka 'volatile int'))
      1. Static declaration of '_pthread_has_direct_tsd' follows non-static declaration
      1. Static declaration of '_pthread_getspecific_direct' follows non-static declaration
      1. Static declaration of '_pthread_setspecific_direct' follows non-static declaration 将这些报错悉数注释掉
  • 持续编译

13. 'os/feature_private.h' file not found

  • 直接注释掉

14. Use of undeclared identifier 'dyld_fall_2020_os_versions'

  • 注释掉代码相关的两行

    iOS objc4-838编译流程,可在macOS Monterey运行

15. Use of undeclared identifier 'objc4'

  • 注释掉相关代码

    iOS objc4-838编译流程,可在macOS Monterey运行

16. Use of undeclared identifier 'dyld_platform_version_macOS_10_13'

  • 注释掉这块代码

    iOS objc4-838编译流程,可在macOS Monterey运行

17. Use of undeclared identifier 'dyld_platform_version_macOS_10_11'

  • 注释掉相关条件

    iOS objc4-838编译流程,可在macOS Monterey运行

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

  • 在下载的源码dyld-main中,在目录include中找到objc-shared-cache.h并仿制,然后张贴到WSLib中的

  • 持续编译

19. Use of undeclared identifier 'dyld_fall_2018_os_versions'

  • 注释相关条件

    iOS objc4-838编译流程,可在macOS Monterey运行

  • 持续编译

20. '_simple.h' file not found

  • 在下载的源码libplatform-main中的private目录找到并仿制,然后张贴到WSLib

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

  • 在下载的源码xnu-main中,在目录bsd -> sys中找到linker_set.h,并仿制到WSLib中的os目录

22. 'Cambria/Traps.h' file not found

  • 注释掉代码

    #include <Cambria/Traps.h>
    #include <Cambria/Cambria.h>
    

23. 'Block_private.h' file not found

  • 在下载的源码libclosure-main中找到Block_private.h,并仿制到WSLib目录

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

  • 在下载的源码xnu-main中,在目录osfmk -> kern中找到restartable.h文件并仿制,然后在WSLib中创立kern目录并张贴restartable.h文件

26. oah_is_current_process_translatedobjc_thread_get_rip报错

  • 注释该条件

    iOS objc4-838编译流程,可在macOS Monterey运行

27. 'os/feature_private.h' file not found

  • 注释掉头文件的引证

28. 'os/reason_private.h' file not found

  • 在下载的源码xnu-main中,在目录libkern -> os中找到reason_private.h文件,并张贴到WSLib中的os文件中

29. 'os/variant_private.h' file not found

  • 在下载的源码Libc-main中的os目录找到variant_private.h,并仿制到WSLib中的os目录

  • variant_private.h中,删去bridgeos参数

30. Use of undeclared identifier 'dyld_platform_version_bridgeOS_2_0'

  • 注释掉这块代码

    iOS objc4-838编译流程,可在macOS Monterey运行

31. '_static_assert' declared as an array with a negative size

  • 注释掉这两行

    iOS objc4-838编译流程,可在macOS Monterey运行

32. library not found for -lCrashReporterClient

  • 进入Targets -> Build Setting -> Other Linker Flags中,删去-lCrashReporterClient

    iOS objc4-838编译流程,可在macOS Monterey运行

33. library not found for -loah

  • 进入Targets -> Build Setting -> Other Linker Flags中,删去-loah

    iOS objc4-838编译流程,可在macOS Monterey运行

34. Unknown type name 'uint32_t', Unknown type name 'uint64_t, Use of undeclared identifier 'INT64_C'

  • 进入根目录Runtime -> llvm-MathExtras.h, 在导入头文件 #include <cstdint>即可处理

编译成功

增加Target

  • 先点击Targets下面的+

    iOS objc4-838编译流程,可在macOS Monterey运行

  • 再挑选macOS -> command Line Tool,此处取名WSBuild

    iOS objc4-838编译流程,可在macOS Monterey运行

  • 增加依靠库libobjc.A.dylib

    iOS objc4-838编译流程,可在macOS Monterey运行

    iOS objc4-838编译流程,可在macOS Monterey运行

编译WSBuild(新Target)

  • 先挑选WSBuild

    iOS objc4-838编译流程,可在macOS Monterey运行

修正断点不走问题

    1. Build PhasesCompile Sources中,将main.m拖到最前面

    iOS objc4-838编译流程,可在macOS Monterey运行

    1. 找到Targets -> Build Settings -> Enable Hardened Runtime,值置为NO

设置完,断点就可以走了:

iOS objc4-838编译流程,可在macOS Monterey运行

已知M1电脑问题修正

  • objc-cache.mm中的报错代码注释:
    iOS objc4-838编译流程,可在macOS Monterey运行

温馨提示✨

  • 此源码在macOC Monterey可运转,低于macOC Monterey的体系可运用 objc4-818.2源码,需求自行编译。
  • 最终附上编译好的 Demo