前言
自从XCode
体系升级到macOC Monterey
,以往的Objc4-818.2
源码就不能跑了,最近发现苹果更新了objc4-838 源码,所以迫不及待的来一波编译。
准备工作
-
- 下载 objc4-838 源码
-
- 下载 dyld-940 源码
-
- 下载 libc-1506.40.4 源码
-
- 下载 Libc-825.40.1 源码
-
- 下载 libclosure-79 源码
-
- 下载 libplatform-273.40.1 源码
-
- 下载 libplatform-220.100.1
-
- 下载 libpthread-485.40.4 源码
-
- 下载 xnu-8019-41.5 源码
编译环境
MAC 2015
-
macOC Monterey
+Xcode 13
编译前修正
打开objc4
工程
1. 修正脚本
-
在
Targets
->Run Script (markgc)
将macosx.internal
改成macosx
:
2. 修正Base SDK
-
在
Project
->build setting
->Base SDK
,挑选macOS
:
3. 挑选编译方针
编译并增加缺失库
-
挑选
Targets
->objc
-
在项目根目录创立一个文件,本项目里创立的叫
WSLib
,在Targets
->Build Settings
->Header Search Paths
装备WSLib
路径: -
下面进行编译并处理报错
1. 'sys/reason.h' file not found
-
在下载的源码
xnu-main
的bsd
->sys
中,找到reason.h
并仿制,并在自己创立的目录WSLib
中创立sys
文件,然后张贴reason.h
文件 -
持续编译
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)
参数与前面的,
: -
删去后,持续编译
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
文件中- 此刻编译还会报错,有两种计划:
-
- 在
CrashReporterClient.h
中增加宏界说
#define LIBC_NO_LIBCRASHREPORTERCLIENT
- 在
-
- 在
Targets
->objc
->Build Settings
->Preprocessor Macros
中,增加LIBC_NO_LIBCRASHREPORTERCLIENT
- 在
-
- 此刻编译还会报错,有两种计划:
-
持续编译
12. 注释declaration of
和 Typedef redefinition with
- 此处报错在
pthread_machdep.h
文件中,有四处-
Typedef redefinition with different types ('int' vs 'volatile OSSpinLock' (aka 'volatile int'))
-
Static declaration of '_pthread_has_direct_tsd' follows non-static declaration
-
Static declaration of '_pthread_getspecific_direct' follows non-static declaration
-
-
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'
-
注释掉代码相关的两行
15. Use of undeclared identifier 'objc4'
-
注释掉相关代码
16. Use of undeclared identifier 'dyld_platform_version_macOS_10_13'
-
注释掉这块代码
17. Use of undeclared identifier 'dyld_platform_version_macOS_10_11'
-
注释掉相关条件
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'
-
注释相关条件
-
持续编译
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_translated
与objc_thread_get_rip
报错
-
注释该条件
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'
-
注释掉这块代码
31. '_static_assert' declared as an array with a negative size
-
注释掉这两行
32. library not found for -lCrashReporterClient
-
进入
Targets
->Build Setting
->Other Linker Flags
中,删去-lCrashReporterClient
33. library not found for -loah
-
进入
Targets
->Build Setting
->Other Linker Flags
中,删去-loah
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
下面的+
: -
再挑选
macOS
->command Line Tool
,此处取名WSBuild
-
增加依靠库
libobjc.A.dylib
:
编译WSBuild
(新Target
)
-
先挑选
WSBuild
:
修正断点不走问题
-
- 在
Build Phases
的Compile Sources
中,将main.m
拖到最前面
- 在
-
- 找到
Targets
->Build Settings
->Enable Hardened Runtime
,值置为NO
- 找到
设置完,断点就可以走了:
已知M1
电脑问题修正
- 将
objc-cache.mm
中的报错代码注释:
温馨提示✨
- 此源码在
macOC Monterey
可运转,低于macOC Monterey
的体系可运用 objc4-818.2源码,需求自行编译。 - 最终附上编译好的 Demo