.pdb文件中的函数地址与.exe文件不同,为什么?

3

我通过 SymEnumSymbols 从 .pdb 文件中读取了我的主函数的地址,该值为0x0100116e0

BOOL CALLBACK SymEnumSymbolsProc(PSYMBOL_INFO pSymInfo, ULONG SymbolSize, PVOID UserContext )
{   
    if( pSymInfo != NULL )
    {
        // Show the symbol      

        std::string str = pSymInfo->Name;
        if (str.find("main")!=-1)
        {
            int ss=pSymInfo->Address;
        }


    }
    return TRUE;
}

但是在VS2008的反汇编代码中,这个函数的地址是004116E0。

int _tmain( int argc, const TCHAR* argv[] )
{
    004116E0  push        ebp  
    004116E1  mov         ebp,esp 
    ...
{

然后我尝试通过向SymGetSymFromAddr64传递2个不同的地址来验证结果,我如预期得到了相同的函数符号,唯一的区别是PIMAGEHLP_SYMBOL64的地址成员,一个为100116e0,而另一个为4116E0。 我还尝试使用Microsoft的dbh.exe进行验证,命令为

load TestSymbolLookup.pdb
TestsymbolLookup [1000000]:n main
addr   : 10116e0
name   : main
size   : b2c
flags  : 0
type   : 2
modbase: 1000000
value  : 0
reg    : 0
scope  : SymTagExe<1>
tag    : SymTagFunction<5>
index  :1

我的主函数地址在TestsymbolLookup.exe中是唯一的,但为什么我得到了2个不同的答案?

1个回答

5
这些地址是“相同的”,但它们之间存在差异,因为在PDB中的地址是相对虚拟地址,而您使用enum proc找到的地址已经被虚拟化了。PDB将始终使用一个地址,该地址不会被重定位等操作所遮蔽。
如果您从基本加载地址(或者依赖于.code部分的起始位置)中减去这些地址,您将得到RVA。阅读 SO问题可能会对您有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接