EFI: Add a dummy relocation section

In the past, we've seen some problems with some EFI loaders refusing to
load a binary that has both a .text section with the VMA set and no
relocations, when the VMA set to load is already allocated for some
other purpose.

This patch adds a dummy absolute relocation from 0 to 0, so the loader
can always feel like it has done something useful.

Signed-off-by: Peter Jones <pjones@redhat.com>
This commit is contained in:
Peter Jones
2022-03-31 13:24:59 -04:00
committed by Sam Demeulemeester
parent e022441544
commit d1014365c1
3 changed files with 39 additions and 7 deletions

View File

@@ -90,7 +90,7 @@ coff_header:
#else #else
.word IMAGE_FILE_MACHINE_I386 # Machine (i386) .word IMAGE_FILE_MACHINE_I386 # Machine (i386)
#endif #endif
.word 1 # NumberOfSections .word 2 # NumberOfSections
.long 0 # TimeDateStamp .long 0 # TimeDateStamp
.long 0 # PointerToSymbolTable .long 0 # PointerToSymbolTable
.long 0 # NumberOfSymbols .long 0 # NumberOfSymbols
@@ -99,15 +99,13 @@ coff_header:
.word IMAGE_FILE_DEBUG_STRIPPED \ .word IMAGE_FILE_DEBUG_STRIPPED \
| IMAGE_FILE_LOCAL_SYMS_STRIPPED\ | IMAGE_FILE_LOCAL_SYMS_STRIPPED\
| IMAGE_FILE_LINE_NUMS_STRIPPED \ | IMAGE_FILE_LINE_NUMS_STRIPPED \
| IMAGE_FILE_EXECUTABLE_IMAGE \ | IMAGE_FILE_EXECUTABLE_IMAGE # Characteristics
| IMAGE_FILE_RELOCS_STRIPPED # Characteristics
#else #else
.word IMAGE_FILE_32BIT_MACHINE \ .word IMAGE_FILE_32BIT_MACHINE \
| IMAGE_FILE_DEBUG_STRIPPED \ | IMAGE_FILE_DEBUG_STRIPPED \
| IMAGE_FILE_LOCAL_SYMS_STRIPPED\ | IMAGE_FILE_LOCAL_SYMS_STRIPPED\
| IMAGE_FILE_LINE_NUMS_STRIPPED \ | IMAGE_FILE_LINE_NUMS_STRIPPED \
| IMAGE_FILE_EXECUTABLE_IMAGE \ | IMAGE_FILE_EXECUTABLE_IMAGE # Characteristics.
| IMAGE_FILE_RELOCS_STRIPPED # Characteristics.
#endif #endif
optional_header: optional_header:
@@ -175,8 +173,8 @@ extra_header_fields:
.long 0 # DataDirectory.Exception.Size .long 0 # DataDirectory.Exception.Size
.long 0 # DataDirectory.Certs.VirtualAddress .long 0 # DataDirectory.Certs.VirtualAddress
.long 0 # DataDirectory.Certs.Size .long 0 # DataDirectory.Certs.Size
.long 0 # DataDirectory.BaseReloc.VirtualAddress .long _reloc_start # DataDirectory.BaseReloc.VirtualAddress
.long 0 # DataDirectory.BaseReloc.Size .long _reloc_size # DataDirectory.BaseReloc.Size
# Section table # Section table
section_table: section_table:
@@ -197,6 +195,21 @@ section_table:
| IMAGE_SCN_ALIGN_16BYTES \ | IMAGE_SCN_ALIGN_16BYTES \
| IMAGE_SCN_CNT_CODE # Characteristics (section flags) | 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. # Emulate the Linux boot header, to allow loading by intermediate boot loaders.
.org 497 .org 497
@@ -217,3 +230,8 @@ boot_flag:
.org 512 .org 512
end_of_headers: 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

View File

@@ -17,12 +17,19 @@ SECTIONS {
. = ALIGN(512); . = ALIGN(512);
_text_end = . ; _text_end = . ;
} }
. = ALIGN(512);
.reloc : {
_reloc_start = . ;
*(.reloc)
_reloc_end = . ;
}
. = ALIGN(4096); . = ALIGN(4096);
_img_end = . ; _img_end = . ;
/DISCARD/ : { *(*) } /DISCARD/ : { *(*) }
_text_size = (_text_end - _text_start); _text_size = (_text_end - _text_start);
_reloc_size = (_reloc_end - _reloc_start);
_sys_size = _text_size >> 4; _sys_size = _text_size >> 4;
_init_size = _text_size + _bss_size; _init_size = _text_size + _bss_size;
} }

View File

@@ -17,12 +17,19 @@ SECTIONS {
. = ALIGN(512); . = ALIGN(512);
_text_end = . ; _text_end = . ;
} }
. = ALIGN(512);
.reloc : {
_reloc_start = . ;
*(.reloc)
_reloc_end = . ;
}
. = ALIGN(4096); . = ALIGN(4096);
_img_end = . ; _img_end = . ;
/DISCARD/ : { *(*) } /DISCARD/ : { *(*) }
_text_size = (_text_end - _text_start); _text_size = (_text_end - _text_start);
_reloc_size = (_reloc_end - _reloc_start);
_sys_size = _text_size >> 4; _sys_size = _text_size >> 4;
_init_size = _text_size + _bss_size; _init_size = _text_size + _bss_size;
} }