谁来详细讲一下这个问题?????

ruobo 2003-05-17 05:45:38
讲一下在编译和链接过程中地址映射过程,比如动态链接和静态链接过程有什么不同,地址是在什么时候进行变换的。谢谢,有分相送。
...全文
91 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wsSdj 2003-05-18
  • 打赏
  • 举报
回复
上面这个问题我知道,林锐就是写软件工程的那个人。
静态连接我就不说了,因为小小鸟已经说过了。
关于动态连接的问题,如果想知道的比较清楚的话,可以去参考PE(windows中的EXE文件格式,不是DOS的)文件格式中的Import表结构。在调用外部DLL时,CALL指令实际上被转化为EXE文件.text(Borland C++ 编译后是.icode)块中的Jmp dword ptr [xxxxxxxx].其中的xxxxxxx 就是真正的目的地址.装载程序判定目标函数的地址并将该函数插补到执行文件的映象中,所需的信息都放在PE文件的.idata中,也就是Import块.而想知道Import 的结构的话,可以去查有关资料.csdn上好象就有的
zolas 2003-05-18
  • 打赏
  • 举报
回复
林锐是什么人?
overawe 2003-05-18
  • 打赏
  • 举报
回复
学习....
ruobo 2003-05-18
  • 打赏
  • 举报
回复
我的理解是,
编译的过程是把源程序编译成计算机可识别的汇编代码,但是还是存储在外存中的,
编译的过程生成了一些符号地址,比如函数的调用,相应的会变成CALL FunctionI(不准确啦呵呵)这样的符号地址。
当装入主存时,相应的根据动态地址映射(动态重定位)完成地址的映射过程,也就是把符号地址变成相应的物理地址,但这是在动态重定位时完成的,也就是每次执行到相应的涉及到地址变换的地址时才会发生,而静态的重定位是在装入时一次性的完成整个程序地址空间中的所有地址变换。
链接的过程也分为动态和静态2种,静态链接是在编译过程中完成的,比如我们在程序中调用了C语言中的库函数(数学什么的),然后在编译过程中把这些库函数一起编译,运行时同时装入内存,也就是如果我们有5个函数调用了一个库函数,那么这个库函数在内存中就要有5个空间,所以很浪费,于是就有了动态链接DLL,动态链接过程是在运行(RUN-TIME)时完成的,对动态链接库中的函数调用的地址映射过程也是在运行时完成的。
晨星 2003-05-17
  • 打赏
  • 举报
回复
不懂,关注中。。。
ruobo 2003-05-17
  • 打赏
  • 举报
回复
说话说话,怎么没人回复,受不了了,
林锐这家伙说过,不懂内存的人就不懂编程,
虽然这家伙未必牛的高深莫测,但是这句话还是有道理,
你们快来讨论讨论!!!!!!!!!
addo2001 2003-05-17
  • 打赏
  • 举报
回复
UP

70,032

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧