iOS高手开发课读书笔记:符号是怎么绑定到地址上的

说句实话,作为一个开发,平时每天在写代码,但是对于代码的编译过程并不是十分的了解,最近看了戴老师的链接器这篇文章,大概有了一些了解,做个笔记。

项目开发完成,我们需要进行编译来看修改后的效果,但是假如编译的是一些大型的项目,那么恐怕编译时间将非常的长,因此就需要对此进行一些优化,要优化必须先了解一下启动时链接器所做的事情。简单来说,链接器做的最重要的事情就是把符号绑定在地址上

在说链接器之前,先来看看iOS所使用的编译器,在iOS开发中,我们所写的代码会被编译器转化为机器码,然后CPU会直接执行机器码,除去编译器,还有一种叫做解释器,但是苹果并没有使用,因为苹果希望程序执行的效率更高,速度更快

为什么说解释器的速度慢,效率不高呢?因为解释器是在运行时将我们写的代码,一句句的翻译成目标代码,然后再一句句的执行目标代码,这个效率肯定就是不如事先生成一份完整的机器码再去执行。

那么为什么解释器效率低还有人会用呢?学iOS的人一定会对运行时比较敏感,解释器是在运行时期间发生作用的,那么使用解释器就可以随时增加或者更新代码来改变项目内容,无需重启项目就可以看到代码更新的结果,而且如果项目上线出现问题,也可以随时更新,用户无需更新即可升级使用。这就大大缩短了程序开发周期和功能更新周期。

好了现在弄清楚了苹果使用编译器的原因,我们就来看看苹果使用的是什么编译器,相信大家和我一样,总看到LLVM,也知道它是苹果的编译器,但是对它了解的并不是很多,在Xcode5之前,苹果的编译器使用的是GCC,后来换成了LLVM,它的速度要比GCC高出三倍之多。

LLVM是编译器工具链技术的一个集合,而其中的lld就是内置链接器。编译器会对每个文件进行编译,生成Mach-O(可执行文件),链接器将会把生成的Mach-O合并成为一个。

LLVM的工作简单来说可概括为几点:

1.咱们写好的代码,LLVM会预处理一下,比如把我们定义的宏嵌入到相应的位置。
2.预处理完成之后,LLVM会对代码进行词法分析语法分析,生成ASTAST就是抽象语法树,结构上比代码更精简,可以更快速的遍历,可以更快的生成IR(中间表示)。
3.最后AST会生成IRIR是一种更接近机器码的语言,通过IR可生成多份适合不同平台的机器码,对于iOS系统来说,生成的就是Mach-O

那么链接器做了什么呢?通俗点说,Mach-O里面的主要内容就是我们的代码和数据,代码就是我们所写的函数,也就是各种方法,数据就是我们定义的全局变量,无论是方法,还是各种全局变量,它们的实例都需要和方法名称,变量名称联系起来。当我们的系统想要操作各种方法,各种变量时,必然需要找到方法名称变量名称所对应的地址,而链接器所做的工作就是将方法,变量名称所对应的地址关联起来。

那么链接器为什么还要把生成的多个Mach-O合并成为一个呢?我们平时写代码肯定是不会把所有的内容都写在一个文件里面,一个项目一般会包含很多文件,而各个文件之间的方法接口,数据都是相互依赖的,因此单个文件生成的Mach-O是肯定无法正常运行的,如果这个文件调用了其他文件中的方法,那么就无法找到这个方法的地址,也就无法执行。

链接器在链接多个目标文件的时候会创建一个符号表,记录所有已经定义,和未定义的符号,我们在编译项目的时候经常会遇到这个错误“ld: dumplicate symbols”,这就说明项目里面有重复的文件,也会遇到这个错误“Undefined symbols”这就说明项目中缺少文件。

链接器还有一个作用,就是会自动去除长时间没有使用的函数,使其不会被打包进入Mach-O文件,如果我们项目迭代的过程中,废弃了一些函数,不再调用,久而久之,被废弃的函数越来越多,我们的Mach-O会变得越来越大。链接器在整理函数符号调用关系时就会自动去除掉废弃的函数。链接器在整理函数符号调用关系时,会以main函数为源头,跟随每个引用,被跟踪到的会标记为live,未被标记的就是无用函数,链接器就会自动去除无用函数。

以上就是这一章的部分笔记,最后还是推荐大家去看原文,大家共同进步!

原文地址:https://time.geekbang.org/column/article/86840

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

推荐阅读更多精彩内容