summaryrefslogtreecommitdiff
path: root/src/ukify
diff options
context:
space:
mode:
authorJan Janssen <medhefgo@web.de>2023-01-01 11:32:55 +0100
committerLuca Boccassi <luca.boccassi@gmail.com>2023-01-02 15:59:17 +0100
commit599c930e48c95e198dc0c8d9c8d68cf14cbfa566 (patch)
treed915aec4918fed8dd38298c4711d89f39ccb2810 /src/ukify
parent8d885b4477ef544093a617027a7a36d34c803479 (diff)
downloadsystemd-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-xsrc/ukify/ukify.py6
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