我处于一种特殊情况:我有一个使用MSVC进行编译时可以编译,链接和启动的应用程序。我现在正在重新编译它clang-cl,这导致它编译,链接和崩溃。
由于Dependency Walker,我发现正在加载意外的DLL。就我而言,要找到std::allocator<char>::allocator(allocator const &)
的符号。
有了这个,我目前有以下信息:
为了记录错误,我应该能够将代码减少到可接受的大小。 不能上传整个专有代码库,而是可以上传20行.cpp文件。
为了减少,我需要找到需要此符号的.cpp / .obj文件。从那里开始,减少它就很容易。
有了这个,我正在寻找一种方法来检测.obj文件是否在其他DLL中搜索符号。
我已经找到:
不转储导入函数的名称。
如何基于.obj文件转储导入函数的名称?
答案 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格式