加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

深入iOS体系底层之措施中的汇编代码

发布时间:2019-05-29 22:16:26 所属栏目:业界 来源:欧阳大哥2013
导读:合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。--(老子道德经 ) 对付一个闭源体系来说假如想研究某些逻辑的内部实现就必要对汇编说话举办把握和相识、对付某些必要高机能实现的逻辑来说用汇编说话实现大噶?鲱好的选择、对付某些逻辑来说也许只
副问题[/!--empirenews.page--]

合抱之木,生于毫末;九层之台,起于垒土;千里之行,始于足下。--(老子·道德经 )

对付一个闭源体系来说假如想研究某些逻辑的内部实现就必要对汇编说话举办把握和相识、对付某些必要高机能实现的逻辑来说用汇编说话实现大噶?鲱好的选择、对付某些逻辑来说也许只能用汇编来实现。以最后一个手段来说:当我们要实现一个HOOK全部OC要领挪用的逻辑时,由于HOOK的要领不能粉碎原有函数的参数栈,并且还必要在恰当的时辰挪用原始的函数而不存眷原始函数的入参时就只能选择用汇编说话来实现。

查察措施的汇编代码

着实更多的时辰我们不要求去编写一段汇编代码可能呆板指令,而是假如可以或许读懂简朴的汇编代码就能窥伺一些体系底层的实现逻辑和道理。虽然市面上也有许多的反汇编的器材软件可以或许将汇编代码转化为高级说话的伪代码,弱点就是这些器材大多是静态说明器材以及反汇编出来的代码不必然完全正确,偶然辰我们也许越发但愿在运行时去调试可能说明一些题目,这样可以或许阅读汇编代码的话结果会更好一些。

查察汇编代码的三种要领

Xcode提供了三种查察措施汇编代码的方法:

  1. 在措施运行时的断点处可以通过Debug菜单->Debug Workflow->Always Show Disassembly劳迫椿汇编代码模式和高级说话模式。
  2. 通过快捷键 alt + command + 可以对某个体系函数可能第三方库函数可能类的要领配置标记断点,这样当措施呈现响应的函数可能要领挪用时就会切换到汇编代码模式。你可以通过这种方法来阅读和相识函数可能要领的实现。
  3. 假如你想查察某个高级说话文件天生的伪汇编代码时,你必要在对应的文件处通过Product菜单->Perform Action->Assemble "xxxxx" 来查察这个文件天生的伪汇编代码。当你在模仿器模式下所看到的就是x64体系下的汇编代码,当你在装备模式下时所看到的就是arm体系下的汇编代码。

clang呼吁的简朴先容

通过上述的第三种方法查察天生的汇编代码的方法着实是通过clang呼吁完成的。clang是一个C/C++/Objective-C说话的编译器,它包括了预处理赏罚、语法说明、优化、代码天生、汇编装配、链接等成果。我们通过菜单来举办的构建措施的操纵着实内部实现都是借助clang来完成的。你可以在呼吁终端中键入man clang来查察这个呼吁的全部参数和行使先容,你还可以在Xcode工程中行使command + 9快捷键就可以看到你每次构建工程的具体流程,这内里有对措施行使clang呼吁的举办编译和链接的详细实践。

深入iOS体系底层之措施中的汇编代码

可以看出无论是源代码编译照旧措施链接都是用clang呼吁来实现的,不要被呼吁中大量的编译链接选项所吓倒,其拭魅这些参数都是我们在可视化的工程的Build Settings内里配置的

要想相识完备的编译选项的配置和意义可以参考:pewpewthespells.com/blog/builds…

我们只先容clang呼吁的几个首要的参数选项:

  1. clang [-arch ] [-x ] [-L<库路径>] [-I<头文件路径>] [-F<框架头文件路径>] [-isysroot 体系SDK路径] [-fobjc-arc | -fno-objc-arc] [-lxxx] [-framework XXX] [-Xlinker option] [-Xlinker value] [-E 源代码文件] [-rewrite-objc 源代码文件] [-c 源代码文件] [-S 源代码文件] [-filelist LinkFileList文件] [-o 输出文件] 

1.通例参数

  •  -arch : 天生的代码的系统布局,四选一。
  •  -x
  •  -I<头文件路径>: 指定#import可能#include .h文件的搜刮路径。
  •  -L<库路径>: 指定链接时的动态库可能静态库文件的搜刮路径。这个选项用在链接阶段。
  •  -F<框架头文件路径>: 指定#import一个框架库时的头文件搜刮路径。
  •  -isysroot 体系SDK路径: 指定措施行使的体系框架SDK的路径。好比: -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.1.sdk 表白行使真机版的iOS12.1版本的SDK来编译可能链接当前措施。
  •  -fobjc-arc | -fno-objc-arc: 表白当前措施是行使arc编译照旧mrc来编译。
  •  -lxxx: 只在链接时行使,表白将名字为libxxx的库链接到措施中来。
  •  -framework XXX: 只在链接时行使,表白将名字为XXX的framework库链接到措施中来。
  •  -Xlinker option -Xlinker value: 配置链接的选项,这里必必要成对呈现,其意义暗示: option = value。

2.预处理赏罚

-E 源代码文件 -o 输出文件: 对源代码举办预处理赏罚。也就是将全部#include和#import的头文件睁开、将全部宏界嗣魅睁开、将全部列举值转化为常量值的处理赏罚。你可以借助**Product菜单->Perform Action->Preprocess "xxxxx"**来查察一个源代码文件的预处理赏罚功效。

3.天生C++代码

-rewrite-objc 源代码文件: 将OC代码转化为对应的C++说话实现。并在源代码文件的当前目次下天生一个对应的后缀为.cpp的C++代码。你可以通过这种要领来具体相识arc的实现道理、block的实现以及挪用道理、各类OC要害字的实现逻辑道理、OC类属性和要领的实现逻辑、类要领的界说以及runtime的机制等等逻辑。因此用这个参数可以辅佐我们窥伺许多iOS体系的奥秘。在行使这个呼吁时也许会碰着一个常见的错误:

  1. In file included from xxxx.m:9: 
  2. xxxx.h:9:29: fatal error: module 'UIKit' not found 
  3. #pragma clang module import UIKit /* clang -E: implicit import for #import <uikit uikit.h=""> */ 
  4.                      ~~~~~~~^~~~~ 
  5. 1 warning and 1 error generated.</uikit> 

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读