如何从使用 /GL 编译的 .obj 文件确定主要编译器版本?

2023-12-02

我试图从以下位置确定 Visual Studio 版本(2002/2003、2005、2008、2010、2012、2013、2015).obj使用链接时间代码生成选项生成的文件。

我使用 MSVC2012 生成的文件具有以下 COFF 标头内容:

                File Header
+0  00 00       Machine - Unknown Machine
+2  FF FF       NumberOfSections
+4  01 00 4C 01 TimeDateStamp
+8  70 94 F9 55 PointerToSymbolTable
+12 38 FE B3 0C NumberOfSymbols
+16 A5 D9       SizeOfOptionalHeader
+18 AB 4D       Characteristics
                Optional Header
+20 AC 9B       Magic
+22 D6 B6       Linker Version Major/Minor

看起来最初的 4 个字节是 00,00,FF,FF 将其标记为 LTCG 对象,接下来的内容是专有的。常见的文件头成员都没有“意义”(也许时间戳没问题,我没有检查)。

有谁知道这个头文件的任何部分是否是特定于编译器的?我需要确定的是用于编译对象的 MSVC 主要版本...

似乎有一个版本,编码为<MAJOR:16:LE> 0x80 <MINOR:16:LE>,存储在标题之后不久。例如。:

17.00.61030 -> 0x11.0xEE66 -> 11 00 80 66 EE
19.00.23026 -> 0x13.0x59F2 -> 13 00 80 F2 59

所需要的是弄清楚如何通过与先前数据的偏移来可靠地获取它。

This是一个相关的问题,没有解决方案......


TL,DR :
我猜你无法获得这种文件格式的编译器版本......

完整答案:

它看起来像是“匿名文件格式”的某种变体,在“winnth.h”中由各种不同的描述ANON_OBJECT_HEADER_XXX结构(替换XXX by V2 or BIGOBJ)。 这是一份副本ANON_OBJECT_HEADER_BIGOBJ在 winnt.h 中找到:

typedef struct ANON_OBJECT_HEADER_BIGOBJ {
    /* same as ANON_OBJECT_HEADER_V2 */
    WORD    Sig1;            // Must be IMAGE_FILE_MACHINE_UNKNOWN
    WORD    Sig2;            // Must be 0xffff
    WORD    Version;         // >= 2 (implies the Flags field is present)
    WORD    Machine;         // Actual machine - IMAGE_FILE_MACHINE_xxx
    DWORD   TimeDateStamp;
    CLSID   ClassID;         // CLSID is a 16 bytes struct  (not original comment)
    DWORD   SizeOfData;      // Size of data that follows the header
    DWORD   Flags;           // 0x1 -> contains metadata
    DWORD   MetaDataSize;    // Size of CLR metadata
    DWORD   MetaDataOffset;  // Offset of CLR metadata
    /* bigobj specifics */
    DWORD   NumberOfSections; // extended from WORD
    DWORD   PointerToSymbolTable;
    DWORD   NumberOfSymbols;
} ANON_OBJECT_HEADER_BIGOBJ;</code>

描述匹配:

Sig1 :    00 00
Sig2 :    FF FF
Version : >=2
Machine : 0x14c`

其他标头结构(即ANON_OBJECT_HEADER and ANON_OBJECT_HEADER_V2)基本相同,但字段较少。
为了Version字段,我在这里找到了一些信息:http://www.geoffchappell.com/studies/msvc/link/dump/infiles/obj.htm

看起来像Version匿名文件的字段为“1”,看起来匿名文件和所谓的“导入文件”具有相同的特征,只是Version = 0对于导入文件格式(我确实不知道它是什么)。

但是,是的,仅通过查看标头,我们似乎没有有关使用的编译器版本的信息。即使如此,当查看使用 /GL 开关生成的 .obj 文件时,它们并不完全遵循这种格式,并且我没有找到有关它们的太多信息。我会很高兴有人证明我错了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从使用 /GL 编译的 .obj 文件确定主要编译器版本? 的相关文章

随机推荐

  • 如何使用 FMDB 将图像(字节)保存和检索到 SQLite(blob)?

    我正在制作一个 iOS 应用程序 需要显示来自远程站点 来自 URL 的一些图像 每次用户进入应显示图像的屏幕时 应用程序都会冻结 直到下载完成 所以我想将已经下载的图像存储到名为 COVERS 的 SQLite 表中 这是我如何下载和显示
  • 创建一个包含 n 个字符的字符串

    Java中有没有办法创建一个具有指定数量指定字符的字符串 就我而言 我需要创建一个包含十个空格的字符串 我当前的代码是 final StringBuffer outputBuffer new StringBuffer length for
  • R:识别 JSON 中的地理坐标

    我正在使用 R 编程语言 我的问题 我正在尝试自己在这里重新创建这张地图 例如在传单中 https crtc gc ca cartovista LTEOverTheYearsYE2019 EN index html 例如 2019 年 这是
  • 如何使用 React es6 处理多个受控输入?

    这是我的小提琴 https codepen io seunlanlege pen XjvgPJ editors 0011 我有两个输入 我正在尝试使用一种方法来处理onChange任何输入字段的事件 我已经在互联网上寻找解决方案 但一无所获
  • 当 Pod“忙”时向 Kubernetes 指定

    我的一项微服务正在 Kubernetes 上运行 我想在 Pod 繁忙时指定 K8s 负载均衡器 因为我当前得到的行为不正常 一个例子 我有 8 个 pod 正在运行 每个 pod 一次可以处理 1 个请求 每个请求占用分配给 Pod 的
  • 模糊匹配微小差异

    我有一列公司名称 我想计算该列中有多少家不同的公司 在本栏目中 一些相同的公司名称略有不同 例如 这些公司应该只计算一次 ASAHI INTECC CO LTD Asahi Intecc USA Inc ASAHI INTECC USA I
  • matplotlib 箭头和纵横比

    如果我运行这个脚本 import matplotlib pyplot as plt import pylab as plab plt figure plt plot 0 2 2 0 color c lw 0 5 plt plot 1 2 2
  • 排序向量查找的更快版本 (MATLAB)

    我在 MATLAB 中有以下类型的代码 indices find 1 2 2 3 3 3 4 5 6 7 7 3 这将返回 4 5 6 数组中元素的索引等于 3 现在 我的代码用很长的向量来做这种事情 向量是总是排序的 因此 我想要一个用
  • @csrf_exempt 不适用于基于通用视图的类

    class ChromeLoginView View def get self request return JsonResponse status request user is authenticated method decorato
  • 在Nativescript中获取mac地址和ip

    我们正在实现一个用于应用程序分发的服务器 我们需要通过以下方式限制对应用程序的访问 MAC地址 ip 目前我还没有找到任何可以在nativescript中从设备获取这些数据的模块 所以我不知道是否有插件或者我怎样才能实现这一点 在nativ
  • 带有 PathMatcher 的 DirectoryStream 不返回任何路径

    尽管我已经看到了很多类似问题的答案 但我无法使以下代码按我认为应该的方式工作 File dataDir new File C User user id PathMatcher pathMatcher FileSystems getDefau
  • 如何快速学习 Prism for Silverlight?

    我需要使用 Prism 制作 Silverlight 应用程序 学习使用 Silverlight Prism 制作简单应用程序的最佳方法是什么 还建议任何同样的好书 谢谢 我也有 daageu 提到的书 也会推荐它 但为了更快地加快学习 P
  • perl 子例程返回 array 和 str 但它们正在合并

    sub process feed my line my lines my last received while 1 if line push lines 1 line 2 else last received line last prin
  • 当文本字段等于字符串时,ios 使按钮更改视图

    我正在制作这种密码来跳过游戏中的关卡 但我不知道需要什么代码来使按钮更改视图控制器 IBAction button id sender if txt text isEqualToString passwordToSkipLevel1 Cod
  • 终止 Java 程序

    我找到了终止 关闭或停止 我的 Java 程序的方法 我找到了两个解决方案 using return 当我想退出或终止我的程序执行时 我添加这个 using 系统 exit 有时我也用过它 我读到系统 exit from 这个问题 所以 我
  • 锚标记的填充

    我有一个 asp net 页面 其代码如下所示
  • 我需要 ETL 吗?

    我们目前使用 Datastage ETL 每天导出包含 15 个表 3 个不同模式 中的数据的 CSV 文本文件 我想知道是否有一种更简单的方法可以在不使用 ETL 的情况下完成此任务 我尝试过脚本拉 它看起来简单 快速 但它又是一个 ET
  • 如何使用 objectMapper 设置 java.time.Instant 的字符串格式?

    我有一个实体java time Instant对于创建的数据字段 Getter Setter AllArgsConstructor NoArgsConstructor EqualsAndHashCode public class Item
  • Javafx 2.2 和雪豹

    我需要在 Mac 计算机上部署 JavaFX2 2 应用程序 OS X 10 7 或更高版本适用于 Java 7u7 OS X 10 6 怎么样 我们有什么解决办法吗 我认为 10 6 可以更新到 Java 6u35 并且我在某处读到 2
  • 如何从使用 /GL 编译的 .obj 文件确定主要编译器版本?

    我试图从以下位置确定 Visual Studio 版本 2002 2003 2005 2008 2010 2012 2013 2015 obj使用链接时间代码生成选项生成的文件 我使用 MSVC2012 生成的文件具有以下 COFF 标头内