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
.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

View File

@ -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;
}

View File

@ -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;
}