| From ff406eff25465932b97a2857ee5a75fd0957e9b9 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> |
| Signed-off-by: Stefan SΓΈrensen <stefan.sorensen@spectralink.com> |
| --- |
| util/mkimage.c | 6 +++++- |
| 1 file changed, 5 insertions(+), 1 deletion(-) |
| |
| diff --git a/util/mkimage.c b/util/mkimage.c |
| index deaef56..853a521 100644 |
| --- a/util/mkimage.c |
| +++ b/util/mkimage.c |
| @@ -1260,6 +1260,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; |
| @@ -1362,7 +1363,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"); |
| -- |
| 2.14.2 |
| |