首页
社区
课程
招聘
一个关于函数符号重定位的问题
发表于: 2011-1-6 00:21 6246

一个关于函数符号重定位的问题

2011-1-6 00:21
6246
最近,网上出来了《深入理解计算机系统》的新版本,其中在《链接》这一章遇到一个问题,
也是我一直搞不明白的事,希望知道其中原委的同学指点一下。
代码:
void foo()
{
}

void main()
{
     foo();//set break point here
}
在VC6.0下编译,DEBUG版本。汇编代码中有这样一段:
——————————————————————————
foo();
00401068 E8 98 FF FF FF       call        @ILT+0(foo) (00401005)

我一直有这样几个疑惑:
第一:“98 FF FF FF”是-104,它是怎么和“00401005”联系起来的?
第二:ILT(Import Lookup Table)是由谁 什么时间建立的?地址是多少?

call跟进,到达这里:
@ILT+0(?foo@@YAXXZ):
00401005 E9 16 00 00 00       jmp         foo (00401020)
这里,我也有同样的疑问:
第一:“16 00 00 00”中的16怎么和“00401020”联系上的?
或者说怎么样得到函数Foo的绝对地址的?

最终跳到函数foo的函数体中
1:    void foo()
2:    {
00401020 55                   push        ebp
00401021 8B EC                mov         ebp,esp
00401023 83 EC 40             sub         esp,40h

——————————————————————————
另外,在RELEASE下也有类似行为:
00401021 E9 DA FF FF FF       jmp         foo (00401000)
我想问一下:这是某个编译器的个别行为?还是编译器这么做有什么特殊的意义?
它和经常所说的地址重定位是一回事么?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 2687
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
自己又翻书找了找,有这么一段话:
“你可能想知道为什么汇编器会生成call指令中的引用的初始值为-4,汇编器用这个值作为偏移量,是因为PC(EIP)总是指向当前指令的下一条指令。在有不同指令大小和编码方式的不同的机器上,该机器的汇编器会使用不同的偏移量,这是一个很有用的技巧,它允许连接器透明地重定位引用,很幸运地不用知道某一台机器的指令编码。”
但我是有点不明白:它和基址重定位有什么区别和联系?
2011-1-6 00:44
0
雪    币: 723
活跃值: (81)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
3
0401068 E8 98 FF FF FF       call        @ILT+0(foo) (00401005)
---------------
此时eip 值为 040106D
目标地址=eip+offset=040106D+FFFFFF98=0401005(跳转的地址)

一句话:ILT是由编译器和链接器设定的(主要是链接器)
关于重定位,了解一下PE文件格式:http://www.mouseos.com/windows/index.html
其中:http://www.mouseos.com/windows/PE_image4.html
2011-1-6 11:52
0
雪    币: 2687
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
非常感谢mik学长的指点!看了mik学长的小站,感学长功力颇深,希望今后有机会讨教。
2011-1-6 13:43
0
游客
登录 | 注册 方可回帖
返回
//