From dae548f8042a7e4e7c5ea6f87d2c034d1caf8ad7 Mon Sep 17 00:00:00 2001 From: Sam Demeulemeester <38105886+x86fr@users.noreply.github.com> Date: Mon, 25 May 2026 20:58:41 +0200 Subject: [PATCH] Add .osrel section to the binary (#617) Closes #265 --- boot/loongarch/header.S | 23 ++++++++++++++++++++- boot/x86/header.S | 22 +++++++++++++++++++- build/i586/ldscripts/memtest_efi.lds | 15 ++++++++++++-- build/loongarch64/ldscripts/memtest_efi.lds | 15 ++++++++++++-- build/x86_64/ldscripts/memtest_efi.lds | 17 ++++++++++++--- 5 files changed, 83 insertions(+), 9 deletions(-) diff --git a/boot/loongarch/header.S b/boot/loongarch/header.S index 7da527f..956b766 100644 --- a/boot/loongarch/header.S +++ b/boot/loongarch/header.S @@ -10,6 +10,7 @@ #define __ASSEMBLY__ #include "boot.h" +#include "build_version.h" #include "peimage.h" # The EFI loader loads the header at ImageBase, so we have to locate the main program @@ -36,7 +37,7 @@ pe_header: coff_header: .short IMAGE_FILE_MACHINE_LOONGARCH64 # Machine (LoongArch64) - .short 4 # NumberOfSections + .short 5 # NumberOfSections .long 0 # TimeDateStamp .long 0 # PointerToSymbolTable .long 0 # NumberOfSymbols @@ -159,6 +160,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 + .short 0 # NumberOfRelocations + .short 0 # NumberOfLineNumbers + .long IMAGE_SCN_MEM_READ \ + | IMAGE_SCN_CNT_INITIALIZED_DATA # Characteristics (section flags) + .org 512 .section ".reloc" @@ -168,3 +183,9 @@ section_table: .section ".sbat", "a", @progbits .incbin "../boot/sbat.csv" + +.section ".osrel", "a", @progbits + .ascii "ID=memtest86plus\n" + .ascii "NAME=\"Memtest86+\"\n" + .ascii "VERSION_ID=\"" , MT_VERSION , "\"\n" + .ascii "PRETTY_NAME=\"Memtest86+ v" , MT_VERSION , "\"\n" diff --git a/boot/x86/header.S b/boot/x86/header.S index 8b12864..780e808 100644 --- a/boot/x86/header.S +++ b/boot/x86/header.S @@ -805,7 +805,7 @@ coff_header: #else .word IMAGE_FILE_MACHINE_I386 # Machine (i386) #endif - .word 4 # NumberOfSections + .word 5 # NumberOfSections .long 0 # TimeDateStamp .long 0 # PointerToSymbolTable .long 0 # NumberOfSymbols @@ -954,6 +954,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) @@ -964,3 +978,9 @@ section_table: .section ".sbat", "a", @progbits .incbin "../boot/sbat.csv" + +.section ".osrel", "a", @progbits + .ascii "ID=memtest86plus\n" + .ascii "NAME=\"Memtest86+\"\n" + .ascii "VERSION_ID=\"" , MT_VERSION , "\"\n" + .ascii "PRETTY_NAME=\"Memtest86+ v" , MT_VERSION , "\"\n" diff --git a/build/i586/ldscripts/memtest_efi.lds b/build/i586/ldscripts/memtest_efi.lds index 99c122d..3fb2911 100644 --- a/build/i586/ldscripts/memtest_efi.lds +++ b/build/i586/ldscripts/memtest_efi.lds @@ -39,6 +39,13 @@ SECTIONS { . = ALIGN(512); _file_sbat_end = . ; } + .osrel : { + _file_osrel_start = . ; + *(.osrel) + _real_osrel_end = . ; + . = ALIGN(512); + _file_osrel_end = . ; + } .shstrtab : { *(.shstrtab) } /DISCARD/ : { *(*) } @@ -46,12 +53,14 @@ SECTIONS { _real_data_size = _real_data_end - _file_data_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_data_size = _file_data_end - _file_data_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 + _real_data_size + 15) >> 4; _init_size = _real_text_size + _real_data_size + _bss_size; @@ -61,15 +70,17 @@ SECTIONS { _virt_data_size = ((_real_data_size + _bss_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_data_start = _virt_text_start + _virt_text_size; _virt_reloc_start = _virt_data_start + _virt_data_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; - _virt_init_size = _virt_data_size + _virt_reloc_size + _virt_sbat_size; + _virt_init_size = _virt_data_size + _virt_reloc_size + _virt_sbat_size + _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!"); diff --git a/build/loongarch64/ldscripts/memtest_efi.lds b/build/loongarch64/ldscripts/memtest_efi.lds index 437c8fb..a623010 100644 --- a/build/loongarch64/ldscripts/memtest_efi.lds +++ b/build/loongarch64/ldscripts/memtest_efi.lds @@ -36,6 +36,13 @@ SECTIONS { . = ALIGN(512); _file_sbat_end = . ; } + .osrel : { + _file_osrel_start = . ; + *(.osrel) + _real_osrel_end = . ; + . = ALIGN(512); + _file_osrel_end = . ; + } .shstrtab : { *(.shstrtab) } /DISCARD/ : { *(*) } @@ -43,12 +50,14 @@ SECTIONS { _real_data_size = _real_data_end - _file_data_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_data_size = _file_data_end - _file_data_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 + _real_data_size + 15) >> 4; _init_size = _real_text_size + _real_data_size + _bss_size; @@ -58,13 +67,15 @@ SECTIONS { _virt_data_size = ((_real_data_size + _bss_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_data_start = _virt_text_start + _virt_text_size; _virt_reloc_start = _virt_data_start + _virt_data_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; - _virt_init_size = _virt_data_size + _virt_reloc_size + _virt_sbat_size; + _virt_init_size = _virt_data_size + _virt_reloc_size + _virt_sbat_size + _virt_osrel_size; } diff --git a/build/x86_64/ldscripts/memtest_efi.lds b/build/x86_64/ldscripts/memtest_efi.lds index ae78fe8..f6c8d93 100644 --- a/build/x86_64/ldscripts/memtest_efi.lds +++ b/build/x86_64/ldscripts/memtest_efi.lds @@ -39,6 +39,13 @@ SECTIONS { . = ALIGN(512); _file_sbat_end = . ; } + .osrel : { + _file_osrel_start = . ; + *(.osrel) + _real_osrel_end = . ; + . = ALIGN(512); + _file_osrel_end = . ; + } .shstrtab : { *(.shstrtab) } /DISCARD/ : { *(*) } @@ -46,12 +53,14 @@ SECTIONS { _real_data_size = _real_data_end - _file_data_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_data_size = _file_data_end - _file_data_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 + _real_data_size + 15) >> 4; _init_size = _real_text_size + _real_data_size + _bss_size; @@ -60,16 +69,18 @@ SECTIONS { _virt_text_size = ((_real_text_size + 4095) >> 12) << 12; _virt_data_size = ((_real_data_size + _bss_size + 4095) >> 12) << 12; _virt_reloc_size = ((_file_reloc_size + 4095) >> 12) << 12; - _virt_sbat_size = _real_sbat_size; + _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_data_start = _virt_text_start + _virt_text_size; _virt_reloc_start = _virt_data_start + _virt_data_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 + 4095) >> 12) << 12; + _virt_img_size = ((_virt_osrel_start + _virt_osrel_size + 4095) >> 12) << 12; - _virt_init_size = _virt_data_size + _virt_reloc_size + _virt_sbat_size; + _virt_init_size = _virt_data_size + _virt_reloc_size + _virt_sbat_size + _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!");