diff --git a/boot/header.S b/boot/header.S index 90a4389..c922a44 100644 --- a/boot/header.S +++ b/boot/header.S @@ -90,7 +90,7 @@ coff_header: #else .word IMAGE_FILE_MACHINE_I386 # Machine (i386) #endif - .word 1 # NumberOfSections + .word 2 # NumberOfSections .long 0 # TimeDateStamp .long 0 # PointerToSymbolTable .long 0 # NumberOfSymbols @@ -99,15 +99,13 @@ coff_header: .word IMAGE_FILE_DEBUG_STRIPPED \ | IMAGE_FILE_LOCAL_SYMS_STRIPPED\ | IMAGE_FILE_LINE_NUMS_STRIPPED \ - | IMAGE_FILE_EXECUTABLE_IMAGE \ - | IMAGE_FILE_RELOCS_STRIPPED # Characteristics + | IMAGE_FILE_EXECUTABLE_IMAGE # Characteristics #else .word IMAGE_FILE_32BIT_MACHINE \ | IMAGE_FILE_DEBUG_STRIPPED \ | IMAGE_FILE_LOCAL_SYMS_STRIPPED\ | IMAGE_FILE_LINE_NUMS_STRIPPED \ - | IMAGE_FILE_EXECUTABLE_IMAGE \ - | IMAGE_FILE_RELOCS_STRIPPED # Characteristics. + | IMAGE_FILE_EXECUTABLE_IMAGE # Characteristics. #endif optional_header: @@ -175,8 +173,8 @@ extra_header_fields: .long 0 # DataDirectory.Exception.Size .long 0 # DataDirectory.Certs.VirtualAddress .long 0 # DataDirectory.Certs.Size - .long 0 # DataDirectory.BaseReloc.VirtualAddress - .long 0 # DataDirectory.BaseReloc.Size + .long _reloc_start # DataDirectory.BaseReloc.VirtualAddress + .long _reloc_size # DataDirectory.BaseReloc.Size # Section table section_table: @@ -197,6 +195,21 @@ section_table: | IMAGE_SCN_ALIGN_16BYTES \ | IMAGE_SCN_CNT_CODE # Characteristics (section flags) + .ascii ".reloc" + .byte 0 + .byte 0 + .long _reloc_size # VirtualSize + .long _reloc_start # VirtualAddress + .long _reloc_size # SizeOfRawData + .long _reloc_start # PointerToRawData + .long 0 # PointerToRelocations + .long 0 # PointerToLineNumbers + .word 0 # NumberOfRelocations + .word 0 # NumberOfLineNumbers + .long IMAGE_SCN_MEM_READ \ + | IMAGE_SCN_ALIGN_4BYTES \ + | IMAGE_SCN_CNT_INITIALIZED_DATA # Characteristics (section flags) + # Emulate the Linux boot header, to allow loading by intermediate boot loaders. .org 497 @@ -217,3 +230,8 @@ boot_flag: .org 512 end_of_headers: + +.section ".reloc", "a", @progbits + .long 0 // Page RVA + .long 10 // Block Size (2*4+2) + .word (IMAGE_REL_AMD64_ABSOLUTE<<12) + 0 // reloc 0 -> 0 diff --git a/build32/ldscripts/memtest_efi.lds b/build32/ldscripts/memtest_efi.lds index f9a4470..69dd6ae 100644 --- a/build32/ldscripts/memtest_efi.lds +++ b/build32/ldscripts/memtest_efi.lds @@ -17,12 +17,19 @@ SECTIONS { . = ALIGN(512); _text_end = . ; } + . = ALIGN(512); + .reloc : { + _reloc_start = . ; + *(.reloc) + _reloc_end = . ; + } . = ALIGN(4096); _img_end = . ; /DISCARD/ : { *(*) } _text_size = (_text_end - _text_start); + _reloc_size = (_reloc_end - _reloc_start); _sys_size = _text_size >> 4; _init_size = _text_size + _bss_size; } diff --git a/build64/ldscripts/memtest_efi.lds b/build64/ldscripts/memtest_efi.lds index c783548..408336a 100644 --- a/build64/ldscripts/memtest_efi.lds +++ b/build64/ldscripts/memtest_efi.lds @@ -17,12 +17,19 @@ SECTIONS { . = ALIGN(512); _text_end = . ; } + . = ALIGN(512); + .reloc : { + _reloc_start = . ; + *(.reloc) + _reloc_end = . ; + } . = ALIGN(4096); _img_end = . ; /DISCARD/ : { *(*) } _text_size = (_text_end - _text_start); + _reloc_size = (_reloc_end - _reloc_start); _sys_size = _text_size >> 4; _init_size = _text_size + _bss_size; }