Merge pull request #28595 from medhefgo/elf2efi-fixes

elf2efi: Fixes
This commit is contained in:
Luca Boccassi
2023-07-31 00:07:28 +01:00
committed by GitHub
2 changed files with 11 additions and 3 deletions

View File

@@ -347,7 +347,7 @@ foreach efi_elf_binary : efi_elf_binaries
name += name.startswith('systemd-boot') ? '.efi' : '.efi.stub'
# For the addon, given it's empty, we need to explicitly reserve space in the header to account for
# the sections that ukify will add.
minimum_sections = name.startswith('addon') ? '7' : '0'
minimum_sections = name.endswith('.stub') ? '15' : '0'
exe = custom_target(
name,
output : name,

View File

@@ -210,6 +210,7 @@ FILE_ALIGNMENT = 512
# Nobody cares about DOS headers, so put the PE header right after.
PE_OFFSET = 64
PE_MAGIC = b"PE\0\0"
def align_to(x: int, align: int) -> int:
@@ -304,7 +305,10 @@ def copy_sections(elf: ELFFile, opt: PeOptionalHeader) -> typing.List[PeSection]
def apply_elf_relative_relocation(
reloc: ElfRelocation, image_base: int, sections: typing.List[PeSection], addend_size: int
reloc: ElfRelocation,
image_base: int,
sections: typing.List[PeSection],
addend_size: int,
):
# fmt: off
[target] = [
@@ -439,7 +443,7 @@ def write_pe(
file.seek(0x3C, io.SEEK_SET)
file.write(PE_OFFSET.to_bytes(2, byteorder="little"))
file.seek(PE_OFFSET, io.SEEK_SET)
file.write(b"PE\0\0")
file.write(PE_MAGIC)
file.write(coff)
file.write(opt)
@@ -453,6 +457,8 @@ def write_pe(
file.write(pe_s)
offset = align_to(offset + len(pe_s.data), FILE_ALIGNMENT)
assert file.tell() <= opt.SizeOfHeaders
for pe_s in sections:
file.seek(pe_s.PointerToRawData, io.SEEK_SET)
file.write(pe_s.data)
@@ -515,6 +521,8 @@ def elf2efi(args: argparse.Namespace):
opt.SizeOfHeaders = align_to(
PE_OFFSET
+ len(PE_MAGIC)
+ sizeof(PeCoffHeader)
+ coff.SizeOfOptionalHeader
+ sizeof(PeSection) * max(coff.NumberOfSections, args.minimum_sections),
FILE_ALIGNMENT,