From: Jan Janssen Date: Sat, 7 Jan 2023 08:19:23 +0000 (+0100) Subject: boot: Do not use errno.h/inttypes.h X-Git-Tag: v254-rc1~1201^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3ceaa05d566f178ccfdc6ba180e0e63f96216d87;p=thirdparty%2Fsystemd.git boot: Do not use errno.h/inttypes.h These are provided by libc instead of the compiler and are not supposed to be used in freestanding environments. When cross-compiling with clang and the corresponding gcc cross-toolchain is not around, clang may pick up the wrong header from the host system. --- diff --git a/src/boot/efi/boot.c b/src/boot/efi/boot.c index 79cb36c717a..e409168aa43 100644 --- a/src/boot/efi/boot.c +++ b/src/boot/efi/boot.c @@ -1,7 +1,5 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ -#include - #include "bcd.h" #include "bootspec-fundamental.h" #include "console.h" diff --git a/src/boot/efi/efi-string.h b/src/boot/efi/efi-string.h index ea9493bcbb2..6b6b0d57b46 100644 --- a/src/boot/efi/efi-string.h +++ b/src/boot/efi/efi-string.h @@ -121,6 +121,32 @@ _gnu_printf_(2, 0) _warn_unused_result_ char16_t *xvasprintf_status(EFI_STATUS s # define printf(...) printf_status(EFI_SUCCESS, __VA_ARGS__) # define xasprintf(...) xasprintf_status(EFI_SUCCESS, __VA_ARGS__) +/* inttypes.h is provided by libc instead of the compiler and is not supposed to be used in freestanding + * environments. We could use clang __*_FMT*__ constants for this, bug gcc does not have them. :( */ + +# if defined(__ILP32__) +# define PRI64_PREFIX "ll" +# elif defined(__LP64__) +# define PRI64_PREFIX "l" +# elif defined(__LLP64__) || (__SIZEOF_LONG__ == 4 && __SIZEOF_POINTER__ == 8) +# define PRI64_PREFIX "ll" +# else +# error Unknown 64-bit data model +# endif + +# define PRIi32 "i" +# define PRIu32 "u" +# define PRIx32 "x" +# define PRIX32 "X" +# define PRIiPTR "zi" +# define PRIuPTR "zu" +# define PRIxPTR "zx" +# define PRIXPTR "zX" +# define PRIi64 PRI64_PREFIX "i" +# define PRIu64 PRI64_PREFIX "u" +# define PRIx64 PRI64_PREFIX "x" +# define PRIX64 PRI64_PREFIX "X" + /* The compiler normally has knowledge about standard functions such as memcmp, but this is not the case when * compiling with -ffreestanding. By referring to builtins, the compiler can check arguments and do * optimizations again. Note that we still need to provide implementations as the compiler is free to not diff --git a/src/boot/efi/util.c b/src/boot/efi/util.c index 48b30a8f5a5..3166944b03f 100644 --- a/src/boot/efi/util.c +++ b/src/boot/efi/util.c @@ -1,7 +1,5 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ -#include - #include "proto/device-path.h" #include "proto/simple-text-io.h" #include "ticks.h" diff --git a/src/fundamental/efivars-fundamental.h b/src/fundamental/efivars-fundamental.h index cf785f8b7de..3bad79b0363 100644 --- a/src/fundamental/efivars-fundamental.h +++ b/src/fundamental/efivars-fundamental.h @@ -1,7 +1,11 @@ /* SPDX-License-Identifier: LGPL-2.1-or-later */ #pragma once -#include +#ifdef SD_BOOT +# define EINVAL 22 +#else +# include +#endif #include "string-util-fundamental.h" /* Features of the loader, i.e. systemd-boot */