首页 > 解决方案 > 查找导致依赖的目标文件

问题描述

我的情况有点特殊:我有一个应用程序在使用 MSVC 编译时会编译、链接和启动。我现在正在重新编译它 clang-cl,这会导致它编译、链接和崩溃。

感谢 Dependency Walker,我发现正在加载意外的 DLL。就我而言,要找到std::allocator<char>::allocator(allocator const &).

有了这个,我目前有以下信息:

为了记录错误,我应该能够将代码减少到可接受的大小。上传整个专有代码库不是一种选择,上传一个 20 行的 .cpp 文件是一种选择。

为了减少,我需要找到需要这个符号的 .cpp/.obj 文件。从那里开始,减少它就变得容易了。

有了这个,我正在寻找一种方法来检测 .obj 文件是否在不同的 DLL 中搜索符号。

我已经发现:

dumpbin /DEPENDENTS状态:

不转储导入函数名称。

如何根据 .obj 文件转储导入函数的名称?

标签: c++windowsdlldependenciesdumpbin

解决方案


dumpbin /symbols确实是这项工作的正确工具,因为它还列出了未定义的符号。

例如,当dumpbin /symbols用于打印从包含以下内容的源文件生成的目标文件中的符号时

void foo();

void bar() {
    foo();
}

我们得到

File Type: COFF OBJECT

COFF SYMBOL TABLE
[...]
008 00000000 UNDEF  notype ()    External     | ?foo@@YAXXZ (void __cdecl foo(void))
009 00000000 SECT3  notype ()    External     | ?bar@@YAXXZ (void __cdecl bar(void))
[...]

如您所见,它既包含已定义函数的符号,也包含仅声明bar的函数的符号。foo不同之处在于 forbar它表示可以在SECT3wheras for fooit prints中找到该符号UNDEF

因此,为了找到从其他地方(例如 DLL)导入的所有符号,您只需UNDEFdumpbin /symbols.


推荐阅读