程序员的自我修养(二)

共享对象在编译时不能假设自己在进程虚拟地址空间中的位置,可执行文件可以确认。

装载时重定位

如果使用静态链接的重定位方法,即模块装载地址确认,对所有绝对地址引用重定位。但是指令部分是多个进程共享的,装载时重定位需要修改指令,所以指令部分不能这么做。而可修改数据部分对于不同进程有多个副本可以这么做。

地址无关代码-fPIC

只用装载时重定位无法做到指令部分在多个进程之间共享。引入地址无关代码,就是把代码中可修改部分提取出来跟数据放在一起,在每个进程中拥有一个副本。因此引入.got(全局偏移表)。程序需要访问变量时,先找到got然后根据变量中对应的项找到变量的目标地址。

PLT延迟绑定

使用动态链接需要间接寻址,比较慢。所以使用PLT在函数第一次被用到时才进行绑定。每个外部函数在PLT中有个对应的项, bar@plt:

bar@plt:
jmp *(bar@GOT) //got中保存的项
push n
push moduleID
jump _dl_runtime_resolve

如果初始化过,那么第一条指令就是跳转地址。如果不是,第一条指令会跳转到第二条指令。

.rel.plt

n为符号引用在该重定位表下的下标。ELF将GOT拆成两个表.got|.got.plt .got保存数据(全局变量),.got.plt保存函数引用被剥离出来。

。got.plt

第一项保存.dynamic
第二项保存本模块ID
第三项保存_dl_runtime_resolve地址

PLT本身为地址无关代码,可以和代码段直接合并。

可以不用PIC,那相当于指令部分不能共享浪费内存。

.dynamic段

.dynamic段保存了动态链接器所需要的基本信息 例如依赖哪些共享对象 动态链接符号表的位置 动态链接重定位表的位置 共享对象初始化代码的地址 .dynamic其实就是动态链接的elf文件头

.dynsym为动态符号表,保存与动态链接相关的符号.symtab包括全部符号

PIC代码还需要重定位吗,需要

代码不需要了,因为剥离出来到了GOT。除此之外还有绝对地址引用的数据部分也需要重定位。.rel.dyn.got及数据段,是数据部分的重定位.rel.plt是函数部分的修正

装载共享对象

.dynamic段中有一种类型入口是DT_NEED即依赖的共享对象。加载进来后,遍历重定位表,将got/plt需要重定位的位置进行修正。

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

推荐阅读更多精彩内容

  • 九月的天空很蓝,几朵白云挂在上面,像几件白色的羽毛衣。 我把所有工具从烤饼车腹部掏出来,放在车面上,整理好卫生,开...
    篱笆影阅读 249评论 0 2
  • 2018年3月17日,包括英国《卫报》、美国《纽约时报》在内的多家媒体报道了Facebook数据泄露事件。事件的爆...
    白马笑北风阅读 230评论 0 0
  • 看了一部电影,《雷神》故事讲述了众神之主奥丁的儿子索尔的心路历程 他们王国的宿敌便是冰巨人族,两族交战,冰巨人族战...
    bu大意阅读 161评论 0 0