C++ 查找导致依赖关系的对象文件

C++ 查找导致依赖关系的对象文件,c++,windows,dll,dependencies,dumpbin,C++,Windows,Dll,Dependencies,Dumpbin,我的情况有点特殊:我有一个应用程序,在使用MSVC编译时可以编译、链接和启动。我现在正在重新编译它,这会导致它编译、链接和崩溃 多亏了Dependency Walker,我发现正在加载意外的DLL。在我的例子中,查找std::allocator::allocator(allocator const&)的符号 基于此,我目前拥有以下信息: 需要此符号的DLL 显示符号的DLL 给予问题的符号 为了记录错误,我应该能够将代码减少到可接受的大小。 上传整个专有代码库不是一个选项,上传一个20行的.

我的情况有点特殊:我有一个应用程序,在使用MSVC编译时可以编译、链接和启动。我现在正在重新编译它,这会导致它编译、链接和崩溃

多亏了Dependency Walker,我发现正在加载意外的DLL。在我的例子中,查找
std::allocator::allocator(allocator const&)
的符号

基于此,我目前拥有以下信息:

  • 需要此符号的DLL
  • 显示符号的DLL
  • 给予问题的符号
为了记录错误,我应该能够将代码减少到可接受的大小。 上传整个专有代码库不是一个选项,上传一个20行的.cpp文件是一个选项

为了减少,我需要找到需要此符号的.cpp/.obj文件。从那以后,减少它就成了一件容易的工作

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

我已经发现:

  • dumpbin/SYMBOLS:告诉我符号的导出位置
  • dumpbin/DEPENDENTS:告诉我DLL所依赖的DLL
国家:

不转储导入函数的名称

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

如果使用

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格式

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
,根据定义,obj文件没有任何“链接”信息。这是链接器的工作来粘合所有这些。从.obj文件中,您只能看到.obj所需符号的名称。所以,你要关注为什么你的链接器没有达到你的期望。您是否检查了clang cl参数的详细信息和诊断信息。@SimonMourier我不知道如何用文字来表达它。在对象(.obj)级别,您只有符号。符号只是名称(可能是复杂/修饰的名称,但只是名称)。在链接器启动时,没有人知道列为UNDEF和External的符号的实现在哪里(当使用
dumpbin/symbols
时)。这些符号只是名字。链接器将尝试将这些名称与其拥有的整个obj/dll代码池绑定。顺便说一句,当链接器在名称和obj/dll池之间找不到任何匹配项时,就会出现典型的“未解析符号”错误。您正在尝试模拟链接器作业,这就是为什么我建议您向链接器添加诊断。此对象文件公开的不是外部符号,不是它调用的并且丢失的符号吗?