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