mirror of
https://git.proxmox.com/git/fwupd
synced 2025-05-30 16:45:56 +00:00

The current approach of adding SBAT metadata after linking is creating an image that is badly formed in 2 ways: * The SBAT section's file offset and size are not a multiple of the file alignment. * The SBAT section has a virtual address of zero. EDK2 loads the header here, and so it gets rejected. This changes the approach to match shim, where an object file is created with a .sbat section and then the linker takes care of placing the section at a more appropriate virtual address. See https://github.com/vathpela/gnu-efi/pull/14 for the section addition.
94 lines
1.8 KiB
Python
Executable File
94 lines
1.8 KiB
Python
Executable File
#!/usr/bin/python3
|
|
#
|
|
# Copyright (C) 2021 Javier Martinez Canillas <javierm@redhat.com>
|
|
# Copyright (C) 2021 Richard Hughes <richard@hughsie.com>
|
|
#
|
|
# SPDX-License-Identifier: LGPL-2.1+
|
|
#
|
|
# pylint: disable=missing-docstring, invalid-name
|
|
|
|
import subprocess
|
|
import sys
|
|
import argparse
|
|
|
|
|
|
def _run_objcopy(args):
|
|
|
|
argv = [
|
|
args.objcopy,
|
|
"-j",
|
|
".text",
|
|
"-j",
|
|
".sbat",
|
|
"-j",
|
|
".sdata",
|
|
"-j",
|
|
".data",
|
|
"-j",
|
|
".dynamic",
|
|
"-j",
|
|
".dynsym",
|
|
"-j",
|
|
".rel*",
|
|
args.infile,
|
|
args.outfile,
|
|
]
|
|
|
|
# aarch64 and arm32 don't have an EFI capable objcopy
|
|
# Use 'binary' instead, and add required symbols manually
|
|
if args.arch in ["aarch64", "arm"]:
|
|
argv.extend(["-O", "binary"])
|
|
else:
|
|
argv.extend(["--target", "efi-app-{}".format(args.arch)])
|
|
try:
|
|
subprocess.run(argv, check=True)
|
|
except FileNotFoundError as e:
|
|
print(str(e))
|
|
sys.exit(1)
|
|
|
|
|
|
def _run_genpeimg(args):
|
|
|
|
# this is okay if it does not exist
|
|
argv = [
|
|
"genpeimg",
|
|
"-d",
|
|
"+d",
|
|
"+n",
|
|
"-d",
|
|
"+s",
|
|
args.outfile,
|
|
]
|
|
try:
|
|
subprocess.run(argv, check=True)
|
|
except FileNotFoundError as _:
|
|
pass
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument(
|
|
"--objcopy",
|
|
default="objcopy",
|
|
help="Binary file to use for objcopy",
|
|
)
|
|
parser.add_argument(
|
|
"--arch",
|
|
default="x86_64",
|
|
help="EFI architecture",
|
|
)
|
|
parser.add_argument(
|
|
"infile",
|
|
help="Input file",
|
|
)
|
|
parser.add_argument(
|
|
"outfile",
|
|
help="Output file",
|
|
)
|
|
_args = parser.parse_args()
|
|
_run_objcopy(_args)
|
|
_run_genpeimg(_args)
|
|
|
|
sys.exit(0)
|