2021-03-02 20:36:22 +00:00
|
|
|
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
|
2022-05-11 04:10:44 +00:00
|
|
|
index e73a5864b22..f22b398d973 100644
|
2021-03-02 20:36:22 +00:00
|
|
|
--- 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");
|