代码之家  ›  专栏  ›  技术社区  ›  JVApen

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

  •  2
  • JVApen  · 技术社区  · 6 年前

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

    多亏了Dependency Walker,我发现正在加载意外的DLL。在我的情况下,找到一个符号 std::allocator<char>::allocator(allocator const &)

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

    • 需要此符号的DLL
    • 显示符号的DLL

    为了记录错误,我应该能够将代码减少到可接受的大小。 上传整个专有代码库不是一个选项,上传一个20行的.cpp文件是一个选项。

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

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

    我已经发现:

    • dumpbin/DEPENDENTS:告诉我DLL所依赖的DLL

    dumpbin /DEPENDENTS

    转储导入函数的名称。

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

    2 回复  |  直到 6 年前
        1
  •  2
  •   Corristo    6 年前

    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

    因此,为了找到从其他地方(例如DLL)导入的所有符号,您只需搜索 未定义 .

        2
  •  1
  •   Damian    6 年前

    例如,如果您使用

    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

    推荐文章