diff --git a/meson.build b/meson.build index 8d1cd8a9ed0..1bedbd56056 100644 --- a/meson.build +++ b/meson.build @@ -1828,6 +1828,7 @@ conf.set10('ENABLE_UKIFY', want_ukify) ##################################################################### +check_efi_alignment_py = find_program('tools/check-efi-alignment.py') check_version_history_py = find_program('tools/check-version-history.py') elf2efi_py = find_program('tools/elf2efi.py') export_dbus_interfaces_py = find_program('tools/dbus_exporter.py') diff --git a/src/boot/efi/meson.build b/src/boot/efi/meson.build index 786fc8038fb..7a60b0ec7ed 100644 --- a/src/boot/efi/meson.build +++ b/src/boot/efi/meson.build @@ -407,6 +407,11 @@ foreach efi_elf_binary : efi_elf_binaries if name == 'addon@0@.efi.stub'.format(efi_arch) efi_addon = exe.full_path() endif + + test('check-alignment-@0@'.format(name), + check_efi_alignment_py, + args : exe.full_path(), + suite : 'efi') endforeach alias_target('systemd-boot', boot_targets) diff --git a/tools/check-efi-alignment.py b/tools/check-efi-alignment.py new file mode 100755 index 00000000000..bb33ac08097 --- /dev/null +++ b/tools/check-efi-alignment.py @@ -0,0 +1,32 @@ +#!/usr/bin/python3 +# SPDX-License-Identifier: LGPL-2.1-or-later +# vi: set tw=110 sw=4 ts=4 et: + +import sys + +import pefile + + +def main(): + pe = pefile.PE(sys.argv[1], fast_load=True) + + for section in pe.sections: + name = section.Name.rstrip(b"\x00").decode() + file_addr = section.PointerToRawData + virt_addr = section.VirtualAddress + print(f"{name:10s} file=0x{file_addr:08x} virt=0x{virt_addr:08x}") + + if file_addr % 512 != 0: + print(f"File address of {name} section is not aligned to 512 bytes", file=sys.stderr) + return 1 + + if virt_addr % 512 != 0: + print(f"Virt address of {name} section is not aligned to 512 bytes", file=sys.stderr) + return 1 + +if __name__ == '__main__': + if len(sys.argv) != 2: + print(f"Usage: {sys.argv[0]} pe-image") + sys.exit(1) + + sys.exit(main())