在使用WinDBG时,要加载调试符号则是使用的编译器生成的标准PDB调试库。
而在OD中,有两类调试信息来源:
1.PDB文件
2.LIB文件
其中,LIB文件在查找导入符号时,能够发挥重要的作用。
下文将解释OD和VS2008使用LIB库的一些条件:
1.简介
例如众所周知的MFC库大量使用了DLL导出序号,因此在OD中查看这些导入信息时,都只能看到序号。
为了增加可读性,可以在OD中使用 “选择导入库” 功能来加载LIB信息,这样就可以在名称表中看到DLL的原始导入名称了。
在创建DLL工程时,程序员可以选择以序号输出导出函数。
2.VC2008的编译设置
在VC2008中,可以使用DEF文件来完成这项任务。其方法是,在工程中增加一个DEF文件。
DEF文件中的导出符号如下所示:
LIBRARY TestLib
EXPORTS
fnTest @1 NONAME
其中:
TestLib是导出库名称
fnTest @1 NONAME表示了,fNTest是导出的原始函数名,将导出为序号为1的函数,NONAME表示强制不输出函数名称
LIB文件中存储了fnTest这种名称,当程序使用以上导入库时,在lib中匹配fnTest函数名称,然后按照序号1来链接。
在VC2008中,如果要输出序号只能用DEF文件来实现,__declspec(dllexport)这种默认方式只能输出名称。
3.VC2008的链接设置
链接时,必须在链接器指定命令行选项:/DEF:TestLib.def,则编译器会使用DEF文件作为导出参考。
4.OD应用LIB信息
OD可以利用LIB来还原fnTest这个信息。
而且,OD在加载DLL时,会比较智能的在当前目录下寻找DLL同名的LIB文件作为导入信息库。