查找导致依赖性的目标文件
Find object file that is causing dependency
我的情况有点特殊:我有一个应用程序可以编译,links 并在使用 MSVC 编译时启动。我现在正在重新编译它 clang-cl,这会导致它编译,link 和崩溃。
感谢 Dependency Walker,我发现正在加载意外的 DLL。在我的例子中找到 std::allocator<char>::allocator(allocator const &)
.
的符号
据此,我目前掌握了以下信息:
- 需要此符号的 DLL
- 公开符号的 DLL
- 给出问题的符号
为了记录错误,我应该能够将代码减少到可接受的大小。
上传整个专有代码库不是一个选项,上传一个 20 行的 .cpp 文件是。
为了减少,我需要找到需要这个符号的.cpp/.obj 文件。从那里开始,减少它变得很容易。
有了这个,我正在寻找一种方法来检测 .obj 文件是否在不同的 DLL 中搜索符号。
我已经找到了:
- dumpbin /SYMBOLS:告诉我符号导出的位置
- dumpbin /DEPENDENTS: 告诉我一个 DLL 所依赖的 DLL
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
我的情况有点特殊:我有一个应用程序可以编译,links 并在使用 MSVC 编译时启动。我现在正在重新编译它 clang-cl,这会导致它编译,link 和崩溃。
感谢 Dependency Walker,我发现正在加载意外的 DLL。在我的例子中找到 std::allocator<char>::allocator(allocator const &)
.
据此,我目前掌握了以下信息:
- 需要此符号的 DLL
- 公开符号的 DLL
- 给出问题的符号
为了记录错误,我应该能够将代码减少到可接受的大小。 上传整个专有代码库不是一个选项,上传一个 20 行的 .cpp 文件是。
为了减少,我需要找到需要这个符号的.cpp/.obj 文件。从那里开始,减少它变得很容易。
有了这个,我正在寻找一种方法来检测 .obj 文件是否在不同的 DLL 中搜索符号。
我已经找到了:
- dumpbin /SYMBOLS:告诉我符号导出的位置
- dumpbin /DEPENDENTS: 告诉我一个 DLL 所依赖的 DLL
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