.pdb中的函数地址与.exe中的不一样,为什么?
function address in .pdb is different from .exe,why?
我通过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来验证结果,我得到了相同的函数符号,唯一的区别是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
我的主函数的地址在TestsymbolLookup.exe中是唯一的,但为什么我得到了2个不同的答案?
这些地址是"相同的",它们不同,因为PDB中的地址是相对虚拟地址,而您在enum过程中找到的地址已被虚拟化。PDB将始终使用一个不能被重基等遮挡的地址。
如果减去基于加载地址(或.code
段的开始,取决于),您将得到RVA。这个问题可能会被证明是有用的。
相关文章:
- 为什么不;名字在地图上是按顺序排列的吗
- 为什么不能修改对象中的值?另外,我如何改进此链表?
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- C++ 基本 CTOR 说明 - 为什么不调用赋值/复制构造函数
- 为什么不递增?(构造函数)
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 为什么不允许使用可变长度数组作为向量元素?
- C++:为什么不调用移动构造函数?
- 在 C++ 中声明 const 对象需要用户定义的默认构造函数.如果我有一个可变成员变量,为什么不呢?
- 为什么不能用常量表达式声明数组?
- 为什么不能直接引用作用域枚举类成员,而不能为无作用域枚举生成类成员?
- C++ queue.front();为什么不从第一个元素开始呢?
- 为什么不允许这种交叉广播?
- 为什么将两个对象分配给另一个对象后,两个对象不一样?
- 像在 Python 中一样C++循环中的参数解析。为什么不起作用?
- 为什么重新执行我的多线程代码后输出不一样
- 为什么每次执行这个程序的CPU时间都不一样
- 高斯生成的核和书中给出的不一样.为什么?
- 为什么保存到文件和加载的时间(NULL)和仅仅时间(NULL)是不一样的
- .pdb中的函数地址与.exe中的不一样,为什么?