1
0
mirror of https://github.com/systemd/systemd.git synced 2025-02-08 09:57:41 +03:00

ukify: Fix section offset calculation

objcopy seems to expect that the offset passed to --change-section-vma
is absolute instead of relative to ImageBase. If this is not accounted
for an invalid image is created that cannot be loaded:

  0 .osrel        0000016b  0000000200016000  0000000200016000  00000400  2**2
  …
  6 .text         0000d242  0000000140001000  0000000140001000  00c6e800  2**4

This isn't an issue with gnu-efi based PE images, but natively created
ones will have a non-zero ImageBase.
This commit is contained in:
Jan Janssen 2023-01-01 11:32:55 +01:00 committed by Luca Boccassi
parent 8d885b4477
commit 599c930e48

View File

@ -73,12 +73,12 @@ def path_is_readable(s: str | None) -> pathlib.Path | None:
return p
def pe_executable_size(filename):
def pe_next_section_offset(filename):
import pefile
pe = pefile.PE(filename)
section = pe.sections[-1]
return section.VirtualAddress + section.Misc_VirtualSize
return pe.OPTIONAL_HEADER.ImageBase + section.VirtualAddress + section.Misc_VirtualSize
def round_up(x, blocksize=4096):
@ -262,7 +262,7 @@ class UKI:
offset: int | None = dataclasses.field(default=None, init=False)
def __post_init__(self):
self.offset = round_up(pe_executable_size(self.executable))
self.offset = round_up(pe_next_section_offset(self.executable))
def add_section(self, section):
assert self.offset