我一直在尝试理解 .obj 文件中的 .debug$S 部分。但这太令人困惑了,几乎没有好的资源可用。我将不胜感激任何帮助!我现在拥有的 .obj 文件是在没有 crt 库的情况下编译的,它只有这个准系统函数:
void Entry()
{
int val = 2;
}
该程序是使用这些标志编译的cl -Zi main.cpp /link /subsystem? /ENTRY:Entry /NODEFAULTLIB
。使用 转储 .obj 文件dumpbin
,.debug$S 看起来像这样:
.debug$S name
0 physical address
0 virtual address
1AC size of raw data
15B file pointer to raw data (0000015B to 00000306)
307 file pointer to relocation table
0 file pointer to line numbers
4 number of relocations
0 number of line numbers
42100040 flags
Initialized Data
Discardable
1 byte align
Read Only
RAW DATA #2
00000000: 04 00 00 00 F1 00 00 00 9E 00 00 00 26 00 01 11 ....ñ.......&...
00000010: 00 00 00 00 45 3A 5C 50 72 6F 6A 65 63 74 73 5C ....E:\Projects\
00000020: 4E 6F 6C 69 62 44 65 62 75 67 5C 6D 61 69 6E 2E NolibDebug\main.
00000030: 6F 62 6A 00 3A 00 3C 11 01 60 00 00 D0 00 13 00 obj.:.<..`..Ð...
00000040: 19 00 C6 6F 00 00 13 00 19 00 C6 6F 00 00 4D 69 ..Æo......Æo..Mi
00000050: 63 72 6F 73 6F 66 74 20 28 52 29 20 4F 70 74 69 crosoft (R) Opti
00000060: 6D 69 7A 69 6E 67 20 43 6F 6D 70 69 6C 65 72 00 mizing Compiler.
00000070: 12 00 24 11 5F 5F 76 63 5F 61 74 74 72 69 62 75 ..$.__vc_attribu
00000080: 74 65 73 00 14 00 24 11 68 65 6C 70 65 72 5F 61 tes...$.helper_a
00000090: 74 74 72 69 62 75 74 65 73 00 06 00 24 11 61 74 ttributes...$.at
000000A0: 6C 00 06 00 24 11 73 74 64 00 00 00 F1 00 00 00 l...$.std...ñ...
000000B0: 61 00 00 00 2B 00 47 11 00 00 00 00 00 00 00 00 a...+.G.........
000000C0: 00 00 00 00 10 00 00 00 04 00 00 00 0B 00 00 00 ................
000000D0: 00 10 00 00 00 00 00 00 00 00 00 45 6E 74 72 79 ...........Entry
000000E0: 00 1C 00 12 10 18 00 00 00 00 00 00 00 00 00 00 ................
000000F0: 00 00 00 00 00 00 00 00 00 00 00 00 42 11 00 10 ............B...
00000100: 00 11 11 00 00 00 00 74 00 00 00 4F 01 76 61 6C .......t...O.val
00000110: 00 02 00 4F 11 00 00 00 F2 00 00 00 30 00 00 00 ...O....ò...0...
00000120: 00 00 00 00 00 00 00 00 10 00 00 00 00 00 00 00 ................
00000130: 03 00 00 00 24 00 00 00 00 00 00 00 02 00 00 80 ....$...........
00000140: 04 00 00 00 03 00 00 80 0B 00 00 00 05 00 00 80 ................
00000150: F4 00 00 00 18 00 00 00 01 00 00 00 10 01 46 5A ô.............FZ
00000160: D8 2B 69 38 68 86 6E C0 AE 5B 7C 00 93 68 00 00 Ø+i8h.nÀ®[|..h..
00000170: F3 00 00 00 21 00 00 00 00 45 3A 5C 50 72 6F 6A ó...!....E:\Proj
00000180: 65 63 74 73 5C 4E 6F 6C 69 62 44 65 62 75 67 5C ects\NolibDebug\
00000190: 6D 61 69 6E 2E 63 70 70 00 00 00 00 F1 00 00 00 main.cpp....ñ...
000001A0: 08 00 00 00 06 00 4C 11 19 10 00 00 ......L.....
就在我开始我的问题之前,我正在阅读的关于它的文件是这个文件和 github 上 Miscrosoft 的 cvdump的一些文件。
根据这个:
$$SYMBOLS 段的前四个字节用作签名,以指定 $$SYMBOLS 段中包含的符号和类型 OMF 的版本。(...) 如果签名是 0x00000001,则符号和类型 OMF 已被编写为符合 Microsoft CodeView 调试器的 4.0 版规范。签名的所有其他值都被保留。
前四个字节应该是 1,或者,如果不是,则保留这些值;所以我想尝试发现签名上的值“4”的含义是没有帮助的。
那么,签名之后的所有内容都应该是 CodeView 的东西,对吧?
我问这个是因为我不明白为什么它以“F1”开头。据我所知,一般的符号记录结构格式是这样的:
struct symbol_record
{
short record_length;
short record_index;
char data[];
};
如果是 CodeView,则意味着“F1”是记录的长度,接下来的两个字节,也就是零,是记录索引。但事实证明,没有记录索引 0!我想前 12 个字节只是签名,因为我编译了另一个包含更多代码的程序,而前 12 个字节是相同的!前 12 个字节也是签名的一部分吗?
这一切意味着什么?