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:
+12
-2
@@ -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')
|
||||
|
||||
Reference in New Issue
Block a user