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
This commit is contained in:
Daan De Meyer
2024-09-30 15:52:59 +02:00
parent 83d4c135e8
commit 2188c759f9
+12 -2
View File
@@ -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')