链接装载笔记

1.程序从源代码到运行的整个流程如图1:

图1 整体流程

2.静态链接是将程序所依赖的类库与程序本身代码链接在一起形成了一个很大的可执行文件。这个可执行文件包含了运行所需的所有程序代码,不需要再依赖外部类库。但是这样做的好处在于减轻了符号(变量与函数)重定位的难度,加快了装载速度,因为它们被揉进一个文件,所以其在文件中的相对位置是不会改变的。当该可执行文件装载进进程空间时,那么只需获得装载首地址,即可确定所有符号(变量与函数)的地址。但是坏处就在于因为所有库被放进了一个文件,使得可执行文件十分庞大,一个简单的helloworld程序在通过静态链接后都有8M之多,因为可能只是使用到了一个库中的一个函数,就需要将整个库的程序放进可执行文件中,造成空间的浪费。而且如果多个程序依赖同一个库A,那么很可能造成系统内存中存放了多个库A的副本,因为静态链接的情况下,库A已经放进了可执行文件了,不需要和其他进程共享库A。如图2,在静态链接的情况下,三个进程都依赖了库A,所以在内存中有三份A的拷贝。
图2

3.由于静态链接十分浪费空间,所以考虑对于多个程序依赖的同一个库A,能否让多个程序共享同一个库A的程序副本(地址无关问题)(如图3)?
图3
动态链接就是为了解决这个问题,节省存储空间所提出的。对于共享库,因为每个程序的操作不一样,所以数据段是不能进行共享的,但是共享库的代码段时可以进行共享的。所以库的程序指令部分共享,但数据部分需要每个程序自己存储一份数据副本。但在共享库A后,程序只有在装入运行时才能确定库A在内存中的地址,为了解决这个问题,动态链接使用了一个中间表项.got.got中记录了程序模块所依赖的外部符号(函数与变量)的地址,显然这个表项的值只有在装载时才能填充。而在链接生成目标文件或者可执行文件时,为指令提供符号在.got中的地址。
4.延迟绑定:可以看到当使用动态链接时,需要在装入才能确定符号真实地址,所以在装入时要做很多重定位操作,这会严重影响程序启动的效率,考虑到有的函数在程序执行到结束时都可能不会调用,所以没必要在一开始就将这些函数的地址确定。为了实现在第一次调用时才绑定函数地址,又增加了一个.got.plt表,当程序调用函数时,不是直接到.got表中找函数的地址,而是到.got.plt表中找到对应表项,执行此表项指向的函数。
5.显示运行时链接:同样考虑到有的库可能程序运行结束都不可能用到或者很少用到,所以能否在程序需要用到这些库的时候再进行装载(如插件、驱动),为了实现这种方式,动态连接器开放了一些API来让程序控制装载和卸载指定的模块。
6.ABI:ABI是二进制程序层面的应用接口,它规定了更加底层的东西,比如printf函数,对于API来说它只关心函数的参数类型返回类型,而对于ABI来说它关心的是这个函数参数入栈顺序、内存分布、符号解析等。
7.变量存储:静态变量(包括局部静态变量)和全局变量是存储与单独的section(.data)中的,而局部变量存储在进程的栈中,在编译时,编译器就会将局部变量转换为相应的出栈入栈操作。
8.程序启动时,CUP的控制权:
控制权

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

推荐阅读更多精彩内容

  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 7,774评论 0 27
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,084评论 1 32
  • 翻译来源: RunLoops Run Loops RunLoops是与线程紧密相关的基础架构的一部分,简称运行循环...
    AlexCorleone阅读 563评论 0 1
  • 今天,我的妈妈老暗回来,我都急死了。 我放学了到家大概都4点50了,我以为妈妈洗车都来家了,可是,我回家...
    程硕阅读 172评论 0 2