2

我有一个与调用 dll 文件中的函数有关的问题。如果我理解得很好,在 dll 文件中我们可以定义许多不同的函数,这些函数可以由 .exe 文件调用。例如,可以从a.dll文件中调用的函数包括以下函数:

void fun1(int k);
int  fun2(float value);
float fun3(double sig);

例如,对于一个特定的程序,a.exe它可能只调用fun1函数,a.dll而不使用其他函数。那么我的问题是,我怎么知道运行.exe程序时调用了哪些函数。

4

2 回答 2

4

您可以检查可执行文件的符号表以获取导入的符号。对于 windows(.exe文件),您可以按照此处所述使用DUMPBIN实用程序/IMPORTS

更新:如评论中所述,可执行文件可以加载 DLL 并以在编译时不创建符号的方式动态访问它们。例如,通过在使用LoadLibrary加载 DLL 后调用GetProcAddress。在这种情况下,将不存在符号并且不会列出它,但可能会或可能不会调用该函数。DUMPBIN

如果您或多或少地知道 exe 是如何工作的,并且它似乎没有动态地做事(例如从插件 DLL 加载代码),那么假设没有动态加载发生可能是安全的。此外,如果 exe 的符号表显示来自给定 DLL 的某些函数,则 exe 不太可能动态访问来自同一 DLL 的函数。

此外,函数出现在符号表中这一事实并不能保证它会被 exe 调用,但在任何正常的静态情况下,它很有可能会被调用。

于 2013-01-07T15:49:41.953 回答
1

您可以使用Dependency Walker

“Dependency Walker 是一个免费实用程序,它可以扫描任何 32 位或 64 位 Windows 模块(exe、dll、ocx、sys 等)并构建所有依赖模块的层次树形图。对于找到的每个模块,它都会列出所有该模块导出的函数,以及其中哪些函数实际上被其他模块调用。另一个视图显示所需文件的最小集,以及每个文件的详细信息,包括文件的完整路径、基地址、版本号、机器类型、调试信息等。”

于 2013-01-07T15:50:51.763 回答