From: Daan De Meyer Date: Mon, 30 Sep 2024 11:42:50 +0000 (+0200) Subject: ukify: Use SizeOfImage from linux image as virtual size of .linux section X-Git-Tag: v257-rc1~357^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=2188c759f97e40b97ebe3e94e82239f36b525b10;p=thirdparty%2Fsystemd.git ukify: Use SizeOfImage from linux image as virtual size of .linux section The SizeOfImage is bigger than the image itself so that space is guaranteed to be available for in place execution of the linux image. Let's make sure we take this into account and use SizeOfImage as the section's virtual size instead of the size of the image itself. Fixes #34578 --- diff --git a/src/ukify/ukify.py b/src/ukify/ukify.py index fc391995c42..86117cd5631 100755 --- a/src/ukify/ukify.py +++ b/src/ukify/ukify.py @@ -323,6 +323,7 @@ class Section: tmpfile: Optional[IO] = None measure: bool = False output_mode: Optional[str] = None + virtual_size: Optional[int] = None @classmethod def create(cls, name, contents, **kwargs): @@ -709,7 +710,10 @@ def pe_add_sections(uki: UKI, output: str): new_section.set_file_offset(offset) new_section.Name = section.name.encode() - new_section.Misc_VirtualSize = len(data) + if section.virtual_size is not None: + new_section.Misc_VirtualSize = section.virtual_size + else: + new_section.Misc_VirtualSize = len(data) # Non-stripped stubs might still have an unaligned symbol table at the end, making their size # unaligned, so we make sure to explicitly pad the pointer to new sections to an aligned offset. new_section.PointerToRawData = round_up(len(pe.__data__), pe.OPTIONAL_HEADER.FileAlignment) @@ -988,7 +992,13 @@ uki-addon,1,UKI Addon,addon,1,https://www.freedesktop.org/software/systemd/man/l # UKI creation if linux is not None: - uki.add_section(Section.create('.linux', linux, measure=True)) + try: + virtual_size = pefile.PE(linux, fast_load=True).OPTIONAL_HEADER.SizeOfImage + except pefile.PEFormatError: + print(f"{f} is not a valid PE file, not using SizeOfImage.") + virtual_size = None + + uki.add_section(Section.create('.linux', linux, measure=True, virtual_size=virtual_size)) if sign_args_present: unsigned = tempfile.NamedTemporaryFile(prefix='uki')