GRUB2 fails to load a Multiboot2 ELF with loadable regions above 4GiB. The error seen is "segment crosses 4 GiB border".
The 4 GiB border check was added as part of "multiboot2: Add support for relocatable images" commit a620876e3b32e4ea0c9a7b3541fcb9a4dd4fb9eb. I believe this check should only apply when the multiboot2 image supports relocation via the MULTIBOOT_HEADER_TAG_RELOCATABLE tag. Subject: [PATCH] multiboot2: check 4GiB limit for relocatable images only --- grub-core/loader/multiboot_elfxx.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/grub-core/loader/multiboot_elfxx.c b/grub-core/loader/multiboot_elfxx.c index f2318e0..0ac11f0 100644 --- a/grub-core/loader/multiboot_elfxx.c +++ b/grub-core/loader/multiboot_elfxx.c @@ -92,10 +92,6 @@ CONCAT(grub_multiboot_load_elf, XX) (mbi_load_data_t *mld) highest_load = grub_max (highest_load, phdr(i)->p_paddr + phdr(i)->p_memsz); } -#ifdef MULTIBOOT_LOAD_ELF64 - if (highest_load >= 0x100000000) - return grub_error (GRUB_ERR_BAD_OS, "segment crosses 4 GiB border"); -#endif if (mld->relocatable) { @@ -106,6 +102,11 @@ CONCAT(grub_multiboot_load_elf, XX) (mbi_load_data_t *mld) (long) mld->align, mld->preference, load_size, mld->avoid_efi_boot_services); +#ifdef MULTIBOOT_LOAD_ELF64 + if (highest_load >= 0x100000000) + return grub_error (GRUB_ERR_BAD_OS, "segment crosses 4 GiB border"); +#endif + if (load_size > mld->max_addr || mld->min_addr > mld->max_addr - load_size) return grub_error (GRUB_ERR_BAD_OS, "invalid min/max address and/or load size"); -- 2.31.1 Fred Baksik Sr Prin Software Engineer Systems | Mission Mercury Systems 6675 Shiloh Road East, Alpharetta, GA 30005 +1 978.967.3405<tel:+1%20978.967.3405> office fred.bak...@mrcy.com<mailto:fred.bak...@mrcy.com> | mrcy.com<https://www.mrcy.com/>