Commit Graph
177 Commits
Author SHA1 Message Date
Luca Boccassi fcd71b62be Merge pull request #28595 from medhefgo/elf2efi-fixes
elf2efi: Fixes
2023-07-31 00:07:28 +01:00
Luca Boccassi 6c0ac118d2 Merge pull request #28567 from yuwata/meson-versiondep
meson:  cleanups for version dependency
2023-07-30 23:40:51 +01:00
Jan Janssen d0bbe32485 stub: Also reserve sections for EFI stub
The stub image may not have enough sections to cause enough PE header
space to be free for later expansion. Given that the stub is guaranteed
to be expanded we should always reserve enough sections for it.

This also bumps the reservation to 15. It doesn't add more space
compared to current builds but it more closely reflects the amount of
sections that a UKI could have in total if all optional sections are
used.

Fixes: #28593
2023-07-30 21:31:38 +02:00
Yu Watanabe 0c491d0f34 meson: use kwargs to declare efi binaries
No functional change, just refactoring.
2023-07-30 08:57:55 +09:00
Yu Watanabe 4122d68682 boot: always set SBAT_DISTRO_VERSION 2023-07-30 04:54:47 +09:00
Luca Boccassi eff91e2f38 efi: link with -z nopack-relative-relocs
elf2efi.py cannot handle DT_RELR relocations, so disable it
if we can

Fixes https://github.com/systemd/systemd/issues/28520
2023-07-26 18:47:53 +01:00
Jan Janssen 7ea44f1733 boot: Fix build for x32
When building on a x32 system we need to explicitly pass `-m64` to get
the right ABI as the kernel and EFI are still 64bit. For this to
actually work, a suitable multilib compiler, 32bit libc headers and
libgcc need to be installed (similar to ia32 builds on x86_64).
2023-07-10 11:09:28 +01:00
Jan Janssen 816df466a7 meson: Use build_tgt.name() 2023-06-14 16:10:55 +02:00
Zbigniew Jędrzejewski-Szmek 320266b961 test_ukify: pass through path to addon stub
Without this, the tests would generally be skipped, since we haven't made a
release with the addon stub yet. But even if the file is there, we always want
to test the freshly-built item.
2023-06-06 15:45:57 +02:00
Luca Boccassi 05c9f9c251 stub: allow loading and verifying cmdline addons
Files placed in /EFI/Linux/UKI.efi.extra.d/ and /loader/addons/ are
opened and verified using the LoadImage protocol, and will thus get
verified via shim/firmware.
If they are valid signed PE files, the .cmdline section will be
extracted and appended. If there are multiple addons in each directory,
they will be parsed in alphanumerical order.

Optionally the .uname sections are also matched if present, so
that they can be used to filter out addons as well if needed, and only
addons that correspond exactly to the UKI being loaded are used.
It is recommended to also always add a .sbat section to addons, so
that they can be mass-revoked with just a policy update.

The files must have a .addon.efi suffix.

Files in the per-UKI directory are parsed, sorted, measured and
appended first. Then, files in the generic directory are processed.
2023-05-24 15:02:36 +01:00
Luca Boccassi f644ea3ed7 ukify: use empty stub for addons
Instead of picking up sd-stub, which is runnable, add an empty
addon stub that just returns an error if executed
2023-05-24 11:09:03 +01:00
Zbigniew Jędrzejewski-Szmek 3f80c1393e test/60-ukify: override stub location in tests
Without this, build would fail if the stub is not available in /usr/lib/.
2023-05-05 18:42:37 +02:00
Jan Janssen b87d6da447 boot: Fix alignment of long long inside structs on x86
On x86 EFI follows the windows ABI, which expects 8-byte aligned long
long. The x86 sysv ELF ABI expects them to be 8-byte aligned when used
alone, but 4-byte aligned when they appear inside of structs:

    struct S {
        int i;
        long long ll;
    };

    // _Static_assert(sizeof(struct S) == 12, "x86 sysv ABI");
    _Static_assert(sizeof(struct S) == 16, "EFI/MS ABI");

To get the behavior we need when building with sysv ELF ABI we need to
pass '-malign-double' to the compiler as done by EDK2.

This in turn will make ubsan unhappy as the stack may not be properly
aligned on entry, so we have to tell the compiler explicitly to re-align
the stack on entry to efi_main.

This fixes loading EFI drivers on x86 that were previously always
rejected as the EFI_LOADED_IMAGE_PROTOCOL had a wrong memory layout.

See also: https://github.com/rhboot/shim/pull/516
2023-04-11 17:09:18 +01:00
Jan Janssen 1e7ff4ba88 boot: Add undefined sanitizer support
Sadly, no stack traces, but this is better than nothing.
2023-03-17 10:39:39 +01:00
Jan Janssen f64f82aa8d boot: Add support for -ftrapv 2023-03-17 10:35:29 +01:00
Jan Janssen 48e1b2c250 boot: Add support for -fstack-protector 2023-03-17 10:35:29 +01:00
Jan Janssen 2c7c68e4e4 meson: Use static library for EFI tests
This also moves them so that fuzz builds do not need pyelftools around.
2023-03-10 11:41:08 +01:00
Jan Janssen c4ad9b23ca boot: Fix debug experience 2023-03-10 11:41:08 +01:00
Jan Janssen 2afeaf1675 boot: Bring back bootloader builds
This adds back sd-boot builds by using meson compile targets directly.
We can do this now, because userspace binaries use the special
dependency that allows us to easily separate flags, so that we don't
pass anything to EFI builds that shouldn't be passed.

Additionally, we pass a bunch of flags to hopefully disable/override any
distro provided flags that should not be used for EFI binaries.

Fixes: #12275
2023-03-10 11:41:08 +01:00
Jan Janssen dfca5587cf tree-wide: Drop gnu-efi
This drops all mentions of gnu-efi and its manual build machinery. A
future commit will bring bootloader builds back. A new bootloader meson
option is now used to control whether to build sd-boot and its userspace
tooling.
2023-03-10 11:41:03 +01:00
Zbigniew Jędrzejewski-Szmek efcde781de meson: adjust for removal of gnu-efi compat
gnu-efi-3.0.11-13.fc39 in Fedora dropped the old include paths.
2023-03-05 19:11:58 +00:00
Jan Janssen e6d7dc9ada boot: Split out device path functions
No code changes aside from renaming path_replace_hd() and making its
parameter take any device path node type.
2023-02-22 21:54:11 +01:00
Jan Janssen 8e760b3fcd boot: Move disk_get_part_uuid into part-discovery.c
Thematically, they are similar and disk.c is awfully small to warrant
the separation.
2023-02-22 21:54:11 +01:00
Yu Watanabe 4788f635e3 Merge pull request #26203 from medhefgo/meson
meson: Use dicts for test/fuzzer definitions
2023-02-22 10:27:16 +09:00
Zbigniew Jędrzejewski-Szmek 377d36898c Merge pull request #26446 from medhefgo/efi-headers
boot: Provide our own EFI API headers
2023-02-21 20:59:33 +01:00
Zbigniew Jędrzejewski-Szmek 1eca770933 efi: drop executable-stack bit from .elf file
An rpminspect test in Fedora/RHEL is flagging our stub files as having an
executable stack. The check is correct:

$ readelf --wide --program-headers build/src/boot/efi/linuxx64.elf.stub | rg -i stack
  GNU_STACK      0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 RWE 0x10

It seems to be just an omission in the linker script… None of the objects that
are linked into the stub are marked as requiring an executable stack:

$ readelf --wide --sections build/src/boot/efi/*.c.o \
  /usr/lib/gnuefi/x64/libgnuefi.a \
  /usr/lib/gnuefi/x64/libefi.a \
  /usr/lib/gcc/x86_64-redhat-linux/12/libgcc.a \
  | rg '.note.GNU-stack.*X'
(nothing)

On aarch64 we end up with a nonexecutable stack, but on ia32 and x64 we get one,
so this might be just a matter of defaults in the linker. It doesn't matter
greatly, but let's mark the stack as non-executable to avoid the warning.

Note: '-Wl,-z' is not needed, things work with just '-z'.
2023-02-21 20:51:47 +01:00
Jan Janssen 2ed35b2f3e meson: Use dicts for fuzzer definitions 2023-02-21 15:10:26 +01:00
Jan Janssen 822cd3ff25 meson: Use dicts for test definitions
Although this slightly more verbose it makes it much easier to reason
about. The code that produces the tests heavily benefits from this.

Test lists are also now sorted by test name.
2023-02-21 15:10:26 +01:00
Jan Janssen 5080a60a71 boot: Provide our own EFI API headers
We want to get away from gnu-efi and the only really usable source of
EFI headers would be EDK2, which is somewhat impractical to use and
quite large to require to be around just for some headers.

As a bonus point, the new headers are safe to be included in userspace
code.

This should not have any behavior changes as it is mostly changing
header includes. There are some renames to conform to standard names
and a few minor device path fixups as the struct is defined slightly
different.

Of note is that this removes usage of uchar.h and wchar.h as they are
not guaranteed to be available in a freestanding environment. Instead
efi.h will provide the needed types.
2023-02-21 14:46:02 +01:00
Luca Boccassi 780b9ae133 Merge pull request #26110 from medhefgo/boot-no-gnu-efi
boot: Stop linking against libefi.a
2023-01-23 23:51:49 +00:00
Callum Farmer 9c100c4e70 boot: Use objcopy with arm64
Binutils 2.38 added support for efi-app-aarch64
Still use binary mode if we have an older objcopy
Add check for incompatible gnu-efi crt0 containing the header section
which gets added by objcopy and if used results in duplicate header
and subsequently a broken binary

Signed-off-by: Callum Farmer <gmbr3@opensuse.org>
2023-01-23 22:52:07 +00:00
Jan Janssen 1d278ad7d4 boot: Stop linking against libefi.a
libefi.a just provided the c helper API that was slowly removed. As we
do not depend on anything provided by it anymore, it is safe to drop
now.

Since the ST/BS/RT pointers are very convenient and needed everywhere,
they are retained and initialized by us.
2023-01-20 21:02:16 +01:00
Jan Janssen 4c0a83a434 boot: Properly strip EFI binaries
Removing debugging related sections is apparently not enough to truely
strip a (PE) binary.
Better late than never. It gets rid of this pesky warning from sbsign:
    warning: data remaining[174080 vs 193173]: gaps between PE/COFF sections?
2023-01-20 17:28:35 +01:00
Jan Janssen c2c6203556 boot: Use printf for error logging
This also drops the _stall suffix in anticipation of the next commit.
2023-01-18 16:50:04 +01:00
Jan Janssen 7c4536a9af boot: Add printf functions 2023-01-18 16:50:04 +01:00
Jan Janssen ba27939274 boot: Detect hypervisors using SMBIOS info
This allows skipping secure boot enrollment wait time on other arches.
2023-01-16 18:51:21 +01:00
Daan De Meyer 1a01473065 boot: Remove -O1 workaround
Now that we have ukify and mkosi has been updated to use it, we
have a solution in place to make sure that PE sections don't overlap
in a UKI so let's drop the workaround to avoid overlapping PE sections.
2023-01-15 20:45:22 +01:00
Zbigniew Jędrzejewski-Szmek 493cd5034c meson: use 0|1 for SD_BOOT
We converted to not using #ifdef for most of our defines because the syntax is
nicer and we are protected against typos and can set -Werror=undef. Let's do
the same for SD_BOOT. The define is nicely hidden in build.h for normal builds,
and for EFI builds we were already setting SD_BOOT on the commandline.
2023-01-10 14:25:57 +01:00
Jan Janssen d84bdadb43 boot: Remove option TPM PCR compat option
It says remove in 2023; happy to oblige.
2023-01-09 09:52:55 +01:00
Jason A. Donenfeld 0a1d8ac77a stub: handle random seed like sd-boot does
sd-stub has an opportunity to handle the seed the same way sd-boot does,
which would have benefits for UKIs when sd-boot is not in use. This
commit wires that up.

It refactors the XBOOTLDR partition discovery to also find the ESP
partition, so that it access the random seed there.
2022-11-23 00:56:45 +01:00
Gerd Hoffmann 8fec4f95be boot: improve support for qemu
systemd-boot expects being loaded from ESP and is quite unhappy in case
the loaded image device path is something else.  When running on qemu
this can easily happen though.  Case one is direct kernel boot, i.e.
loading via 'qemu -kernel systemd-bootx64.efi'.  Case two is sd-boot
being added to the ovmf firmware image and being loaded from there.

This patch detects both cases and goes inspect all file systems known to
the firmware, trying to find the ESP.  When present the
VMMBootOrderNNNN variables are used to inspect the file systems in the
given order.
2022-11-16 12:52:58 +01:00
Jan Janssen 7aa4762ce2 meson: Fix build with --optimization=plain
Note that -O0 is deliberately filtered out as we have to compile with at
least -O1 due to #24202.

Fixes: #24323
2022-10-09 22:15:11 +02:00
Jan Janssen ac37f132a1 fuzz: Add fuzzer for some efi string functions 2022-09-25 14:26:00 +02:00
Jan Janssen e7508839af fuzz-bcd: Do not include bcd.c
This is not needed anymore, so do it the proper way now.
2022-09-25 14:26:00 +02:00
Yu Watanabe 3b51a183af tree-wide: fix typo 2022-09-24 10:43:58 +09:00
Lennart Poettering 6e19a7ce13 Merge pull request #24628 from medhefgo/boot-sections
boot: Try to detect overlapping PE sections
2022-09-23 15:45:28 +02:00
Jan Janssen ba2a105c2b stub: Always use LINUX_INITRD_MEDIA_GUID if available
The kernel PE image version can be used to detect support for this
feature, allowing us to prefer the generic code of the deprecated EFI
handover protocol.
2022-09-20 13:05:41 +02:00
Jan Janssen fa2eebc7a3 boot: Try to detect overlapping PE sections
This should help finding the cause of boot failures because of badly
assembled unified kernel images.
2022-09-10 09:02:35 +02:00
Jan Janssen 4fb6506deb meson: Downgrade efi-ld warning
The warning isn't that serious and mostly there to inform the user that
lld/mold cannot build efi binaries. It is also better to build test with
fatal meson warnings.
2022-08-23 10:26:02 +02:00
Jan Janssen 6a941db798 meson: Test correct efi linker for supported args
Fixes: #24241
2022-08-10 09:44:21 +02:00