免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1808 | 回复: 4
打印 上一主题 下一主题

关于动态链接以及地址无关性的一些问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-07-14 10:22 |只看该作者 |倒序浏览
问大家一个小问题,关于动态链接的,我看了深入理解计算机系统和那本程序的装载技术,一时对静态链接有所了解,然而对动态链接依然很模糊。举个例子吧,hello.c程序要用到printf函数,那其实是gcc hello.o printf.o -o hello,(假如是动态链接),这里面具体的细节不太了解。既然是动态链接,那链接自然推到了运行时,问题来了:
1.编译器在将hello.o链接成hello的过程,此时没有运行,那此时hello.o如何确定printf函数的地址呢 ??
2.地址无关性是什么意思呢?我知道库的位置要固定什么的,还有数据和代码分离,等等,但是还是很不理解。还有引入了很多的模型,什么指令跳转的,请大家帮我解释一下好吗,谢谢各位!

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
2 [报告]
发表于 2012-07-14 11:47 |只看该作者
zhjl616 发表于 2012-07-14 10:22
1.编译器在将hello.o链接成hello的过程,此时没有运行,那此时hello.o如何确定printf函数的地址呢 ??

hello.o 根本不需要確定 printf 的地址,hello.o 中也沒有這個地址(所以纔需要鏈接其它庫,如 libc)。而鏈接器在鏈接 hello.o 的時候,也不需要 printf 的運行時地址,只需要知道 printf 在 libc 中即可。

2.地址无关性是什么意思呢?我知道库的位置要固定什么的,还有数据和代码分离,等等,但是还是很不理解。还有引入了很多的模型,什么指令跳转的,请大家帮我解释一下好吗,谢谢各位!


地址無關就是庫不必裝載到內存的特定位置纔能使用。

论坛徽章:
3
15-16赛季CBA联赛之山东
日期:2016-10-30 08:47:3015-16赛季CBA联赛之佛山
日期:2016-12-17 00:06:31CU十四周年纪念徽章
日期:2017-12-03 01:04:02
3 [报告]
发表于 2012-07-14 18:24 |只看该作者


自己慢慢看
自己多思考

对于问题一, 既然实际的链接推迟到了运行时, 那么编译期的链接阶段是为了让静态链接器ld不报错(告诉ld某个模块有printf这个符号, 因此别报undefined reference错误).

问题二就比较麻烦了.  不过你实际上你只需要理解跳转指令, 并从跳转指令的角度出发来观察如何进行跳转就可以了. 从本质上来说, 跳转指令只有两种, 一种是相对当前PC(Programming Counter)跳转, 这种跳转方式需要确定目标地址相对当前PC的偏移值; 一种是绝对跳转, 跳转的目标地址由某个已知地址的变量或者寄存器给出.  你始终带着如何得到偏移值和确定目标地址的视角, 很容易就能知道为什么要给出那样的模型( 来达成地址无关性了 )......

论坛徽章:
0
4 [报告]
发表于 2012-07-15 09:53 |只看该作者
回复 3# captivated


    恩,说的很好呀,嘿嘿,谢谢你啊~~以后有问题再得多多请教你一下了。

论坛徽章:
0
5 [报告]
发表于 2012-07-15 10:02 |只看该作者
1  动态链接的时候 , 创建可执行文件的时候 不会拷贝库的全部二进制代码至文件中,只会拷贝一些重定位或符号表的一些信息,告诉链接器 某某符号在哪个库中有实现

2 应该是一个运行时重定位的过程 ,也就是 基址 + 偏移  来生成有效地址
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP