c++ - 查找导致依赖的目标文件
问题描述
我的情况有点特殊:我有一个应用程序在使用 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
不转储导入函数的名称。
如何根据 .obj 文件转储导入函数的名称?
解决方案
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
它表示可以在SECT3
wheras for foo
it prints中找到该符号UNDEF
。
因此,为了找到从其他地方(例如 DLL)导入的所有符号,您只需UNDEF
在dumpbin /symbols
.
推荐阅读
- ocaml - 如何在不丢失元素的情况下遍历列表
- ruby - 使用 roo 仅读取 xlsx 文件的第二行
- react-native - TextInput 行方向全视图
- python - Sklearn:NotFittedError:此 SVC 实例尚未安装。校准分类器的软投票
- autodesk-forge - Autodesk Viewer - 如何反转相机角度?
- c++ - 闪烁图案上的元素
- tomcat - 在 http 和 https 之间拆分上下文
- angular - 具有空值的角度/离子输入更改为 0
- python - 使用列表推导将列表列表写入文件
- python - 在 spyder 中安装 python 包时出现问题