我有一个与调用dll文件中的函数有关的问题。如果我理解的话,在dll文件中我们可以定义许多可以由.exe文件调用的不同函数。例如,可以从a.dll
文件调用的函数包括以下函数:
void fun1(int k);
int fun2(float value);
float fun3(double sig);
对于特定程序,例如a.exe
,它可能仅在fun1
中调用a.dll
函数而不使用其他函数。然后我的问题是,我怎么知道在运行.exe程序时调用了哪些函数。
答案 0 :(得分:4)
您可以检查可执行文件的符号表以获取导入的符号。对于Windows(.exe
文件),您可以使用DUMPBIN
utility with /IMPORTS
as described here。
更新:如评论中所述,可执行文件可以加载DLL并以不在编译时创建符号的方式动态访问它们。例如,在使用GetProcAddress加载DLL后调用LoadLibrary。在这种情况下,将不会出现符号,DUMPBIN
将不会列出它,但可以调用或不调用函数。
如果你或多或少知道exe的工作原理并且它似乎没有动态地进行操作(例如从插件DLL中加载代码)那么假设没有动态加载可能是安全的。此外,如果exe的符号表显示来自给定DLL的某些函数,则exe不太可能从同一DLL动态访问函数。
此外,函数出现在符号表中的事实并不保证它将被exe调用,但在任何正常的静态情况下它很可能使它成为可能。
答案 1 :(得分:1)
您可以使用Dependency Walker
“Dependency Walker是一个免费的实用工具,可扫描任何32位或64位Windows模块(exe,dll,ocx,sys等),并构建所有相关模块的分层树形图。对于找到的每个模块,它列出了该模块导出的所有函数,以及其他模块实际调用了哪些函数。另一个视图显示了所需文件的最小集合,以及每个文件的详细信息,包括文件的完整路径,基地址,版本号,机器类型,调试信息等。“