【问题标题】:How can I know which functions are invoked in a .dll file when this .dll file is used by a .exe program?当 .exe 程序使用此 .dll 文件时,我如何知道在 .dll 文件中调用了哪些函数?
【发布时间】:2012-12-21 08:59:08
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ dll dllimport


    【解决方案1】:

    您可以检查可执行文件的符号表以获取导入的符号。对于 Windows(.exe 文件),您可以使用 DUMPBIN utility with /IMPORTS as described here

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

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

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

    【讨论】:

    • 这不适用于使用 pinvoke 的程序。在运行时通过 GetProcAddress 进行绑定。
    • @HansPassant:是的,我会更新答案。虽然问题没有提到.NET 作为一个平台,所以我不会特别担心pinvoke。但是,代码仍然可以使用GetProcAddress,因为它是用于从不限于pinvoke 的DLL 获取函数的通用API。
    【解决方案2】:

    您可以使用Dependency Walker

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

    【讨论】:

      猜你喜欢
      • 2018-02-12
      • 2018-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      相关资源
      最近更新 更多