diff options
author | Jan Janssen <medhefgo@web.de> | 2023-01-01 11:32:55 +0100 |
---|---|---|
committer | Luca Boccassi <luca.boccassi@gmail.com> | 2023-01-02 15:59:17 +0100 |
commit | 599c930e48c95e198dc0c8d9c8d68cf14cbfa566 (patch) | |
tree | d915aec4918fed8dd38298c4711d89f39ccb2810 /src/ukify | |
parent | 8d885b4477ef544093a617027a7a36d34c803479 (diff) | |
download | systemd-599c930e48c95e198dc0c8d9c8d68cf14cbfa566.tar.gz |
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.
Diffstat (limited to 'src/ukify')
-rwxr-xr-x | src/ukify/ukify.py | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/src/ukify/ukify.py b/src/ukify/ukify.py index ad2f8a2c71..d22772e403 100755 --- a/src/ukify/ukify.py +++ b/src/ukify/ukify.py @@ -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 |