]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
ukify: Strip symbol/string table for old stubs
authorJan Janssen <medhefgo@web.de>
Fri, 31 Mar 2023 11:13:00 +0000 (13:13 +0200)
committerDaan De Meyer <daan.j.demeyer@gmail.com>
Sat, 1 Apr 2023 12:31:22 +0000 (14:31 +0200)
src/ukify/ukify.py

index b847f2ed872a55870bb474e53215a2817a640ff0..b319f2dc913509b5150cea70d0d58af4fd38062c 100755 (executable)
@@ -450,6 +450,19 @@ class PeError(Exception):
 def pe_add_sections(uki: UKI, output: str):
     pe = pefile.PE(uki.executable, fast_load=True)
 
+    # Old stubs do not have the symbol/string table stripped, even though image files should not have one.
+    if symbol_table := pe.FILE_HEADER.PointerToSymbolTable:
+        symbol_table_size = 18 * pe.FILE_HEADER.NumberOfSymbols
+        if string_table_size := pe.get_dword_from_offset(symbol_table + symbol_table_size):
+            symbol_table_size += string_table_size
+
+        # Let's be safe and only strip it if it's at the end of the file.
+        if symbol_table + symbol_table_size == len(pe.__data__):
+            pe.__data__ = pe.__data__[:symbol_table]
+            pe.FILE_HEADER.PointerToSymbolTable = 0
+            pe.FILE_HEADER.NumberOfSymbols = 0
+            pe.FILE_HEADER.IMAGE_FILE_LOCAL_SYMS_STRIPPED = True
+
     # Old stubs might have been stripped, leading to unaligned raw data values, so let's fix them up here.
     for i, section in enumerate(pe.sections):
         oldp = section.PointerToRawData