boot: Try to detect overlapping PE sections

This should help finding the cause of boot failures because of badly
assembled unified kernel images.
This commit is contained in:
Jan Janssen
2022-09-10 09:02:35 +02:00
parent c01bf79432
commit fa2eebc7a3
2 changed files with 14 additions and 3 deletions
+6 -3
View File
@@ -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'
+8
View File
@@ -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;