From 8d0938c9de034ec550927ed1c58bbaf2ec9a5930 Mon Sep 17 00:00:00 2001 From: Luna Nova Date: Sat, 4 Oct 2025 19:41:46 -0700 Subject: [PATCH] minimal-bootstrap.musl11: add stdio_flush_on_exit.patch, drop always-flush.patch The upstream version of this patch has been commented out since 913e70d77b67722a5b3bd42f21b9ea4cc02046e9, due to error: implicit declaration of function '__stdio_exit' Revived this approach by updating the patch to forward declare. --- .../linux/minimal-bootstrap/musl/1.1.nix | 7 +- .../minimal-bootstrap/musl/always-flush.patch | 12 ---- .../musl/stdio_flush_on_exit.patch | 71 +++++++++++++++++++ 3 files changed, 75 insertions(+), 15 deletions(-) delete mode 100644 pkgs/os-specific/linux/minimal-bootstrap/musl/always-flush.patch create mode 100644 pkgs/os-specific/linux/minimal-bootstrap/musl/stdio_flush_on_exit.patch diff --git a/pkgs/os-specific/linux/minimal-bootstrap/musl/1.1.nix b/pkgs/os-specific/linux/minimal-bootstrap/musl/1.1.nix index fc762a956aa2..b14082365652 100644 --- a/pkgs/os-specific/linux/minimal-bootstrap/musl/1.1.nix +++ b/pkgs/os-specific/linux/minimal-bootstrap/musl/1.1.nix @@ -54,9 +54,10 @@ let url = "${liveBootstrap}/patches/sigsetjmp.patch"; hash = "sha256-wd2Aev1zPJXy3q933aiup5p1IMKzVJBquAyl3gbK4PU="; }) - # HACK: always flush stdio immediately - # Do not remove atm, gcc 4.6 does not build without this patch applied. - ./always-flush.patch + # liveBootstrap/sysa/musl-1.1.24/patches/stdio_flush_on_exit.patch with forward declarations added + # to avoid `error: implicit declaration of function '__stdio_exit'` + # Required to fix buffered stdout being truncated on exit + ./stdio_flush_on_exit.patch (fetchurl { url = "${liveBootstrap}/patches/va_list.patch"; hash = "sha256-UmcMIl+YCi3wIeVvjbsCyqFlkyYsM4ECNwTfXP+s7vg="; diff --git a/pkgs/os-specific/linux/minimal-bootstrap/musl/always-flush.patch b/pkgs/os-specific/linux/minimal-bootstrap/musl/always-flush.patch deleted file mode 100644 index cdeddf962d9d..000000000000 --- a/pkgs/os-specific/linux/minimal-bootstrap/musl/always-flush.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git src/env/__libc_start_main.c src/env/__libc_start_main.c -index 8fbe526..9476c22 100644 ---- src/env/__libc_start_main.c -+++ src/env/__libc_start_main.c -@@ -91,6 +91,7 @@ static int libc_start_main_stage2(int (*main)(int,char **,char **), int argc, ch - __libc_start_init(); - - /* Pass control to the application */ -+ setbuf(stdout, NULL); - exit(main(argc, argv, envp)); - return 0; - } diff --git a/pkgs/os-specific/linux/minimal-bootstrap/musl/stdio_flush_on_exit.patch b/pkgs/os-specific/linux/minimal-bootstrap/musl/stdio_flush_on_exit.patch new file mode 100644 index 000000000000..145c13b29611 --- /dev/null +++ b/pkgs/os-specific/linux/minimal-bootstrap/musl/stdio_flush_on_exit.patch @@ -0,0 +1,71 @@ +Initial patch version retrieved from +https://git.stikonas.eu/andrius/live-bootstrap/src/commit/cd361e63f77842d9780303d63382eb686843c76b/sysa/musl-1.1.24/patches/stdio_flush_on_exit.patch + +SPDX-FileCopyrightText: 2021 Paul Dersey +SPDX-FileCopyrightText: 2025 Luna Nova + +SPDX-License-Identifier: MIT + +Make sure real __stdio_exit() is called on exit and not the dummy +noop versions. This fixes the issue of truncated output when redirecting +output to a file or pipe. It also fixes truncated output on programs +that forget to call fclose() + +Adds forward declarations to avoid implicit declaration error. + +diff --git a/src/exit/exit.c b/src/exit/exit.c +index a6869b37..a4164682 100644 +--- src/exit/exit.c ++++ src/exit/exit.c +@@ -2,16 +2,10 @@ + #include + #include "libc.h" + +-static void dummy() +-{ +-} +- +-/* atexit.c and __stdio_exit.c override these. the latter is linked +- * as a consequence of linking either __toread.c or __towrite.c. */ +-weak_alias(dummy, __funcs_on_exit); +-weak_alias(dummy, __stdio_exit); +-weak_alias(dummy, _fini); ++void __funcs_on_exit(void); ++void __stdio_exit(void); ++void _fini(void); + + extern weak hidden void (*const __fini_array_start)(void), (*const __fini_array_end)(void); + + static void libc_exit_fini(void) +diff --git a/src/internal/stdio_impl.h b/src/internal/stdio_impl.h +index d7398f59..69141813 100644 +--- src/internal/stdio_impl.h ++++ src/internal/stdio_impl.h +@@ -47,9 +47,9 @@ struct _IO_FILE { + struct __locale_struct *locale; + }; + +-extern hidden FILE *volatile __stdin_used; +-extern hidden FILE *volatile __stdout_used; +-extern hidden FILE *volatile __stderr_used; ++extern FILE *volatile __stdin_used; ++extern FILE *volatile __stdout_used; ++extern FILE *volatile __stderr_used; + + hidden int __lockfile(FILE *); + hidden void __unlockfile(FILE *); +diff --git a/src/stdio/__stdio_exit.c b/src/stdio/__stdio_exit.c +index a5e42c67..5947a141 100644 +--- src/stdio/__stdio_exit.c ++++ src/stdio/__stdio_exit.c +@@ -1,10 +1,5 @@ + #include "stdio_impl.h" + +-static FILE *volatile dummy_file = 0; +-weak_alias(dummy_file, __stdin_used); +-weak_alias(dummy_file, __stdout_used); +-weak_alias(dummy_file, __stderr_used); +- + static void close_file(FILE *f) + { + if (!f) return;