我的情况有点特殊:我有一个应用程序,在使用MSVC编译时可以编译、链接和启动。我现在正在重新编译它,这会导致它编译、链接和崩溃。
多亏了Dependency Walker,我发现正在加载意外的DLL。在我的情况下,找到一个符号 std::allocator<char>::allocator(allocator const &)
std::allocator<char>::allocator(allocator const &)
基于此,我目前拥有以下信息:
为了记录错误,我应该能够将代码减少到可接受的大小。 上传整个专有代码库不是一个选项,上传一个20行的.cpp文件是一个选项。
为了减少,我需要找到需要此符号的.cpp/.obj文件。从那以后,减少它就成了一件容易的工作。
有了这个,我正在寻找一种方法来检测.obj文件是否在不同的DLL中搜索符号。
我已经发现:
dumpbin /DEPENDENTS
做 不 转储导入函数的名称。
如何基于.obj文件转储导入函数的名称?
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 酒吧 上面说这个符号可以在 SECT3 当 福 它打印 UNDEF
bar
foo
酒吧
SECT3
福
UNDEF
因此,为了找到从其他地方(例如DLL)导入的所有符号,您只需搜索 未定义 .
未定义
例如,如果您使用
dumpbin /symbols Source.obj >dump.txt
它将转储COFF对象,并在其表示外部和未定义链接的任何地方查找这些外部符号。
我创建了一个小示例,具体取决于
void foo(); int main() { foo(); }
并且可以在转储文件中看到这一点
01B 00000000 UNDEF notype () External | ?foo@@YAXXZ (void __cdecl foo(void))
UNDEF和External表示链接器将使用此into搜索未定义的符号。
描述了COFF格式 here