首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么DumpBin告诉我我的二进制文件中没有COMDAT?

在这个问答中,我们将讨论以下主题:

  1. 什么是COMDAT?
  2. 什么是DumpBin?
  3. 为什么DumpBin告诉我我的二进制文件中没有COMDAT?
  4. 如何解决这个问题?

1. 什么是COMDAT?

COMDAT是一种Microsoft特有的对象文件格式,它允许将多个相同的对象文件合并到一个可执行文件中。COMDAT是“COMMON Object Data”的缩写,它表示一个可重用的对象文件块。在C/C++编程中,COMDAT通常用于优化静态库的链接过程,以减少可执行文件的大小。

2. 什么是DumpBin?

DumpBin是一个Microsoft Visual Studio工具,用于显示有关对象文件、可执行文件或动态链接库(DLL)的信息。通过使用DumpBin,可以检查二进制文件中的符号、重定位信息、导入地址表(IAT)等。

3. 为什么DumpBin告诉我我的二进制文件中没有COMDAT?

如果DumpBin报告二进制文件中没有COMDAT,可能有以下原因:

  • 该二进制文件没有包含COMDAT。
  • 该二进制文件包含COMDAT,但它们被优化或去除了。
  • DumpBin的使用方式不正确,导致没有检测到COMDAT。

4. 如何解决这个问题?

要解决这个问题,可以尝试以下方法:

  • 确保在编译时使用了正确的编译选项,以便生成COMDAT。例如,在C/C++编译器中,可以使用/Gy选项来启用函数级别的COMDAT。
  • 检查链接器选项,确保没有禁用COMDAT。例如,在C/C++链接器中,可以使用/OPT:REF选项来去除未引用的COMDAT。
  • 确保在使用DumpBin时使用了正确的命令行参数。例如,要查看二进制文件中的COMDAT,可以使用dumpbin /ARCHIVEMEMBERS /CLRHEADER /DISASM /ERRORREPORT:PROMPT /EXPORTS /FPO /HEADERS /IMPORTS /LINENUMBERS /LOADCONFIG /OPTIONALHEADER /RELOCATIONS /SECTIONS /SOURCE /SYMBOLS /TLS /RAWDATA:1命令。

总之,COMDAT是一种用于优化静态库链接的Microsoft特有技术。DumpBin是一个用于检查二进制文件信息的工具。如果DumpBin报告二进制文件中没有COMDAT,可能是由于编译选项、链接器选项或DumpBin使用方式不正确导致的。要解决这个问题,需要确保在编译和链接时使用正确的选项,并使用正确的DumpBin命令行参数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++静态链接

VISUAL C++ 编译器做法稍有不同,它把这种类型段叫做“ COMDAT”,这种“ COMDAT”段属性字段(PE文件段表结构里面的 IMAGE SECTION HEADERCharacteristics...当我们须要用到某个目标文件任意一个函数或变量时,就须要把它整个地链接进来,也就是说那些没有用到函数也被一起链接了进来。...当链接器须要用到某个函数时,它就将它合并到输出文件,对于那些没有函数则将它们抛弃。这种做法可以很大程度上减小输出文件长度,减少空间浪费。...C++与ABI 既然每个编译器都能将源代码编译成目标文件,那么有没有不冋编译器编译出来目标文件是不能够相互链接呢?...有没有可能将MSVC编详出来目标文件和GCC编译出来目标文件链接到一起,形成一个可执行文件呢?

1.7K10
  • 记一次调试资源管理器未响应经验

    有小伙伴告诉我一台设备全触摸失效了,但实际上是资源管理器未响应。通过本文可以了解到调试思路和用到工具 不要相信测试 测试小伙伴发现,在进行100次开机关机之后,可能会有触摸失效。...如果是全局钩子,那么也点不到任务管理器 所以上面的思路是不对 实际问题 在任务管理器发现了资源管理器没有响应 也就是实际问题就是资源管理器没有响应,需要了解为什么资源管理器没有响应和可以如何解决 如果这个问题在网上问...,需要关注一个第三方应用未响应只有堆栈和线程 因为老司机告诉我,如果一个程序未响应,在资源管理器看到 CPU 不动,那么原因就是程序在等待。...如果你继续往这条路走,如果失败了,请告诉我你使用时间 安全模式 在不知道如何调试时,可以使用二分法,因为这是自主研发设备,那么问题要么在微软系统,要么在自主开发软件,要么在自主研发硬件。...那么这个文件和 mfc90u.dll 有什么联系,将这个文件夹复制到我电脑,通过 VisualStudio 开发者命令行进入电脑复制到文件夹,使用 dumpbin 工具找引用 dumpbin

    1.1K20

    为 .NET Core Framework 程序开启大内存感知(LargeAddressAware),使 32 位程序支持最多 4GB 用户空间内存

    如果你项目使用 .NET Framework 框架,那么现行有很多简单方法来帮你实现大内存感知,但 .NET Core 框架下却没有。...其他开启 LARGEADDRESSAWARE 方法 不推荐方法:仅适用于 .NET Framework 旧方法 当时那篇博客提到过可通过编译成 AnyCPU (Prefer 32-bit)...方法是修改 csproj 文件,加上这两句: 1 2 3 4 5 ++ <!...检查是否已开启大内存感知 在之前博客中提到可以使用 Visual Studio 自带 dumpbin 工具来检查是否开启了大内存感知: 1 dumpbin /headers xxx.exe | more...但是,我们有更直观 dnSpy 为什么还要用命令行来临时查看呢?

    70710

    编译优化在微信视频号落地实践

    comdat消除出现不同结果,原因是externally_visable变量在使用时还没有更新到预期值,因此调整update_visibility_by_resolution_info检查函数来消除节点访问顺序造成影响...二进制文件大小优化编译得到mmfinderrecommend_1117_O2_PUSE二进制文件大小为2.6G,尽管相对于最初GCC10 O2+LTO3.6G减小了1G,还是显得有点大,分析二进制文件具体内容可以发现...debug信息占了将近90%内容,binutilsobjcopy提供了一个压缩功能选项: objcopy --compress-debug-sections [xxx] [xxx.gz] 对二进制文件...DWARF块进行zlib压缩,可以再次大幅减小二进制文件到1.2G。...在视频号模块上我们成功实现了版本升级适配以及20%综合性能提升,优化后二进制文件大小减少了80%,显著改进了部署效率。

    34510

    密集计算场景下 JNI 实战

    JNI 是一种标准程序接口,用于编写 Java 本地方法,并且将 JVM 嵌入 Native 应用程序。是为了给跨平台上 JVM 实现本地方法库进行二进制兼容。...然而项目组目前也没有 JNI 实践经验,最终性能是否能有提升,还是要打个问号。本着初生牛犊不怕虎精神,鼓起勇气主动认领了这个优化任务。...下编译在 windows 上运行,这是不可以); JVM 位数和 lib 位数不一致 (比如一个是 32 位,一个是 64 位); C++ 函数名写错; 生成 lib 文件没有相对应方法。...在 windows 下,可以使用 dumpbin 工具或者 Dependency Walker 工具分析 lib 是否存在所编写 C++ 方法。...dumpbin 指令如下: dumpbin /EXPORTS xxx.dll 而 Dependency Walker 只需要打开 dll 文件就可以看到相关信息了。

    56120

    mold源码阅读 其一 读取输入文件

    首先是解析输入,命令行参数解析细节略过,但是这里不能略过elf文件解析。我们从代码实现去看elf结构,再和文档图进行对比,同时尽可能从代码中去捋清不同结构之间联系。...就是这些,但是注意,GitHubmold项目下只存在elf文件支持,mach格式则是在sold这个项目中处理。...linker script moldlinker script根据解析过程来看比较简单,没有在ld脚本指定SECTION地址之类内容,主要是对format以及符号version一些控制。...| … | 关于GRP_COMDAT文档也有提到 This is a COMDAT group....esym则是ElfSym缩写,也就是Elf文件Symbol定义,而Symbol则是mold自己定义,相当于转换为自己想要格式。

    1.5K20

    PE文件和COFF文件格式分析——节信息

    而我们本文讨论节信息是没有任何偏移指向,所以它是紧跟在可选文件头后面的。...但是这儿说一下,这样做是不严谨,我会在之后论述这样草率做法为什么不对。         先拿电脑上notepad.exe为例,看看它节信息 ?        ...这个数字是相对字符串表起始位置偏移RA,我们真实节名就保存在字符串表电脑上找到一个这样文件avcodec-52.dll。我们先看Stud_PE分析结果 ?        ...目前微软推荐是:将映像文件调试符号表信息独立放在PDB文件,所以不会在PE文件再保存调试符号表信息,于是这个字段应该为0。当然这并不是硬性要求,发现电脑上就存在很多该字段不为0文件。...刚开始时也不是很明白它们为什么要使用这个字段,特别是其指向字符表个数(NumberOfSymbols)为0!!你说既然大小为0,那你指向有什么意思呢?

    75720

    12、动态链接库,dll

    2、静态库与动态库: 静态库: 函数和数据被编译进一个二进制文件(通常扩展名为.LIB)。...动态库: 动态库一般提供两个文件:一个引入库(.lib),一个是DLL(.dll)文件。.lib文件包含该DLL导出函数和变量符号名,而.dll文件包含该DLL实际函数和数据。...在使用动态库情况下,在编译链接可执行文件时,只需要链接该DLL引入库文件,该DLL函数代码和数据并不复制到可执行文件,直到可执行程序运行时,才去加载所需DLL,将该DLL映射到进程地址空间中...图示 P703 两个进程访问同一个DLL时情形 两种加载dll文件方式,隐式加载和显式加载。 3、Dumpbin命令 应用程序如果想要访问某个DLL函数,那么该函数必须是已经被导出函数。...并在工程属性链接器命令行输入lib符号名文件。把dll文件和lib文件放入指定目录在工具选项VC++目录包含。 (2)利用_declspec(dllimport)于外部函数声明前。

    81520

    Windows下程序打包发布时小技巧

    但是实际操作起来并不理想,因为Dependency Walker将exe文件依赖所有动态库以及动态库所依赖动态库都列出来了。看得你一脸懵逼: ?    ...你很难分清楚:倒底哪些DLL是需要打包,哪些DLL是系统自带。而作为打包过程一个小步骤,根本不需要知道这么多信息。这个时候,我们需要一个更加简洁明了工具。...dumpbin就是今天要介绍主角。 二、使用     dumpbin是随Visual Studio一起发布,在Visual Studio“本机工具命令行”中就可以直接使用。...使用第一步就是打开Visual Studio“本机工具命令行”: ?     这里选择是“VS2015 X64本机工具命令提示符”。...三、小结     dumpbinIMPORTS参数是用来查看程序依赖其他动态库,这对于可执行程序exe和动态链接库DLL都是适用

    2K60

    系列文章(二)| VS2013-MPI v7-静态编译-Boost1.6.1

    注:bjam在编译过程,出错不会停下来,而是直接跳过出错模块,除非加参数让其遇错停下.而且是边编译边安装....headers *.lib | findstr machine dumpbin/headers *.dll | findstr machine 间接确定某个lib是静态还是动态[会显示其它信息或者对应...dll] dumpbin/headers *.lib 直接确定某个lib是静态还是动态[会列出包含obj或者对应dll] lib /list*.lib 8 Boost安装目录分析 ?...[include]文件夹装是包含目录,D/R版本内容完全一样. [lib]文件,装都是staticlib文件,D/R版本各有34个lib. lib一一对应,但内容不一样....控制台编译,没有生成PDB. 因为是静态编译,所有没有dll,也没有[bin]文件夹. 静态编译通常没有PDB. ?

    80330

    为什么要在WebAssembly中使用Rust?【Programming】

    WebAssembly是二进制文件格式,所有主要浏览器(IE 11除外)都已实现,以使虚拟机运行。...因为这些语言具有必须包含在WebAssembly二进制文件大型运行时,所以它们仅对新建项目才真正实用(即,它们仅可用作JavaScript替代品)。...然而,Rust使用我们将在本系列其他文章探讨工具,很容易创建具有相当惯用JavaScript接口WebAssembly二进制文件,而c和c++过程则更加手动。...如果你有兴趣了解更多关于RustWasm开发,请在评论告诉我。接下来,将介绍如何从JavaScript调用Rust。...如果你想对比一下Rust故事和其他语言故事,比如c语言和Go语言,请告诉我,以后我会写更多。

    1.4K00

    白加黑免杀制作(详细)

    前言 最近被微步一篇文章吸引了,里面讲到银狐通过自解压白 exe + 黑 dll 执行截取主线程添加自启动,发现 dll 与普通免杀有很大不同,决定自己尝试一下,虽然之前没有做过白加黑免杀,感觉应该不会太难...文件、lib 库、dll 库、exe 执行文件,使用方法如下: # 查看 dll 库包含哪些函数 dumpbin /exports a.dll # 查看 exe 中加载了哪些动态库 dumpbin.../imports a.exe # 查看 lib 库包含哪些函数 dumpbin /all /rawdata:none a.lib # 查看 obj 文件包含哪些函数 dumpbin /all /rawdata...1. dll 文件搜索路径顺序 dll 加载如果指指定了 dll 文件名而没有指定具体路径一般是按照一定路径顺序一次去搜索,如果能在搜索到正确 dll 之前使其先搜索到我们恶意 dll 就能造成...由于我主机上没有安装 ProcessMonitor,因此需要将 exe 拖到虚拟机执行。

    5.9K71

    使用 shell 脚本自动对比两个安装目录并生成差异补丁包

    问题解决 其实这个问题用 c++ 写个程序是可以解决,但是一想到要遍历目录、构造文件名 map、对比两个目录文件名、对比相同文件内容、复制文件到目标目录、压缩目标目录…这一系列操作时,觉得还是算了...这里没有通过文件后缀(dll / exe)来判断是否为可执行文件,这是因为产品总有一些 dll 有奇奇怪怪后缀。...这里统一采用 dumpbin 进行反汇编,如果成功就是可执行文件;反之就是普通文本或二进制文件。...后来他们通过紧急补丁修复了上述问题,在后面复盘问题过程手动检查了脚本运行日志,发现确实没有识别出新旧 derived.dll —— 脚本认为它们是二进制相同。...上面这个例子,父类成员变化后,肯定会有相应 section 会做出调整,但是通过调整 dumpbin 选项也没有对比出这个段在哪里。

    60440

    安防教育互联网直播视频组件EasyRTSPServer读取本地文件报错找不到EasyStreamClient.dll解决方法

    与代码设置libEasyStreamClient.dll不符合。 ? 我们查找文件,发现可执行文件同目录下存在对应libEasyStreamClient.dll文件。 ?...这里libEasyStreamClient.lib只是影响编译器编译时候,link.lib库问题,和运行时没有任何关系。此时仅仅告诉系统当程序运行时,需要加载这个.dll文件。...通过dumpbin 命令来查看对应dll dumpbin /headers libEasyStreamClient.lib ?...由此可以看到,这个DLL Name是EasyStreamClient.dll。所以可执行文件运行时,需要动态库为EasyStreamClient.dll。...修改路径:属性->输入->模块定义文件 EasyStreamClient.def ? EasyStreamClient.def 定义了DLL Name ?

    36732

    tomcat服务器如何配置字符集为utf-8彻底解决中文乱码问题详解

    什么是字符集 在介绍字符集之前,我们先了解下为什么要有字符集。我们在计算机屏幕上看到是实体化文字,而在计算机存储介质存放实际是二进制比特流。...简单说字符集就规定了某个文字对应二进制数字存放方式(编码)和某串二进制数值代表了哪个文字(解码)转换关系。 那么为什么会有那么多字符集标准呢?这个问题实际非常容易回答。...问问自己为什么我们插头拿到英国就不能用了呢?为什么显示器同时有DVI,VGA,HDMI,DP这么多接口呢?...说了那么多我们来看一个实际例子,下面就是屌这个字在各种编码下十六进制和二进制编码结果,怎么样有没有一种很屌感觉?...0x8CC5 1000 1100 1100 0101 引言 我们在程序编写过程总是会遇到一些中文编码问题,需要在程序很多环节中去进行过滤和转义,依旧有可能遇到中文乱码问题,下面是一个同事告诉我方法

    2.5K11
    领券