mirror of
https://git.proxmox.com/git/fwupd
synced 2025-06-29 16:21:02 +00:00

When using "objcopy -O binary" to generate AArch64 EFI images, it silently drops the sections without "alloc" or "load" or the sections with "unload", and this caused the content of .sbat was skipped in the final EFI image. This commit sets the common read-only data section flags to .sbat to make sure the content will be copied. Signed-off-by: Gary Lin <glin@suse.com>
152 lines
3.8 KiB
Python
Executable File
152 lines
3.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
|
|
import tempfile
|
|
|
|
|
|
def _generate_sbat(args):
|
|
""" append SBAT metadata """
|
|
FWUPD_SUMMARY = "Firmware update daemon"
|
|
FWUPD_URL = "https://github.com/fwupd/fwupd"
|
|
|
|
subprocess.run(
|
|
[args.cc, "-x", "c", "-c", "-o", args.outfile, "/dev/null"], check=True
|
|
)
|
|
|
|
# not specified
|
|
if not args.sbat_distro_id:
|
|
return
|
|
|
|
with tempfile.NamedTemporaryFile() as sfd:
|
|
|
|
# spec
|
|
sfd.write(
|
|
"{0},{1},{2},{0},{1},{3}\n".format(
|
|
"sbat",
|
|
args.sbat_version,
|
|
"UEFI shim",
|
|
"https://github.com/rhboot/shim/blob/main/SBAT.md",
|
|
).encode()
|
|
)
|
|
|
|
# fwupd
|
|
sfd.write(
|
|
"{0},{1},{2},{0},{3},{4}\n".format(
|
|
args.project_name,
|
|
args.sbat_generation,
|
|
"Firmware update daemon",
|
|
args.project_version,
|
|
FWUPD_URL,
|
|
).encode()
|
|
)
|
|
|
|
# distro specifics, falling back to the project defaults
|
|
sfd.write(
|
|
"{0}-{1},{2},{3},{4},{5},{6}\n".format(
|
|
args.project_name,
|
|
args.sbat_distro_id,
|
|
args.sbat_distro_generation or args.sbat_generation,
|
|
args.sbat_distro_summary or FWUPD_SUMMARY,
|
|
args.sbat_distro_pkgname,
|
|
args.sbat_distro_version or args.project_version,
|
|
args.sbat_distro_url or FWUPD_URL,
|
|
).encode()
|
|
)
|
|
|
|
# all written
|
|
sfd.seek(0)
|
|
|
|
# add a section to the object; use `objdump -s -j .sbat` to verify
|
|
argv = [
|
|
args.objcopy,
|
|
"--add-section",
|
|
".sbat={}".format(sfd.name),
|
|
"--set-section-flags",
|
|
".sbat=contents,alloc,load,readonly,data",
|
|
args.outfile,
|
|
]
|
|
subprocess.run(argv, check=True)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
parser = argparse.ArgumentParser()
|
|
parser.add_argument(
|
|
"--cc",
|
|
default="gcc",
|
|
help="Compiler to use for generating sbat object",
|
|
)
|
|
parser.add_argument(
|
|
"--objcopy",
|
|
default="objcopy",
|
|
help="Binary file to use for objcopy",
|
|
)
|
|
parser.add_argument(
|
|
"--project-name",
|
|
help="SBAT project name",
|
|
)
|
|
parser.add_argument(
|
|
"--project-version",
|
|
help="SBAT project version",
|
|
)
|
|
parser.add_argument(
|
|
"--sbat-version",
|
|
default=1,
|
|
type=int,
|
|
help="SBAT version",
|
|
)
|
|
parser.add_argument(
|
|
"--sbat-generation",
|
|
default=1,
|
|
type=int,
|
|
help="SBAT generation",
|
|
)
|
|
parser.add_argument(
|
|
"--sbat-distro-id",
|
|
default=None,
|
|
help="SBAT distribution ID"
|
|
)
|
|
parser.add_argument(
|
|
"--sbat-distro-generation",
|
|
default=None,
|
|
type=int,
|
|
help="SBAT distribution generation",
|
|
)
|
|
parser.add_argument(
|
|
"--sbat-distro-summary",
|
|
default=None,
|
|
help="SBAT distribution summary",
|
|
)
|
|
parser.add_argument(
|
|
"--sbat-distro-pkgname",
|
|
default=None,
|
|
help="SBAT distribution package name",
|
|
)
|
|
parser.add_argument(
|
|
"--sbat-distro-version",
|
|
default=None,
|
|
help="SBAT distribution version",
|
|
)
|
|
parser.add_argument(
|
|
"--sbat-distro-url",
|
|
default=None,
|
|
help="SBAT distribution URL",
|
|
)
|
|
parser.add_argument(
|
|
"outfile",
|
|
help="Output file",
|
|
)
|
|
_args = parser.parse_args()
|
|
_generate_sbat(_args)
|
|
|
|
sys.exit(0)
|