Merge pull request #31907 from mrc0mmand/efi-shenanigans

efi: check if all sections of our EFI binaries are properly aligned
This commit is contained in:
Zbigniew Jędrzejewski-Szmek
2024-03-23 12:04:14 +01:00
committed by GitHub
3 changed files with 39 additions and 1 deletions

View File

@@ -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')

View File

@@ -212,7 +212,7 @@ endif
efi_arch_c_args = {
'aarch64' : ['-mgeneral-regs-only'],
'arm' : ['-mgeneral-regs-only'],
# Until -mgeneral-regs-only is supported in LoongArch, use the following option instead:
# Until -mgeneral-regs-only is supported in LoongArch, use the following option instead:
'loongarch64' : ['-mno-lsx', '-mno-lasx'],
# Pass -m64/32 explicitly to make building on x32 work.
'x86_64' : ['-m64', '-march=x86-64', '-mno-red-zone', '-mgeneral-regs-only'],
@@ -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)

32
tools/check-efi-alignment.py Executable file
View File

@@ -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())