DOS .exe 文件 header 如果图像大小可以被 512 整除
DOS .exe file header if image size is divisible by 512
我发现有关指定图像大小的 DOS .exe header 字段的信息存在冲突。 http://www.delorie.com/djgpp/doc/exe/ 表示第一个字段 (f2) 应 image_size 模 512,第二个字段 (f4) 应 image_size 除以 512,向上取整。但是,其他文档指定如果 image_size 可被 512 整除,则 f2 应为 512。某些软件使用公式 f2 + f4 * 512
.
因此,如果 image_size 是 2046 字节,那么这是正确的:f2=510,f4=4。
那么如果 image_size 是 2048 字节,哪些是正确的值?
- f2=0, f4=4
- f2=512, f4=3
- f2=512, f4=4
是否有关于此的权威文档?
(也许我应该看看 OpenWatcom 生产什么以及 FreeDOS 和 DOSBox 使用什么。)
这个答案是基于观察 OpenWatcom (owcc -bdos -mcmodel=s
) 的 .exe 输出的问题示例 image_size 值,以及 FreeDOS 1.2 中的 .exe 文件。
- image_size 通常是 .exe 文件的大小(例如,对于 FreeDOS 1.2 中的 .exe 文件),但它可以更小(例如,文件末尾有一些额外的数据,这'被 DOS 加载到内存;或者如果映像是 DOS 扩展存根,并且 32 位可执行部分正好位于偏移量 image_size).
- image_size 包括 .exe header、重定位条目、程序代码和程序(已初始化)数据。它不包括未初始化的数据 (.bss)。
min_extra_paragraphs
(偏移量为 10 的 uint16)是未初始化数据(.bss,通常包括堆栈)的大小除以 16,向上取整。
bytes_in_last_block
(偏移量为 2 的 uint16)是(由 OpenWatcom 生成的)image_size 模 512。也可以使用值 512 而不是值 0。
blocks_in_file
(偏移量 4 处的 uint16)是 image_size 除以 512,向上舍入。
- WDOSX 中 stubit.c 使用的 image_size 的更正许可公式:image_size = -(-
bytes_in_last_block
& 511) + blocks_in_file
* 512。
- FreeDOS内核(source line)中的exeflat工具使用以下公式:image_size = ((
bytes_in_last_block
? bytes_in_last_block
: 512) - 512) + blocks_in_file
* 512。对于 0 <= bytes_in_last_block
<= 512,这等效于上面的公式。bytes_in_last_block
的较大值无效,应报告为错误。
- image_size <=
blocks_in_file
* 512.
- FreeDOS内核(source line)忽略
bytes_in_last_block
,加载(blocks_in_file
* 32) - header_paragraphs
字节,相当于使用image_size <= blocks_in_file
* 512.
示例:
- 如果image_size是2046字节,这是正确的:f2=
bytes_in_last_block
=510, f4=blocks_in_file
=4.
- 如果image_size是2048字节,这是正确的(由OpenWatcom生成):f2=
bytes_in_last_block
=0,f4=blocks_in_file
=4,这也是正确的: f2=bytes_in_last_block
=512, f4=blocks_in_file
=4.
我发现有关指定图像大小的 DOS .exe header 字段的信息存在冲突。 http://www.delorie.com/djgpp/doc/exe/ 表示第一个字段 (f2) 应 image_size 模 512,第二个字段 (f4) 应 image_size 除以 512,向上取整。但是,其他文档指定如果 image_size 可被 512 整除,则 f2 应为 512。某些软件使用公式 f2 + f4 * 512
.
因此,如果 image_size 是 2046 字节,那么这是正确的:f2=510,f4=4。
那么如果 image_size 是 2048 字节,哪些是正确的值?
- f2=0, f4=4
- f2=512, f4=3
- f2=512, f4=4
是否有关于此的权威文档?
(也许我应该看看 OpenWatcom 生产什么以及 FreeDOS 和 DOSBox 使用什么。)
这个答案是基于观察 OpenWatcom (owcc -bdos -mcmodel=s
) 的 .exe 输出的问题示例 image_size 值,以及 FreeDOS 1.2 中的 .exe 文件。
- image_size 通常是 .exe 文件的大小(例如,对于 FreeDOS 1.2 中的 .exe 文件),但它可以更小(例如,文件末尾有一些额外的数据,这'被 DOS 加载到内存;或者如果映像是 DOS 扩展存根,并且 32 位可执行部分正好位于偏移量 image_size).
- image_size 包括 .exe header、重定位条目、程序代码和程序(已初始化)数据。它不包括未初始化的数据 (.bss)。
min_extra_paragraphs
(偏移量为 10 的 uint16)是未初始化数据(.bss,通常包括堆栈)的大小除以 16,向上取整。bytes_in_last_block
(偏移量为 2 的 uint16)是(由 OpenWatcom 生成的)image_size 模 512。也可以使用值 512 而不是值 0。blocks_in_file
(偏移量 4 处的 uint16)是 image_size 除以 512,向上舍入。- WDOSX 中 stubit.c 使用的 image_size 的更正许可公式:image_size = -(-
bytes_in_last_block
& 511) +blocks_in_file
* 512。 - FreeDOS内核(source line)中的exeflat工具使用以下公式:image_size = ((
bytes_in_last_block
?bytes_in_last_block
: 512) - 512) +blocks_in_file
* 512。对于 0 <=bytes_in_last_block
<= 512,这等效于上面的公式。bytes_in_last_block
的较大值无效,应报告为错误。 - image_size <=
blocks_in_file
* 512. - FreeDOS内核(source line)忽略
bytes_in_last_block
,加载(blocks_in_file
* 32) -header_paragraphs
字节,相当于使用image_size <=blocks_in_file
* 512.
示例:
- 如果image_size是2046字节,这是正确的:f2=
bytes_in_last_block
=510, f4=blocks_in_file
=4. - 如果image_size是2048字节,这是正确的(由OpenWatcom生成):f2=
bytes_in_last_block
=0,f4=blocks_in_file
=4,这也是正确的: f2=bytes_in_last_block
=512, f4=blocks_in_file
=4.