Macos14.0 调试苹果开源库objc

举报
dosomething 发表于 2023/12/05 18:59:57 2023/12/05
【摘要】 开源库下载1、下载地址:https://opensource.apple.com/releases/2、根据Mac版本选择相应的库(图1)获取Mac系统版本(图2)找到可下载的开源库列表3、需要下载的库列表(这里拿macos14.0为例)需下载列表dyld-1122.1Libc-1583.0.14Libc-825.26libclosure-90libplatform-306.0.1libpt...

开源库下载

1、下载地址:https://opensource.apple.com/releases/

2、根据Mac版本选择相应的库

image (37).pngimage.png

(图1)获取Mac系统版本

image (1).png

(图2)找到可下载的开源库列表

3、需要下载的库列表(这里拿macos14.0为例)

需下载列表
dyld-1122.1

Libc-1583.0.14

Libc-825.26

libclosure-90
libplatform-306.0.1
libpthread-519
objc4-906
xnu-10002.1.13

准备

1、解压objc,并打开objc.xcodeproj

image (2).png

2、创建target用于运行objc库,Xcode->File->New->Target

image (3).png

3、创建Command Line Tool类型的Target(也可以选择app类型),并命名为UseObjc(名称随意)

image (4).png

4、选中UseObjc target

image (5).png

5、添加库依赖libobjc.A.dylib

image (6).png

image (7).png

image (8).png

6、添加Target依赖,用于编译objc.A.dylib库,UseObjc不会主动编译objc.A.dylib库

image (9).png

image (10).png

image (11).png

7、关闭Harden Runtime,UseObjc->Build Settings->Enable Hardened Runtime 设置为NO

image (12).png

8、修改objc的target,修改Run Script(markgc),macosx.internal 修改为 macosx

image (13).png

9、修改objc/objc-env/objc-trampolines的target,base sdk和supported platforms都修改为macOS

image (14).png

image (15).png

image (16).png

处理头文件缺失

此时build UseObjc的Target,发现会报头文件找不到的问题,这时候需要我们从”开源库下载“中下载到的所有库中,寻找到所需头文件,举例如下

1、build objc target时找不到sys/reason.h

image (17).png

2、刚刚的下载的开源库中有此reason.h

image (18).png

3、为了快速找到reason.h,直接在此文件夹下”按名称“搜索reason.h

image (19).png

4、搜索到后,我们并没办法直接使用,因为objc target依赖的是sys/reason.h,而不是reason.h

4.1、为此在objc工程下新增Common(名称随意)文件夹

image (20).png

4.2、并在objc target的Header search path下添加Common文件夹,让程序可以寻址到Common文件夹

image (21).png

4.3、Common文件夹下创建sys目录,并将搜索到的reason.h文件拷贝到sys目录下,这样子才能按照sys/reason.h寻址

image (22).png

5、至此,重新运行UseObjc target,找不到sys/reason.h的问题已修复,但是还有其他头文件找不到的问题

image (23).png

整理Macos14.0需要的头文件

头文件 所属位置
_simple.h libplatform-libplatform-306.0.1/private/_simple.h
Block_private.h libclosure-libclosure-90/Block_private.h
CrashReporterClient.h Libc-Libc-825.26/include/CrashReporterClient.h
objc-shared-cache.h dyld-dyld-1122.1/include/objc-shared-cache.h
kern/restartable.h xnu-xnu-10002.1.13/osfmk/kern/restartable.h
mach-o/dyld_priv.h dyld-dyld-1122.1/include/mach-o/dyld_priv.h
machine/cpu_capabilities.h xnu-xnu-10002.1.13/osfmk/machine/cpu_capabilities.h
os/api.h Libc-Libc-1583.0.14/os/api.h
os/base_private.h xnu-xnu-10002.1.13/libkern/os/base_private.h
os/bsd.h Libc-Libc-1583.0.14/libdarwin/h/bsd.h
os/linker_set.h Libc-Libc-1583.0.14/os/linker_set.h
os/lock_private.h private/os/lock_private.h  
os/log_simple_private_impl.h libplatform-libplatform-306.0.1/private/os/log_simple_private_impl.h 
os/log_simple_private.h libplatform-libplatform-306.0.1/private/os/log_simple_private.h
os/reason_private.h xnu-xnu-10002.1.13/libkern/os/reason_private.h
os/tsd.h  xnu-xnu-10002.1.13/libsyscall/os/tsd.h
os/variant_private.h Libc-Libc-1583.0.14/os/variant_private.h
pthread/tsd_private.h libpthread-libpthread-519/private/pthread/tsd_private.h
sys/reason.h xnu-xnu-10002.1.13/bsd/sys/reason.h
System/machine/cpu_capabilities.h xnu-xnu-10002.1.13/osfmk/cpu_capabilities.h
System/pthread_machdep.h Libc-Libc-825.26/pthreads/pthread_machdep.h
其他头文件依赖 直接注释即可

如果懒得操作可直接下载我整理好的头文件:https://onebox.huawei.com/p/8191d42c36fad36c46a2d91d9e343697

处理异常

1、删除lCrashReporterClient和loah库的依赖,objc->Build Settings->other linker flags->删除这两个库

image (24).png

1、有些系统函数我们找不到,需要注释掉此处逻辑,

处理规则:

规则一:如果是if中的一个条件,直接删除,如果是唯一条件,则整个if语句都要注释掉,包括后面的else if/else

规则二:是函数调用中的参数,则整个函数调用都要注释掉

规则三:函数调用为”|“的一个参数,直接删除,如果是唯一参数,则注释整个逻辑

相关处理过程截图:

image (25).png

image (26).png

image (38).png

image (27).png

image (28).png

image (29).png

image (30).png

image (31).png

image (32).png

image (33).png

image (39).png

调试

UseObjc target的main函数中添加NSObject *obj = [NSObject alloc];看一下内存申请过程的逻辑,从下图可以看出alloc方法调用时,进入到了objc_alloc的c方法里面,这个很奇怪,为什么会发生这种事

image (34).png

image (35).png

按照常规逻辑应该有个+(id)alloc的类方法来承接,为什么会这样呢

从下图可以看出,在加载库时,会对部分方法进行重新设置实现,alloc和allocWithZone:都被替换为了objc_alloc和objc_allocWithZone的C方法

image (36).png

更多

更多的逻辑等待大家去探索

new的实现原理/内存分配的方式等

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。