On Tue, Apr 27, 2021 at 12:48:29PM +0200, John Paul Adrian Glaubitz wrote:
> On 4/27/21 12:25 PM, Javier Martinez Canillas wrote:
> > Commit f60ba9e5945 (util/mkimage: Refactor section setup to use a helper)
> > added a helper function to setup PE sections. But it also changed how the
> > raw data offsets were calculated since all the section sizes are aligned.
> >
> > However, for some platforms, i.e ia64-efi and arm64-efi, the kernel image
> > size is not aligned using the section alignment.
> >
> > This leads to the situation in which the mods section offset in its PE
> > section header does not match its real placement in the PE file.
> > So, finally the GRUB is not able to locate and load built-in modules.
> >
> > The problem surfaces on ia64-efi and arm64-efi because both platforms
> > require additional relocation data which is added behind .bss section.
> > So, we have to add some padding behind this extra data to make the
> > beginning of mods section properly aligned in the PE file.
> >
> > Fix it by aligning the kernel_size to the section alignment. That makes
> > the sizes and offsets in the PE section headers to match relevant sections
> > in the PE32+ binary file.
> >
> > Reported-by: John Paul Adrian Glaubitz <[email protected]>
> > Signed-off-by: Javier Martinez Canillas <[email protected]>
> > ---
> >
> > Changes in v3:
> > - Drop the RFC prefix since I'm confident now about the solution.
> > - Improve commit message (suggested by Daniel Kiper).
> > - Don't use virtual memory addresses to calculate the kernel size,
> >   but instead use the raw data sizes (suggested by Daniel Kiper).
> >
> > Changes in v2:
> > - Align up for any arch in the is_relocatable (image_target) patch and
> >   not only for MKIMAGE_ELF64 or EM_AARCH64 (suggested by Daniel Kiper).
> >
> >  util/grub-mkimagexx.c | 4 ++++
> >  1 file changed, 4 insertions(+)
> >
> > diff --git a/util/grub-mkimagexx.c b/util/grub-mkimagexx.c
> > index 00f49ccaaaf..d78fa3e5330 100644
> > --- a/util/grub-mkimagexx.c
> > +++ b/util/grub-mkimagexx.c
> > @@ -2388,6 +2388,10 @@ SUFFIX (grub_mkimage_load_image) (const char 
> > *kernel_path,
> >       layout->kernel_size += ALIGN_UP (layout->got_size, 16);
> >     }
> >  #endif
> > +
> > +      if (image_target->id == IMAGE_EFI)
> > +        layout->kernel_size = ALIGN_UP (layout->kernel_size,
> > +                                        GRUB_PE32_FILE_ALIGNMENT);
> >      }
> >    else
> >      {
> >
>
> Works on my ia64 machine.
>
> Tested-by: John Paul Adrian Glaubitz <[email protected]>

Reviewed-by: Daniel Kiper <[email protected]>

Javier, Adrian, thank you for working patiently on this fix.

Daniel

_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to