gpt4 book ai didi

header - DOS header 中的 e_cblp 和 e_cp 是什么?

转载 作者:行者123 更新时间:2023-12-04 21:44:12 25 4
gpt4 key购买 nike

我试图深入了解 DOS header ,但我坚持使用这些 header 。我知道唯一需要的字节是 MZ 签名和指向 PE 部分的指针,但我必须知道这两个到底是什么:

USHORT e_cblp;          // Bytes on last page of file
USHORT e_cp; // Pages in file

在大多数可执行文件的二进制代码中,这些值分别为 90h 和 03h。一页是 512 字节的代码,所以有 3 页,但在哪里呢?我在哪里可以在文件中找到它们?如何在 512 字节的最后一页中识别这些 90h(144)字节?

此信息仅由 DOS 请求。将在 DOS 中运行的 PE 文件的唯一代码是 DOS stub ,它不是 3 页的代码,而只有 64 个字节。那么,90h 和 03h 有什么关系呢?我不能说 e_cblp=01he_cp=DOS header+DOS stub ?

最佳答案

它是“整个”MZ 格式可执行文件的大小,最后一页中最后一个字节之后的任何内容都将被忽略。当 MS-DOS 加载一个 MZ 格式的可执行文件时,它会复制文件中头文件之后的所有内容,直到此限制为止。因此,事实上大多数 PECOFF 可执行文件将此字段设置为大于 MS-DOS stub 的值只是意味着当可执行文件在 MS-DOS 下运行时,PECOFF header 和部分 PECOFF 部分数据将加载到内存中。

我不知道为什么 Microsoft 链接器(和 GNU 链接器,但不是 Borland 或 Watcom 的)使用的默认 DOS stub 说它的大小为 1168 字节,而实际上要小得多。如果您在使用 Microsoft 的链接器时提供自己的 stub ,它将使用提供的可执行文件的大小。 Windows 在加载 PECOFF 可执行文件时似乎忽略了这个值,并且默认的 DOS stub 对额外数据没有任何用处。

请注意,可以使用 Microsoft 的链接器创建仅 1024 字节长的有效 PECOFF 可执行文件。这要求可执行文件只有一个部分,并且大小小于 512 字节。虽然 Windows 将加载并运行可执行文件,但 MS-DOS 将拒绝,因为文件大小小于 MZ header 中给出的 1168 大小值。

关于header - DOS header 中的 e_cblp 和 e_cp 是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17196444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com