Add .osrel section to the EFI binaries so that boot loaders that support the "Boot Loader Spec" can better deal with memtest86+ automatically. Fixes #265.

This commit is contained in:
Lionel Debroux
2026-03-31 21:08:31 +02:00
parent 7eb2568dfe
commit 77708c792f
3 changed files with 50 additions and 4 deletions
+24 -2
View File
@@ -43,6 +43,7 @@
#include "boot.h"
#include "build_version.h"
#include "peimage.h"
#include "build_version.h"
# The EFI loader loads the header at ImageBase, so we have to locate the main program
# after that. This means we can't load the main program at HIGH_LOAD_ADDR. Pick a load
@@ -805,7 +806,7 @@ coff_header:
#else
.word IMAGE_FILE_MACHINE_I386 # Machine (i386)
#endif
.word 3 # NumberOfSections
.word 4 # NumberOfSections
.long 0 # TimeDateStamp
.long 0 # PointerToSymbolTable
.long 0 # NumberOfSymbols
@@ -833,7 +834,7 @@ optional_header:
.byte 0x14 # MinorLinkerVersion
.long _virt_text_size # SizeOfCode
.long _virt_sbat_size # SizeOfInitializedData
.long _virt_osrel_size # SizeOfInitializedData
.long 0 # SizeOfUninitializedData
.long _virt_text_start + 0x1e0 # AddressOfEntryPoint
@@ -939,6 +940,20 @@ section_table:
.long IMAGE_SCN_MEM_READ \
| IMAGE_SCN_CNT_INITIALIZED_DATA # Characteristics (section flags)
.ascii ".osrel"
.byte 0
.byte 0
.long _virt_osrel_size # VirtualSize
.long _virt_osrel_start # VirtualAddress
.long _file_osrel_size # SizeOfRawData
.long _file_osrel_start # PointerToRawData
.long 0 # PointerToRelocations
.long 0 # PointerToLineNumbers
.word 0 # NumberOfRelocations
.word 0 # NumberOfLineNumbers
.long IMAGE_SCN_MEM_READ \
| IMAGE_SCN_CNT_INITIALIZED_DATA # Characteristics (section flags)
# Pad to the declared size.
.org (SETUP_SECS*512)
@@ -949,3 +964,10 @@ section_table:
.section ".sbat", "a", @progbits
.incbin "../boot/sbat.csv"
.section ".osrel", "a", @progbits
.ascii "ID=memtest86plus\nNAME=\"memtest86+\"\nVERSION=\""
.ascii MT_VERSION
.ascii "."
.asciz GIT_HASH
.ascii "\""
+13 -1
View File
@@ -33,16 +33,26 @@ SECTIONS {
_file_sbat_end = . ;
}
.shstrtab : { *(.shstrtab) }
.osrel : {
_file_osrel_start = . ;
*(.osrel)
_real_osrel_end = . ;
. = ALIGN(512);
_file_osrel_end = . ;
}
/DISCARD/ : { *(*) }
_real_text_size = _real_text_end - _file_text_start;
_real_reloc_size = _real_reloc_end - _file_reloc_start;
_real_sbat_size = _real_sbat_end - _file_sbat_start;
_real_osrel_size = _real_osrel_end - _file_osrel_start;
_file_head_size = _file_text_start;
_file_text_size = _file_text_end - _file_text_start;
_file_reloc_size = _file_reloc_end - _file_reloc_start;
_file_sbat_size = _file_sbat_end - _file_sbat_start;
_file_osrel_size = _file_osrel_end - _file_osrel_start;
_sys_size = (_real_text_size + 15) >> 4;
_init_size = _real_text_size + _bss_size;
@@ -51,12 +61,14 @@ SECTIONS {
_virt_text_size = ((_init_size + 4095) >> 12) << 12;
_virt_reloc_size = ((_file_reloc_size + 4095) >> 12) << 12;
_virt_sbat_size = ((_file_sbat_size + 4095) >> 12) << 12;
_virt_osrel_size = ((_file_osrel_size + 4095) >> 12) << 12;
_virt_text_start = _virt_head_size;
_virt_reloc_start = _virt_text_start + _virt_text_size;
_virt_sbat_start = _virt_reloc_start + _virt_reloc_size;
_virt_osrel_start = _virt_sbat_start + _virt_sbat_size;
_virt_img_size = _virt_sbat_start + _virt_sbat_size;
_virt_img_size = _virt_osrel_start + _virt_osrel_size;
. = ASSERT(header == 0x202, "The setup header has the wrong offset!");
. = ASSERT(_file_text_start == 0x1000, "The .text is at the wrong offset!");
+13 -1
View File
@@ -33,16 +33,26 @@ SECTIONS {
_file_sbat_end = . ;
}
.shstrtab : { *(.shstrtab) }
.osrel : {
_file_osrel_start = . ;
*(.osrel)
_real_osrel_end = . ;
. = ALIGN(512);
_file_osrel_end = . ;
}
/DISCARD/ : { *(*) }
_real_text_size = _real_text_end - _file_text_start;
_real_reloc_size = _real_reloc_end - _file_reloc_start;
_real_sbat_size = _real_sbat_end - _file_sbat_start;
_real_osrel_size = _real_osrel_end - _file_osrel_start;
_file_head_size = _file_text_start;
_file_text_size = _file_text_end - _file_text_start;
_file_reloc_size = _file_reloc_end - _file_reloc_start;
_file_sbat_size = _file_sbat_end - _file_sbat_start;
_file_osrel_size = _file_osrel_end - _file_osrel_start;
_sys_size = (_real_text_size + 15) >> 4;
_init_size = _real_text_size + _bss_size;
@@ -51,12 +61,14 @@ SECTIONS {
_virt_text_size = ((_init_size + 4095) >> 12) << 12;
_virt_reloc_size = ((_file_reloc_size + 4095) >> 12) << 12;
_virt_sbat_size = ((_file_sbat_size + 4095) >> 12) << 12;
_virt_osrel_size = ((_file_osrel_size + 4095) >> 12) << 12;
_virt_text_start = _virt_head_size;
_virt_reloc_start = _virt_text_start + _virt_text_size;
_virt_sbat_start = _virt_reloc_start + _virt_reloc_size;
_virt_osrel_start = _virt_sbat_start + _virt_sbat_size;
_virt_img_size = _virt_sbat_start + _virt_sbat_size;
_virt_img_size = _virt_osrel_start + _virt_osrel_size;
. = ASSERT(header == 0x202, "The setup header has the wrong offset!");
. = ASSERT(_file_text_start == 0x1000, "The .text is at the wrong offset!");