使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

前言
为什么会想要调试源码?

苹果开源了部分源码, 但相似内容太多, 基本找不到代码见的对应关系, 如果能像自己工程一样进行跳转那多好哇~~
苹果源码开源地址: https://opensource.apple.com/
本文将以macOS 11.2/objc4-818.2的源码进行配置

源码配置
首先选中运行target: objc > My Mac
然后⌘+b进行编译
翻一下爆红的点看看都有哪些错误, 然后找到下面对应的解决方案~
编译报错 ‘sys/reason.h’ file not found

使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

解决方案: 谷歌中输入reason.h site:opensource.apple.com定向检索

使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

点进去搜索结果里面, 进行”文件另存为”下载
下载后, 在objc源码根目录中创建一个文件夹”ZKLib”,
然后因为reason.h文件是在sys目录下的, 所以我们在”ZKLib”目录下创建”sys”文件夹, 并把reason.h放到该目录里面(如下图)

使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

接下来我们在源码工程 target > objc > Build Settings中搜索”Header Search Paths”, 给Debug和Release都加上$(SRCROOT)/ZKLib即可
(不需要把ZKLib拉进源码Xcode工程里哦! )\

使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

然后继续⌘+b编译

其它文件缺失
我们会发现相同的报错还有\

'mach-o/dyld_priv.h' file not found
'os/lock_private.h' file not found
'os/base_private.h' file not found
'pthread/tsd_private.h' file not found
'System/machine/cpu_capabilities.h' file not found
'os/tsd.h' file not found
'pthread/spinlock_private.h' file not found
'System/pthread_machdep.h' file not found
'CrashReporterClient.h' file not found
'objc-shared-cache.h' file not found
'_simple.h' file not found
'Block_private.h' file not found

这些报错的解决方案都跟上面的一样处理

objc源码文件代码修改
CrashReporterClient明明放进去了还是”file not found”
打开CrashReporterClient.h文件,

使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

在#ifdef前面加上以下代码:

#define LIBC_NO_LIBCRASHREPORTERCLIENT

注释掉一些妨碍编译的代码
总的来说一共有这么多:

使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

具体都有:
objc-cache.mm

87行:

#if TARGET_OS_OSX

//#include <cambria traps.h>

//#include <cambria cambria.h>

#endif

1120&#x884C;:

//#if TARGET_OS_OSX

// if (oah_is_current_process_translated()) {

// kern_return_t ret = objc_thread_get_rip(threads[count], (uint64_t*)&pc);

// if (ret != KERN_SUCCESS) {

// pc = PC_SENTINEL;

// }

// } else {

// pc = _get_pc_for_thread (threads[count]);

// }

//#else

pc = _get_pc_for_thread (threads[count]);

//#endif
</cambria></cambria>

NSObject.mm

42&#x884C;:

//#include <os feature_private.h>

extern "C" {

//#include <os reason_private.h>

//#include <os variant_private.h>

}

1185&#x884C;:

// if (DebugPoolAllocation || sdkIsAtLeast(10_12, 10_0, 10_0, 3_0, 2_0)) {

// // OBJC_DEBUG_POOL_ALLOCATION or new SDK. Bad pop is fatal.

// _objc_fatal

// ("Invalid or prematurely-freed autorelease pool %p.", token);

// }
</os></os></os>

objc-runtime.mm

36&#x884C;:

//#include <os feature_private.h> // os_feature_enabled_simple()

379&#x884C;:

// if (!dyld_program_sdk_at_least(dyld_fall_2020_os_versions))

// DisableAutoreleaseCoalescingLRU = true;

444&#x884C;:

// if (!os_feature_enabled_simple(objc4, preoptimizedCaches, true)) {

// DisablePreoptCaches = true;

// }
</os>

objc-class.mm

896&#x884C;:

// LINKER_SET_FOREACH(_dupi, const objc_duplicate_class **, "__objc_dupclass") {

// const objc_duplicate_class *dupi = *_dupi;

//

// if (strcmp(dupi->name, name) == 0) {

// return;

// }

// }

objc-os.mm

31&#x884C;:

//#include "objc-bp-assist.h"

\

567&#x884C;:

// if (!dyld_program_sdk_at_least(dyld_platform_version_macOS_10_13)) {

// DisableInitializeForkSafety = true;

// if (PrintInitializing) {

// _objc_inform("INITIALIZE: disabling +initialize fork "

// "safety enforcement because the app is "

// "too old.)");

// }

// }

objc-runtime-new.mm

3547&#x884C;:

// if (!dyld_program_sdk_at_least(dyld_platform_version_macOS_10_11)) {

// DisableNonpointerIsa = true;

// if (PrintRawIsa) {

// _objc_inform("RAW ISA: disabling non-pointer isa because "

// "the app is too old.");

// }

// }

8328&#x884C;:

if (!DisableTaggedPointerObfuscation /**&& dyld_program_sdk_at_least(dyld_fall_2018_os_versions)*/) {

编译报错 Can’t open order file: libobjc.order
具体来说是这么一个报错:

使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

解决方案:
在源码工程 target > objc > Build Settings中搜索”Order File”, 把Debug和Release的内容都改成$(SRCROOT)/libobjc.order即可

使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

编译报错 Library not found for -lCrashReporterClient
在源码工程 target > objc > Build Settings中搜索”Other Linker Flags”, 把Debug和Release中的-lCrashReporterClient都删掉

使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

编译报错 SDK “macosx.internal” cannot be located.

具体来说是这么一个报错:

使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

解决方案:
在源码工程 target > objc > Build Phases中找到Run Script(markgc)里面, 把脚本中的macosx.internal改成macosx即可

使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

编译报错 library not found for -loah
具体来说是这么一个报错:

使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

解决方案:
在源码工程 target > objc > Build Settings中搜索”Other Linker Flags”, 把Debug和Release里的-loah删掉

使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

编译报错 ‘_static_assert’ declared as an array with a negative size
具体来说是这么一个报错:

使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

解决方案:
把报错的这两行注释掉~~

编译成功!

诶嘿嘿~
是不是突然间看到”Build Successed”就很兴奋了, 反正我是兴奋了

编译调试
新建一个target
选择macOS里面的Command Line Tool (我们这里不需要界面)

使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

将target命名为ZKBuild (如下图)

使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

绑定依赖关系
在源码工程 target > ZKBuild > Build Phases中
在Dependencies 添加objc

使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

打断点进行调试
切换运行target: ZKBuild > My Mac
在main.m代码中打断点, 并按⌘+r运行

使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

此时按

使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

(step into)进入这一行代码里面

使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

来到objc源码里面, 则表示已经能成功调试objc源码

Original: https://www.cnblogs.com/mysweetAngleBaby/p/16747152.html
Author: 一眼万年的星空
Title: 使用objc4V818.2源码编译,没有什么比苹果底层源码更有说服力去证明底层原理真假

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/622503/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • SpringSecurity学习

    一、SpringSecurity框架简介 SpringSecurity基于Spring框架,提供了一套Web应用安全性的完整解决方案 一般来说,Web应用的安全性包括用户认证(Au…

    Java 2023年5月30日
    0116
  • 保存登录信息的Cookie加密技术

    所有需要账户登录的website 基本都会想到这样一个问题, 如何保持用户在一定时间内登录有效。 最近本人就在项目中遇到这样的需求,某些页面只能Admin账户登录后访问, 当登录A…

    Java 2023年6月5日
    092
  • SpringBoot 项目部署(初级)

    之前的项目一直在本地电脑上写,最近需要将项目部署到服务器上进行联调测速度。于是,在网上搜集资料后简单的进行一下总结。 _由于本次打包部署是为了测试,于是很多内容做的还不算详尽 ,_…

    Java 2023年6月7日
    082
  • JVM调优篇

    点赞再看,养成习惯,微信搜索「 小大白日志」关注这个搬砖人。 文章不定期同步公众号,还有各种一线大厂面试原题、我的学习系列笔记。 基础概念 一般JVM调优,重点在于调整JVM堆大小…

    Java 2023年6月8日
    087
  • Nginx 源码分析– 内存池(pool)的分析 二

    在上一篇中,以一张图(图1)介绍了nginx内存池管理函数的总体概况,并分析了底层支持函数和内存池(pool)管理所需要用到的一些数据结构。这里我们将来具体分析内存池管理功能函数。…

    Java 2023年6月15日
    087
  • jQuery笔记

    什么是jQuery? jQuery是一个实用的JavaScript函数库,jQuery极大地简化了JS对DOM的操作,封装并实现的一系列常用的方法。 jQuery库封装了JavaS…

    Java 2023年6月16日
    099
  • bl bl bl bl bl

    java;collapse:true;;gutter:false; package com.dh.activiti;</p> <p>import org.s…

    Java 2023年6月6日
    071
  • Spring(一)——下载与测试

    Spring(一)——下载与测试 安装jar包 网页输入spring.io回车 测试案例 新建一个普通的Java工程 导入以下jar包 ​ commons-logging-1.2….

    Java 2023年6月16日
    080
  • Flink SQL 批模式下 ClickHouse 批量写入

    Flink SQL 批模式下 ClickHouse 批量写入 内置使用 JdbcBatchingOutputFormat 批量处理类 pom依赖 ru.yandex.clickho…

    Java 2023年6月16日
    085
  • day43-反射02

    Java反射02 2.Class类 2.1基本介绍 Class类也是类,因此也继承Object类 Class类对象不是new出来的,而是系统创建的 对于某个类的Class类对象,在…

    Java 2023年6月15日
    069
  • ACM模式细节

    牛客网的ACM模式需要自己写输入输出,在这里简单记录一下: 基本答题框架: import java.util.*; public class Main{ public static…

    Java 2023年6月15日
    074
  • spring 配置文件 –bean

    bean标配的基本配置 id:Bean实例在Spring容器中的唯一标识 class Bean的全限定名 scope 1.当scope的取值为singleton时 Bean的实例化…

    Java 2023年6月9日
    0104
  • mybatis插入时获取自增主键

    一、自增主键优缺点 1.优点 查询和插入的性能较高(增量增长,按序存放,具体可查看InnoDB相关资料了解B+树) 插入新记录时不用担心主键会重复 2.缺点 分布式系统中不太适用 …

    Java 2023年6月5日
    0108
  • Error:java: Annotation processing is not supported for module cycles. Please ensure that all modules from cycle [web_dao,web_service] are excluded from annotation processing

    转自:https://www.cnblogs.com/panpanshen/p/9668058.html 早上学习maven环境搭建时遇到的这个问题 下面这个错误的大概意思是:模块…

    Java 2023年5月29日
    074
  • IO多路复用

    先说明一个问题:在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。网络编程其实就是多了一个连接的过程,常用在Netty一些框架。本文主要…

    Java 2023年6月7日
    0112
  • 【转】认识长轮询:配置中心是如何实现推送的?

    一 前言 传统的静态配置方式想要修改某个配置时,必须重新启动一次应用,如果是数据库连接串的变更,那可能还容易接受一些,但如果变更的是一些运行时实时感知的配置,如某个功能项的开关,重…

    Java 2023年6月7日
    087
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球