请
登录
后使用快捷导航
没有帐号?
立即注册
已签到,明天再来
签到领寄托币
GO
寄托家园留学论坛
›
论坛
›
寄托专业学术申请版
›
计算机科学CS版
›
静态和动态链接的技术详解(LINUX) zz
返回列表
查看:
2144
|
回复:
1
[技术问答]
静态和动态链接的技术详解(LINUX) zz
[复制链接]
DriverEntry
UID: 143979
DriverEntry
当前离线
最后登录
2013-4-6
在线时间
4172 小时
寄托币
48275
声望
3110
注册时间
2003-9-1
阅读权限
175
帖子
1491
精华
44
积分
114817
UID
143979
元老版主
声望
3110
寄托币
48275
注册时间
2003-9-1
精华
44
帖子
1491
主页
发消息
电梯直达
楼主
发表于 2009-6-20 12:53:35
|
只看该作者
|
倒序浏览
http://linux.chinaunix.net/bbs/thread-1118727-1-1.html
原创!!!
所谓的静态文件也就是说以.o结尾的文件,这类文件会被ld合并起来形成一个可执行的文件
例如写了一个文件add.c和main.c可以分别的生成add.o和main.o文件,然后ld可以把这两个文件合并起来形成一个真正可执行的文件
代码如下:
//main.c
#include <....>
extern int add (int, int);
int main (int argc, char **argv)
{
int x = 4;
return add (x, argc);
}
<><><><><><><><><><><><>
// add.c
int x = 0;
int add (int a, int b);
{
return (a + b + x);
}
一般来说ld会把相关的静态库都链接起来,一般一个静态库包含数据段,可执行段,ld所负责的主要的问题就是把所有的静态库里面的数据段合并成一个数据段,所有的可执行段组合成一个可执行段,这里面所涉及到的主要的问题就是引用。
一般来说对于在同一个静态库之间的函数引用实际上是引用的偏移地址,例如在同一个静态库中的函数a引用了函数b,那么实际上在call的时候,地址是b相对于a当前的偏移地址,对于a来说,掉用b不论在什么时候的偏移都是样的,因为ld并不会去拆分一个静态库的可执行段,但是对于像a函数调用了另外一个另外一个静态库中的函数b的话,因为在对a所在的文件编译成静态库的时候,因为不知道b将会在什么位置,所以编译器就会在对a所在的文件编译的时候,就会在目标文件中增加一项重定位项,该项中描述了在那里需要进行重定位。例如对于a来说,会有大概这样的一个项:在可执行段的偏移0x7f处,有一个引用了函数b,b是外部的函数。这样当ld在把所有的静态文件进行链接的时候,就会在各个被链接的静态库中寻找关于函数b的描述,任何一个静态文件都有一个关于自身的符号的描述,例如包含了函数b的这个静态文件就一个类似于对b的描述:b在可执行段的偏移为0x43的地方,大小为80b,这样当ld在对a和b所各自在的静态文件进行链接的时候,就会首先的把a和b的可执行段放在一起,这样就确定了函数b的最终的执行地址,和a最终的执行地址,这个时候,就可以根据a中的提供的关于b的重定位信息来修改a所在的静态文件的可执行段,从而让a能正确的引用函数b,
对于静态文件的数据合并实际上在遵循同样的规则。
一般的静态文件的数据
Num: Value Size Type Bind Vis Ndx Name
8: 00000000 22 FUNC GLOBAL DEFAULT 1 add
num是符号的标识号码,没有意义。value是指该符号在它所在的段的偏移地址,当该符号没有绑定的时候也是该数值。size用来指定该符号一共描述了多少的数据,例如对于一个整数来说的话,size就是4,type指定该符号的意义,ndx用来指定该符号所出现的段,一般1为text,2为data
Offset Info Type Sym.Value Sym. Name
0000000d 00000701 R_386_32 00000000 number
对于可执行段中的重定位信息都放在section .rel.text中,上面这个项则指定了在text段中的偏移0x0d中,有一个对符号number的引用,info字段则主要用来描述该符号的名字索引,以及重定位的类型,也就是字段type的数值。
静态库的一个不好的地方就是:如果一个函数需要被不同的可执行文件引用,则当这些可执行文件在运行的时候,内存中会有多分该函数的复制,这对内存的浪费是相当的严重的。于是就引入了PIC,也就是所谓的位置无关代码。所谓的位置无关代码也就是说这些代码不论放在内存什么的位置,他们都可以被执行。这样的技术也就是动态链接库技术。一般来说如果一个动态连接库内的函数引用了该动态库中的函数的话,那么该函数可以正常的执行,但是问题是如果一个在动态库中的函数a引用了另外一个动态库中的函数b,那么a在编译成动态库的时候压根就不知道b的位置,如果在对a所在的库进行编译生成动态库的时候,还是按照静态库的方法来生成重定位信息的话,那么产生的问题就是:因为a所在的段是可执行段,这些可执行段在被加载放进内存的时候一般都会被设置成不可修改,可执行标识,所以就没有机会在对a进行修改了,也就是说哪怕是找到了b,a同样也不能对b进行引用了,因为a所在的段不允许被修改。
看来原先的那种静态库中的重定位的方式对于PIC来说是不合适的。这就要求有新的技术来应付这一个问题。我们都知道call可以引用某一个内存地址中的数据,这就为解决a引用其他动态库中的函数b提供了契机,当对a所在文件进行编译生成动态库的时候,可以生成一段数据段,该段主要用来存储各个函数外部引用的函数的地址。在生成a所在的动态库的时候,a对b的引用,也就是call后的数据则不在是b的绝对地址,而是对生成的那段用来存储外部函数的段的地址。这样当那个段中的地址改变成b的地址的时候,a就可以正确的引用b这个函数了。
这里又引入到另外的一个问题,如何找到b。系统提供了一个专门的解释器,该解释器也就是动态加载器,他的主要的功能就是接受一个被查询的字符,以及把这个找到的结果存储到那里。一般来说当a第一此调用b的时候,实际上call后面的那个地址里面所装的数据就是一个用来解析符号的函数的地址,该函数会找到call所要调用的函数的名字,然后控制会从该函数转向动态加载器,只不过在转向动态加载器之前,这个函数会把那个要找的函数的名字,以及把结果存放在那里推向堆栈,然后调用那个动态加载器,而那个要被修改的地址,就是a的call所引用的那个地址,当动态加载器找到b函数所在的地址的时候,就会把该地址存储到那个地址中去,这样当a再次调用b的时候,call只要把该他所引用的地址中的数据取出来就是了。
0
0
使用道具
举报
lycong
UID: 2575069
lycong
当前离线
最后登录
2021-10-8
在线时间
2074 小时
寄托币
3838
声望
957
注册时间
2008-11-23
阅读权限
100
帖子
131
精华
7
积分
7087
UID
2575069
荣誉版主
声望
957
寄托币
3838
注册时间
2008-11-23
精华
7
帖子
131
主页
发消息
沙发
发表于 2009-6-20 12:54:52
|
只看该作者
终于看到有技术贴咯:D
我来做
广告
,有本事来封我啊 笨~~~
双非DIY美硕申请总结
使用道具
举报
返回列表
RE: 静态和动态链接的技术详解(LINUX) zz [
修改
]
高级模式
B
Color
Image
Link
Quote
Code
Smilies
|
添加附件
点击附件文件名添加到帖子内容中
描述
发表回复
回帖后跳转到最后一页
荣誉版主
GRE斩浪之魂
Golden Apple
港澳资深筒子
港澳申请助理
问答
Offer
投票
面经
Q
【问答】本科申Mphil会不会相对申phd容易一点?感觉phd还得和硕士毕业的一起卷。
A
很多老师不收mphil的。很多mphil的申请者也是已经有一个MA/MS了。
Q
【问答/瑞典】数学学分能不能算作统计学分?
A
这个的话要看课程描述怎么写,可以凑一凑。
Q
择校请教,还是想进前100,目前有诺丁汉计算机保底,利兹计算机10.8提交还在等,想咨询一下
A
你的BG具体是什么呢?
Q
【问答/丹麦】dtu的申请系统经常登不上去,是什么情况呀?
A
要用他发你邮件的那个链接进去,复制了打开,用书签保存的不行。
Q
【问答/瑞典】cv一般写几页?
A
1-3页,但感觉2页比较好,resume写一页,cv一般两页以上
more
Universitat Autònoma de Barcelona
idea
MSc
|
26Fall
|
Offer
爱丁堡大学
MSc cognitive science
MSc
|
26Fall
|
被拒
EIT-Innnoenergy
SENSE/智能电网系统
MSc
|
26Fall
|
AD小奖
DUKE
mae
MA
|
26Fall
|
Offer
more
申博求建议
请大佬们帮忙看一下我的bg如何申到全奖博 本人bg: 本科中外合办,Bsc econ 二等一毕业 硕士ic public health(目前未入学,博士方向想要继续public health 偏流行病 硕士十月份毕业 由于申硕的时候雅思考的比较晚,7(6.5)雅思明年应该还能用 因为本科和硕士专业不同,并且是一年硕,目前没有任何科研经历和pub 并且因为换专业的问题,我现在根本没发确定rp等要准备的内容
荷兰vs新加坡 希望能收到大家的宝贵意见
如果从润的角度出发,应该选哪个呢?Eur已经交了学费和保证金了,ntu学费是eur的差不多三倍了。各位大神可以给一些宝贵意见吗?
求助offer选择,焦虑
BG:双非双一流,88.5/100,信计专业,无科研,无竞赛奖项 目前考虑的offer主要是下面几个:萨克雷M1量子与分布式计算科学,萨克雷M2优化,博洛尼亚统计科学,Intermaths EMJM 我很感谢萨克雷看得上我,我也知道萨克雷M2优化的offer真的很好,下面说说我犹豫的点: 1. 课业压力,我本科虽然是数学专业,但是强度绝对远低于法国数学,我担心M2优化的课业压力,虽然我也挺喜欢这个方向的,但始终得考虑自己的能力 2. 萨克雷M1 QDCS我目前了解下来,对这个专业的评价都不太好,好像很多人都会转走,但是会不会两年制正常读下来,更容易申请phd 3. 我目前的想法是留欧,读phd>就业>回国,可以之后回,希望能先在欧洲干一段时间再说。只有M2优化+本科成绩,无科研的情况下,考虑到法国数学phd申请非常卷,phd申请会不会非常困难 4. 博大统计科学给分非常高,EM我了解下来也差不多,而且课程更偏应用,以EM为例,我研二会被分到做例如医学成像、癌症建模等方向,说实在话,我感觉这个好像更好找phd,优化那个我看着非常理论 5. 如果我读萨克雷M2 优化没有找到phd,是否只能回国就业?还是说我可以再申请一个m2?老实说,我对这个就业方向也很懵逼,昨天被砸懵以后,现在还是很懵 6. 如果考虑去其他国家读数学phd是可能的嘛 感谢大家看到最后,希望大家根据我提供的信息,给一点建议,非常感谢大家的帮助!!!
物理硕士项目二选一
物理学本科申到的硕士项目有两个,请问建议我选哪一个
more
香港大学
HKU教育学硕士Med网申时材料准备相对比较简单 有一段时间可以持续修改11月中旬递交 12月左右过期不能再...
芝加哥大学
AEPA-Oral test人在??随缘考的考官较老的白人女性,起初不苟言笑非常非常冷漠(甚至感觉有点不耐烦...
麻省理工学院
我这边正在找在海外的华人做跨境电商代理,我们的产品有 衣服鞋子,首饰,玩具。陶瓷,枫叶雕刻这些。(海外...
香港大学
tl:11.27投递-12.1/2面邀-12.10面试面邀给得很快,问题跟xhs上经验帖的都大差不差。1.申请动机2.之前的量化...
more
最新
精华
好老婆工会给你
哈萨克国立大学官方授权招生
【26 Fall】香港中文大学信息工程系Wing C. Lau招收网络安全方向全奖PhD
11.24 19:00 | 港教大 全球高等教育文学硕士线上宣讲会等你了解!
MCS |线上直播带你解锁留学新方向!
26fall 欧陆(北欧)救救孩子,没学上了,计算机类求定位
2025北京大学营销新标杆:CMO正规研修班开启啦
【征稿】2026年纺织工程国际研讨会 (CTSE-S)( EI Compendex)
招聘外贸订单对接员
招聘外贸运营专员
2025年最新最全多邻国测试的全面介绍,看完这篇文章就够了!
多邻国英语测试究竟是什么?
多邻国考试前电脑如何设置?要关闭哪些程序?
11.20 19:00 | 7大热门计算机类课程教授亲临现场!港城大计算学院线上宣讲重磅来袭
付费 求购 签证艺术 The Art of Visa 这本书 完整版
第八届图像、视频处理与人工智能国际会议(IVPAI 2026)
25fall econ phd经验总结 以及关于hku ars的情况
UZH遥感专业硕士第一年就读体验
50个小时GRE出分321自学经验
港校 拿到offer之后该做什么(各项手续timeline终于一次说清楚了)
美签DS-160表填写指南(详细指导)【2024最新版】
UT Ausitn MA Econ 就读体验
24Fall|聊一聊荷语区跨申的可能性
非法本(财务)申请cuhk llm(cbl)经验贴
瑞典硕士DIY申请攻略之名校介绍——SU斯德哥尔摩大学
网上核实永居+walkin申请特区护照+walkin注销户口(广州)+申请回乡证
博士申请常见问题Q&A
关于hku的两个跳板项目(theory/advanced research)
【经验贴】欧洲申博血泪史:7个全奖博士offer,却gap了两年(附各国签证风险盘点)
普签 / 大龄 / 本科二学位 / DIY
新加坡MBA(NUS, NTU, SMU)申请心得及攻略
毕业工签踩大雷 - unauthorized work before submitting PGWP - 附解决办法
0
0
转发
转发该帖子
静态和动态链接的技术详解(LINUX) zz
https://bbs.gter.net/thread-973619-1-1.html
复制链接
发送
积分 , 距离下一级还需 积分
回顶部