47 lines
1.8 KiB
Diff
47 lines
1.8 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Peter Jones <pjones@redhat.com>
|
||
|
Date: Thu, 11 Feb 2021 17:07:33 +0100
|
||
|
Subject: [PATCH] util/mkimage: Improve data_size value calculation
|
||
|
|
||
|
According to "Microsoft Portable Executable and Common Object File Format
|
||
|
Specification", the Optional Header SizeOfInitializedData field contains:
|
||
|
|
||
|
Size of the initialized data section, or the sum of all such sections if
|
||
|
there are multiple data sections.
|
||
|
|
||
|
Make this explicit by adding the GRUB kernel data size to the sum of all
|
||
|
the modules sizes. The ALIGN_UP() is not required by the PE spec but do
|
||
|
it to avoid alignment issues.
|
||
|
|
||
|
Signed-off-by: Peter Jones <pjones@redhat.com>
|
||
|
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
|
||
|
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
|
||
|
---
|
||
|
util/mkimage.c | 6 +++++-
|
||
|
1 file changed, 5 insertions(+), 1 deletion(-)
|
||
|
|
||
|
diff --git a/util/mkimage.c b/util/mkimage.c
|
||
|
index e73a5864b..f22b398d9 100644
|
||
|
--- a/util/mkimage.c
|
||
|
+++ b/util/mkimage.c
|
||
|
@@ -1248,6 +1248,7 @@ grub_install_generate_image (const char *dir, const char *prefix,
|
||
|
void *pe_img;
|
||
|
grub_uint8_t *header;
|
||
|
void *sections;
|
||
|
+ size_t scn_size;
|
||
|
size_t pe_size;
|
||
|
struct grub_pe32_coff_header *c;
|
||
|
struct grub_pe32_section_table *text_section, *data_section;
|
||
|
@@ -1350,7 +1351,10 @@ grub_install_generate_image (const char *dir, const char *prefix,
|
||
|
| GRUB_PE32_SCN_MEM_EXECUTE
|
||
|
| GRUB_PE32_SCN_MEM_READ);
|
||
|
|
||
|
- PE_OHDR (o32, o64, data_size) = grub_host_to_target32 (reloc_addr - layout.exec_size - header_size);
|
||
|
+ scn_size = ALIGN_UP (layout.kernel_size - layout.exec_size, GRUB_PE32_FILE_ALIGNMENT);
|
||
|
+ PE_OHDR (o32, o64, data_size) = grub_host_to_target32 (scn_size +
|
||
|
+ ALIGN_UP (total_module_size,
|
||
|
+ GRUB_PE32_FILE_ALIGNMENT));
|
||
|
|
||
|
data_section = text_section + 1;
|
||
|
strcpy (data_section->name, ".data");
|