OC源码编译

简介:

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

环境:

  源码版本:objc4-818
  MacOS版本:11.5
  Xcode版本:12.5
  源码文件浏览下载链接:https://github.com/apple-oss-distributions/
  源码文件浏览下载链接:https://github.com/apple-oss-distributions/objc4/tags

需要源码库:

  • 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352

推荐阅读更多精彩内容