gpt4 book ai didi

c++ - .pdb 中的函数地址与.exe 不同,为什么?

转载 作者:可可西里 更新时间:2023-11-01 14:51:13 26 4
gpt4 key购买 nike

我通过 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
...
{

然后我尝试通过将 2 个不同的地址传递给 SymGetSymFromAddr64 来验证结果,我预期得到了相同的 funcitun 符号,唯一的区别是 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 个不同的答案???

最佳答案

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

如果减去基于加载地址(或 .code 部分的开头,视情况而定),您将获得 RVA。 This SO 问题可能对阅读有用。

关于c++ - .pdb 中的函数地址与.exe 不同,为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14426003/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com