注册
iOS

iOS 底层原理03:objc4-781 源码编译 & 调试

准备工作

环境版本 & 最新objc源码

  • mac OS 10.15
  • Xcode 11.4
  • objc4-781

依赖文件下载

需要下载以下依赖文件

59d3ce33f2eecb065deca67142a38fe1.png

源码编译

源码编译就是不断的调试修改源码的问题,主要有以下问题

问题一:unable to find sdk 'macosx.internal'

ac98df3c24aea4e0f4ace83df7b87d31.png

选择 target -> objc -> Build Settings -> Base SDK -> 选择 macOS 【target中的 objc 和 obc-trampolines都需要更改】

2dd5b993fdd0f3efadb2a3603170e75b.png

问题二:文件找不到的报错问题

【1】‘sys/reason.h’ file not found

f42facd590768d0bd573a4487238684a.png

在Apple source的 macOS10.15 --> xnu-6153.11.26/bsd/sys/reason.h 路径自行下载

在objc4-781的根目录下新建CJLCommon文件, 同时在CJLCommon文件中创建sys文件

最后将 reason.h文件拷贝到sys文件中

1448a49fec700d2fab8fa4edc02e50b4.png

设置文件检索路径:选择 target -> objc -> Build Settings,在工程的 Header Serach Paths 中添加搜索路径 $(SRCROOT)/CJLCommon

185fb275edb7c59eb164ddf30b5097d8.png

【2】‘mach-o/dyld_priv.h’ file not found

  • CJLCommon文件中 创建 mach-o 文件
  • 找到文件:dyld-733.6 -- include -- mach-o -- dyld_priv.h
71277767907b9ea9173cb0531e05bcda.png

拷贝到 mach-o文件中

8bb7e755bf06a5dd3391dc3044ab68fb.png

  • 拷贝到文件后,还需要修改 dyld_priv.h 文件,即在 dyld_priv.h文件顶部加入一下宏:
0e48773b2c0e02bde3b851c34d721f77.png

【3】‘os/lock_private.h’ file not found 和 ‘os/base_private.h’ file not found

  • 在CJLCommon中创建 os文件
  • 找到lock_private.h、base_private.h文件:libplatform-220 --> private --> os --> lock_private.h 、base_private.h,并将文件拷贝至 os 文件中
b4ba2ee0ec1b26d970532c344b060a35.png

【4】‘pthread/tsd_private.h’ file not found 和 ‘pthread/spinlock_private.h’ file not found

在CJLPerson中创建 pthread 文件
找到tsd_private.h、spinlock_private.h文件,h文件路径为:libpthread-416.11.1 --> private --> tsd_private.h、spinlock_private.h,并拷贝到 pthread文件

bddd9774ddb91e3606cfd2cad509b335.png

【5】‘System/machine/cpu_capabilities.h’ file not found

创建 System -- machine 文件
找到 cpu_capabilities.h文件拷贝到 machine文件,h文件路径为:xnu6153.11.26 --> osfmk --> machine --> cpu_capabilities.h

a790b7d92beb40e933c0b298cb12b8c6.png

【6】os/tsd.h’ file not found

找到 tsd.h文件,拷贝到os文件, h文件路径为:xnu6153.11.26 --> libsyscall --> os --> tsd.h

22eb7b2875aebe62eb22a504e2f67e74.png

【7】‘System/pthread_machdep.h’ file not found

  • 这个地址下载pthread_machdep.h文件,h文件路径为:Libc-583/pthreads/pthread_machdep.h
  • 将其拷贝至system文件中
8a56263e2709b3c9337ce50d9bbba00d.png

【8】‘CrashReporterClient.h’ file not found
这个文件在改地址搜索 Libc-825.24中找到该文件,路径为Libc-825.24/include/CrashReporterClient.h

导入下载的还是报错,可以通过以下方式解决
- 需要在 Build Settings -> Preprocessor Macros 中加入:LIBC_NO_LIBCRASHREPORTERCLIENT
- 或者下载我给大家的文件CrashReporterClient,这里面我们直接更改了里面的宏信息 #define LIBC_NO_LIBCRASHREPORTERCLIENT

【9】‘objc-shared-cache.h’ file not found

文件路径为:dyld-733.6 --> include --> objc-shared-cache.h

783e817b6a66d937b8caeb4a063099f8.png

  • 将h文件报备制拷贝到CJLCommon

【10】Mismatch in debug-ness macros

注释掉objc-runtime.mm中的#error mismatch in debug-ness macros

f15e3d52baac8b5e608506fd9cff7b2b.png

【11】’_simple.h’ file not found

文件路径为:libplatform-220 --> private --> _simple.h

99a853e7b46205b541f335003073409f.png

  • 将文件拷贝至CJLCommon
【12】‘kern/restartable.h’ file not found

  • 在CJLCommon中创建kern 文件
  • 找到 h文件,路径为xnu-6153.11.26 --> osfmk --> kern -->restartable.h
1b221208da3b03d7ceb79058cc246d22.png

【13】‘Block_private.h’ file not found

找到 h 文件,文件路径为libclosure-74 --> Block_private.h

af27548e7728ece9fbd85ee066e6c58e.png

拷贝至CJLCommon目录

【14】libobjc.order 路径问题

问题描述为:can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/AppleInternal/OrderFiles/libobjc.order

选择 target -> objc -> Build Settings

在工程的 Order File 中添加搜索路径 $(SRCROOT)/libobjc.order


f45295eba9137538e28b006fcb142260.png

【14】Xcode 脚本编译问题
问题描述为:/xcodebuild:1:1: SDK "macosx.internal" cannot be located.

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

04d53883b4faabe3b5cbbc5e0b58a716.png

编译调试

新建一个target :CJLTest

fd583b424b243b79e84f4e629775a957.png

绑定二进制依赖关系

5e8a7ecd23b7a6c52363b44b9efaa229.png

源码调试

自定义一个CJLPerson类

image

在main.m中 创建 CJLPerson的对象,进行源码调试

838609825a13e237d1f3f1b754e7504e.png

作者:style_月月
链接:https://blog.csdn.net/lin1109221208/article/details/108435967

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

0 个评论

要回复文章请先登录注册