也是遗留下来的问题,今天想解决掉void MyPorc()
{
 printf("ok\n");
}int main()
{
 int Address = (int)&MyProc;
 getchar();//此处下断点
 return 0;
 }F5调试,运行到断点处,观察发现 MyProc 的值是 0x00fd13a0
Address的值是 0x00fd1023查看内存 0x00fd1023 此处的代码是MyProc:
00FD1023 E9 78 03 00 00       jmp         MyProc (0FD13A0h)  
@ILT+35(_WideCharToMultiByte@32):
00FD1028 E9 49 25 00 00       jmp         WideCharToMultiByte (0FD3576h)  
@ILT+40(@_RTC_AllocaHelper@12):
00FD102D E9 FE 05 00 00       jmp         _RTC_AllocaHelper (0FD1630h)  
_RTC_GetErrorFuncW:
00FD1032 E9 69 16 00 00       jmp         _RTC_GetErrorFuncW (0FD26A0h)  
@ILT+50(__RTC_NumErrors):
00FD1037 E9 94 15 00 00       jmp         _RTC_NumErrors (0FD25D0h)  
此处似乎是一张表?我想知道这是什么表,怎么来的  为什么获得MyProc 的地址却获得了这个地址的跳转地址

解决方案 »

  1.   

    或者再加一句: int Address2 = (int)MyProc; 不要取指符,看看有没有不同。
      

  2.   

    int Address = (int)MyProc;这样试试,你不就是想得到MyProc的地址吗?
      

  3.   

    MyPorc是在dll中的函数?MyProc:
    00FD1023 E9 78 03 00 00       jmp         MyProc (0FD13A0h)  
    @ILT+35(_WideCharToMultiByte@32):
    00FD1028 E9 49 25 00 00       jmp         WideCharToMultiByte (0FD3576h)  
    @ILT+40(@_RTC_AllocaHelper@12):
    00FD102D E9 FE 05 00 00       jmp         _RTC_AllocaHelper (0FD1630h)  
    _RTC_GetErrorFuncW:
    00FD1032 E9 69 16 00 00       jmp         _RTC_GetErrorFuncW (0FD26A0h)  
    @ILT+50(__RTC_NumErrors):
    00FD1037 E9 94 15 00 00       jmp         _RTC_NumErrors (0FD25D0h)  
    看起来应该是exe的导入表
      

  4.   

    这个表是为了跳入导入表用的,因为你的EXE启动后会固定装载到0x00400000的基地址空间,附带的dll会连到自己的基址空间,例如0x10000000,但如果此时此地址已经被其他dll文件加载后占用了,那么系统会给你分配一个其他空间地址加载你的dll,这张表的jmp就是跳向这个地址dll的相关函数,有可用是不用修正的地址,有可能是修正后的地址。
      

  5.   

    个人理解为函数的符号表,debug版本下编译器生成的辅助代码假如你改成static void MyProc,那么这两个值是一样的!
      

  6.   


    楼主这句是取了指向MyProc的指针,不是MyProc的地址,函数名就已经代表函数的地址了,所以如果改成:int Address = (int)MyProc;那么Address与MyProc的值应该是一样的了。那个表是内存中的地址表,你Address的值是00FD1023,是指向MyProc,不是MyProc的值,当然就是跳转啦。
      

  7.   

    这个表是为了支持"Program Database for Edit and continue"和"link incremetally"而设的,在下次链接的时候,直接更新这个表就可以了。如果将函数声明为
    static void MyPorc(){}
    则这个函数就不会有写在这个表里面。取消上面提到的那两项就不会再生成这个跳转表了。
      

  8.   

    xue_xi