查找引起依赖性的目标文件

时间:2018-12-23 12:33:58

标签: c++ windows dll dependencies dumpbin

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

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

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

  • 需要此符号的DLL
  • 暴露符号的DLL
  • 发出问题的符号

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

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

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

我已经找到:

  • dumpbin / SYMBOLS:告诉我符号在哪里导出
  • dumpbin / DEPENDENTS:告诉我DLL所依赖的DLL

dumpbin /DEPENDENTS状态:

  

转储导入函数的名称。

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

2 个答案:

答案 0 :(得分:2)

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的{​​{1}} wheras中找到该符号,并打印foo

因此,要查找从其他位置(例如DLL)导入的所有符号,您只需要在UNDEF的输出中搜索UNDEF

答案 1 :(得分:1)

如果您使用

dumpbin /symbols Source.obj >dump.txt

它将转储COFF对象,并且在显示“外部”和“ UNDEF”的任何地方都需要链接来查找这些外部符号。

我创建了一个依赖于小例子

void foo();
int main()
{
    foo();
}

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

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

UNDEF和外部表示链接器将使用它来搜索未定义的符号。

描述了here

的COFF格式