Skip to content

Commit 9e0bebc

Browse files
nordic-mik7nvlsianpu
authored andcommitted
scripts: imgtool: Compression of no header-padded images
This fixes issues when trying to compress images with no header padding requested. Signed-off-by: Michal Kozikowski <michal.kozikowski@nordicsemi.no>
1 parent 85558b7 commit 9e0bebc

File tree

2 files changed

+20
-12
lines changed

2 files changed

+20
-12
lines changed

scripts/imgtool/image.py

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,6 @@ def load(self, path):
348348
self.payload = copy.copy(self.infile_data)
349349
except FileNotFoundError:
350350
raise click.UsageError("Input file not found")
351-
self.image_size = len(self.payload)
352351

353352
# Add the image header if needed.
354353
if self.pad_header and self.header_size > 0:
@@ -358,6 +357,8 @@ def load(self, path):
358357
self.payload = bytes([self.erased_val] * self.header_size) + \
359358
self.payload
360359

360+
self.image_size = len(self.payload) - self.header_size
361+
361362
self.check_header()
362363

363364
def load_compressed(self, data, compression_header):
@@ -366,14 +367,19 @@ def load_compressed(self, data, compression_header):
366367
self.image_size = len(self.payload)
367368

368369
# Add the image header if needed.
369-
if self.pad_header and self.header_size > 0:
370-
if self.base_addr:
371-
# Adjust base_addr for new header
372-
self.base_addr -= self.header_size
373-
self.payload = bytes([self.erased_val] * self.header_size) + \
374-
self.payload
375-
376-
self.check_header()
370+
if self.header_size > 0:
371+
if self.pad_header:
372+
if self.base_addr:
373+
# Adjust base_addr for new header
374+
self.base_addr -= self.header_size
375+
self.payload = bytes([self.erased_val] * self.header_size) + \
376+
self.payload
377+
else:
378+
# Fill header padding with zeros to align with what is expected
379+
# for uncompressed images when no pad_header is requested
380+
# (see self.check_header())
381+
self.payload = bytes([0] * self.header_size) + \
382+
self.payload
377383

378384
def save(self, path, hex_addr=None):
379385
"""Save an image from a given file"""

scripts/imgtool/main.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -542,9 +542,11 @@ def sign(key, public_key_format, align, version, pad_sig, header_size,
542542
]
543543
if compression == "lzma2armthumb":
544544
compression_filters.insert(0, {"id":lzma.FILTER_ARMTHUMB})
545-
compressed_data = lzma.compress(img.get_infile_data(),filters=compression_filters,
546-
format=lzma.FORMAT_RAW)
547-
uncompressed_size = len(img.get_infile_data())
545+
546+
infile_offset = 0 if pad_header else header_size
547+
compressed_data = lzma.compress(img.get_infile_data()[infile_offset:],
548+
filters=compression_filters, format=lzma.FORMAT_RAW)
549+
uncompressed_size = len(img.get_infile_data()[infile_offset:])
548550
compressed_size = len(compressed_data)
549551
print(f"compressed image size: {compressed_size} bytes")
550552
print(f"original image size: {uncompressed_size} bytes")

0 commit comments

Comments
 (0)