查找导致依赖性的目标文件

Find object file that is causing dependency

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

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

的符号

据此,我目前掌握了以下信息:

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

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

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

我已经找到了:

dumpbin /DEPENDENTS 状态:

Does not dump the names of the imported functions.

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

如果你使用例如

dumpbin /symbols Source.obj >dump.txt

它将转储出 COFF OBJECT 以及所有显示 External 和 UNDEF 的地方,链接需要找到这些外部符号。

我创建了一个依赖

的小例子
void foo();
int main()
{
    foo();
}

并且可以在转储文件中看到这个

01B 00000000 UNDEF  notype ()    External     | ?foo@@YAXXZ (void __cdecl foo(void))

UNDEF 和 External 表示链接器将使用此 into 来搜索未定义的符号。

COFF格式描述here

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 的符号。不同之处在于,对于 bar,它表示符号可以在 SECT3 中找到,而对于 foo,它打印出 UNDEF.

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

的输出中搜索 UNDEF