Chinaunix

标题: 有关函数重定位问题请教 [打印本页]

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

还有我百度到    将逻辑地址空间重定位到物理地址空间的时机有三种:
  1、程序编译连接时。
  2、程序装入内存时。
  3、程序执行时。
无法理解,请各位大侠帮忙解释……。感激不尽啊
作者: MMMIX    时间: 2012-12-05 14:20
陈九CU 发表于 2012-12-05 14:03
这样子机器码中就没有了所谓的函数名,变量名也没有。


对于动态库来说,符号表(符号表不是字符串表)总是要有的,而这个符号表给出的就是符号(函数名,全局变量名,等)和其地址的对应。
作者: 陈九CU    时间: 2012-12-05 14:28
http://www.docin.com/p-204038336.html
刚找到的,稍微比刚才多理解了一点重定位
作者: 陈九CU    时间: 2012-12-05 14:30
那对于调用动态库函数的那句源代码会被编译成什么样子啊?回复 2# MMMIX


   
作者: MMMIX    时间: 2012-12-06 10:19
陈九CU 发表于 2012-12-05 14:30
那对于调用动态库函数的那句源代码会被编译成什么样子啊?回复 2# MMMIX


自己写个小程序用 gcc 编译一下看看不就清楚了?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2