From fa2eebc7a350adc1c61062818acdd1ea4b2aa3c9 Mon Sep 17 00:00:00 2001 From: Jan Janssen Date: Sat, 10 Sep 2022 09:02:35 +0200 Subject: [PATCH] boot: Try to detect overlapping PE sections This should help finding the cause of boot failures because of badly assembled unified kernel images. --- src/boot/efi/meson.build | 9 ++++++--- src/boot/efi/pe.c | 8 ++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/boot/efi/meson.build b/src/boot/efi/meson.build index efe056c225a..9eefe6571f9 100644 --- a/src/boot/efi/meson.build +++ b/src/boot/efi/meson.build @@ -199,9 +199,12 @@ efi_cflags = [ ] ) -# On some distros, sd-boot/-stub may trigger some bug somewhere that will cause -# kernel execution to fail. The cause seems to be purely based on code size and -# always compiling with at least -O1 will work around that. +# Our code size has increased enough to possibly create overlapping PE sections +# at sd-stub runtime, which will often enough prevent the image from booting. +# This only happens because the usual instructions for assembling a unified +# kernel image contain hardcoded addresses for section VMAs added in. Until a +# proper solution is in place, we can at least compile with as least -O1 to +# reduce the likelyhood of this happening. # https://github.com/systemd/systemd/issues/24202 efi_cflags += '-O1' diff --git a/src/boot/efi/pe.c b/src/boot/efi/pe.c index 2b260d42122..852198f895f 100644 --- a/src/boot/efi/pe.c +++ b/src/boot/efi/pe.c @@ -151,9 +151,17 @@ static void locate_sections( assert(offsets); assert(sizes); + size_t prev_section_addr = 0; + for (UINTN i = 0; i < n_table; i++) { const PeSectionHeader *sect = section_table + i; + if (in_memory) { + if (prev_section_addr > sect->VirtualAddress) + log_error_stall(u"Overlapping PE sections detected. Boot may fail due to image memory corruption!"); + prev_section_addr = sect->VirtualAddress + sect->VirtualSize; + } + for (UINTN j = 0; sections[j]; j++) { if (memcmp(sect->Name, sections[j], strlen8(sections[j])) != 0) continue; -- 2.47.3