免费注册 查看新帖 |

Chinaunix

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

[其他] 有关函数重定位问题请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-05 14:03 |只看该作者 |倒序浏览
在源代码编译的过程中,我知道编译完成后一些函数调用(即跳转指令)使用的是相对偏移地址(即要跳转的函数偏移现执行指令的位置),这样子机器码中就没有了所谓的函数名,变量名也没有。但是系统调用和动态库调用,我不知道是编译成机器码是什么样的格式的,这也是我想请教的问题之一。唯一可以确定的是调用与被调用之间有个明确的信息让CPU找到跳转的地址,比如说系统调用前会在C的堆栈里存个系统调用号,然后CPU进入内核模式,接着来C的堆栈里读系统调号,然后根据系统调用号找到系统调用的函数地址开始执行(这只是我对系统调用实现的一种猜测,不知道对不对)。还有动态库的调用,首先动态库要被加载进内存,这个加载规则我就没查到资料,是操作系统加载的还是主调函数加载的(个人猜测是第一种),然后加载的位置是如何确实的?据我猜测应该是动态库在一个确定的物理内存位置,但是每个不同的进程用了不同的虚拟地址映射到这个物理内存地址。即然用了不同的虚拟内存地址,那么每一个进程的跳转指令中就可以写出确定的地址,但是页表把这个确定的虚拟地址映射到物理内存地址。如果果真是这么实现的,我的疑问在于,动态库加载的物理内存地址是如何确定的。

还有我百度到    将逻辑地址空间重定位到物理地址空间的时机有三种:
  1、程序编译连接时。
  2、程序装入内存时。
  3、程序执行时。
无法理解,请各位大侠帮忙解释……。感激不尽啊

论坛徽章:
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-12-05 14:20 |只看该作者
陈九CU 发表于 2012-12-05 14:03
这样子机器码中就没有了所谓的函数名,变量名也没有。


对于动态库来说,符号表(符号表不是字符串表)总是要有的,而这个符号表给出的就是符号(函数名,全局变量名,等)和其地址的对应。

论坛徽章:
0
3 [报告]
发表于 2012-12-05 14:28 |只看该作者
http://www.docin.com/p-204038336.html
刚找到的,稍微比刚才多理解了一点重定位

论坛徽章:
0
4 [报告]
发表于 2012-12-05 14:30 |只看该作者
那对于调用动态库函数的那句源代码会被编译成什么样子啊?回复 2# MMMIX


   

论坛徽章:
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
5 [报告]
发表于 2012-12-06 10:19 |只看该作者
陈九CU 发表于 2012-12-05 14:30
那对于调用动态库函数的那句源代码会被编译成什么样子啊?回复 2# MMMIX


自己写个小程序用 gcc 编译一下看看不就清楚了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP