最近,网上出来了《深入理解计算机系统》的新版本,其中在《链接》这一章遇到一个问题,
也是我一直搞不明白的事,希望知道其中原委的同学指点一下。
代码:
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直播授课