【问题标题】:function address in .pdb is different from .exe,why?.pdb中的函数地址与.exe不同,为什么?
【发布时间】:2013-01-20 15:23:14
【问题描述】:

我通过 SymEnumSymbols 从 .pdb 文件中读取了我的 main 函数的地址,值为 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 
    ...
{

然后我尝试通过将 2 个不同的地址传递给 SymGetSymFromAddr64 来验证结果,我预期得到相同的函数符号,唯一的区别是 PIMAGEHLP_SYMBOL64 的地址成员,一个是 100116e0,另一个是 4116E0。 我也试过用微软的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

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

【问题讨论】:

    标签: c++ windows winapi windbg dbghelp


    【解决方案1】:

    这些地址是“相同的”,它们不同,因为 PDB 中的地址是相对虚拟地址,而您使用 enum proc 找到的地址已被虚拟化。 PDB 将始终使用不会被 rebase 等隐藏的地址。

    如果您减去基于加载地址(或 .code 部分的开头,取决于),您将获得 RVA。 This SO 问题可能被证明是有用的阅读。

    【讨论】:

    • 谢谢你的解释!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-23
    • 2021-12-18
    • 2021-04-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    相关资源
    最近更新 更多