diff --git a/debug/Makefile b/debug/Makefile
index c6c1069b..765720a1 100644
--- a/debug/Makefile
+++ b/debug/Makefile
@@ -31,6 +31,7 @@ headers	:= execinfo.h
 routines = \
   $(static-only-routines) \
   ____longjmp_chk \
+  aprintf_chk \
   asprintf_chk \
   backtrace \
   backtracesyms \
@@ -94,6 +95,7 @@ routines = \
   strncpy_chk \
   swprintf_chk \
   ttyname_r_chk \
+  vaprintf_chk \
   vasprintf_chk \
   vdprintf_chk \
   vfprintf_chk \
@@ -143,6 +145,8 @@ CFLAGS-sprintf_chk.c += $(libio-mtsafe)
 CFLAGS-snprintf_chk.c += $(libio-mtsafe)
 CFLAGS-vsprintf_chk.c += $(libio-mtsafe)
 CFLAGS-vsnprintf_chk.c += $(libio-mtsafe)
+CFLAGS-aprintf_chk.c += $(libio-mtsafe)
+CFLAGS-vaprintf_chk.c += $(libio-mtsafe)
 CFLAGS-asprintf_chk.c += $(libio-mtsafe)
 CFLAGS-vasprintf_chk.c += $(libio-mtsafe)
 CFLAGS-obprintf_chk.c += $(libio-mtsafe)
diff --git a/debug/Versions b/debug/Versions
index fc818d29..d87148f5 100644
--- a/debug/Versions
+++ b/debug/Versions
@@ -71,6 +71,9 @@ libc {
   GLIBC_2.43 {
     __memset_explicit_chk;
   }
+  GLIBC_2.44 {
+    __aprintf_chk; __vaprintf_chk;
+  }
   GLIBC_PRIVATE {
     __fortify_fail;
   }
diff --git a/debug/aprintf_chk.c b/debug/aprintf_chk.c
new file mode 100644
index 00000000..30f7811f
--- /dev/null
+++ b/debug/aprintf_chk.c
@@ -0,0 +1,51 @@
+/* Copyright (C) 2026 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <stdarg.h>
+#include <libio/libioP.h>
+
+
+/* Write formatted output from FORMAT to a string allocated with malloc.  */
+char *
+___aprintf_chk (int flag, const char *fmt, ...)
+{
+  /* For flag > 0 (i.e. __USE_FORTIFY_LEVEL > 1) request that %n
+     can only come from read-only format strings.  */
+  unsigned int mode = (flag > 0) ? PRINTF_FORTIFY : 0;
+  va_list ap;
+  char *p;
+
+  va_start (ap, fmt);
+  if (__vasprintf_internal (&p, fmt, ap, mode) < 0)
+    p = NULL;
+  va_end (ap);
+
+  return p;
+}
+#if defined __LDBL_COMPAT || __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
+/* This is needed since <bits/stdio-lbdl.h> is included in this case, leading to
+ * multiple asm redirection of the same symbol
+ */
+ldbl_hidden_def (___aprintf_chk, __aprintf_chk)
+ldbl_strong_alias (___aprintf_chk, __aprintf_chk)
+#else
+/* On some systems introduction of ldbl_* macros lead to ABI breakage due to the
+ * long_double_symbol aliasing.
+ */
+strong_alias (___aprintf_chk, __aprintf_chk)
+libc_hidden_def (__aprintf_chk)
+#endif
diff --git a/debug/vaprintf_chk.c b/debug/vaprintf_chk.c
new file mode 100644
index 00000000..1ca96633
--- /dev/null
+++ b/debug/vaprintf_chk.c
@@ -0,0 +1,39 @@
+/* Copyright (C) 2026 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.
+
+   As a special exception, if you link the code in this file with
+   files compiled with a GNU compiler to produce an executable,
+   that does not cause the resulting executable to be covered by
+   the GNU Lesser General Public License.  This exception does not
+   however invalidate any other reasons why the executable file
+   might be covered by the GNU Lesser General Public License.
+   This exception applies to code released by its copyright holders
+   in files containing the exception.  */
+
+#include <libio/libioP.h>
+
+char *
+__vaprintf_chk (int flag, const char *fmt, va_list ap)
+{
+  /* For flag > 0 (i.e. __USE_FORTIFY_LEVEL > 1) request that %n
+     can only come from read-only format strings.  */
+  unsigned int mode = (flag > 0) ? PRINTF_FORTIFY : 0;
+  char *p;
+
+  return __vasprintf_internal (&p, fmt, ap, mode) < 0 ? NULL : p;
+}
+libc_hidden_def (__vaprintf_chk)
diff --git a/include/stdio.h b/include/stdio.h
index 88166993..cfdec368 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -77,6 +77,11 @@ extern int __vfprintf_chk (FILE *, int, const char *, __gnuc_va_list);
 stdio_hidden_ldbl_proto (__, vfprintf_chk)
 extern char *__fgets_unlocked_chk (char *buf, size_t size, int n, FILE *fp);
 extern char *__fgets_chk (char *buf, size_t size, int n, FILE *fp);
+extern char *__aprintf_chk (int, const char *, ...)
+     __THROW __attribute_malloc__;
+extern char *__vaprintf_chk (int, const char *, __gnuc_va_list)
+     __THROW __attribute_malloc__;
+stdio_hidden_ldbl_proto (__, vaprintf_chk)
 extern int __asprintf_chk (char **, int, const char *, ...) __THROW;
 extern int __vasprintf_chk (char **, int, const char *, __gnuc_va_list) __THROW;
 stdio_hidden_ldbl_proto (__, vasprintf_chk)
@@ -239,6 +244,7 @@ extern const size_t _sys_errlist_internal_len attribute_hidden;
 extern const char *__get_errlist (int) attribute_hidden;
 extern const char *__get_errname (int) attribute_hidden;
 
+libc_hidden_ldbl_proto (__aprintf)
 libc_hidden_ldbl_proto (__asprintf)
 
 #  if IS_IN (libc)
@@ -317,8 +323,10 @@ rtld_hidden_proto (__libc_fatal)
 libc_hidden_proto (__fgets_unlocked_chk)
 
 #if defined __LDBL_COMPAT || __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
+libc_hidden_ldbl_proto (__aprintf_chk)
 libc_hidden_ldbl_proto (__asprintf_chk)
 #else
+libc_hidden_proto (__aprintf_chk)
 libc_hidden_proto (__asprintf_chk)
 #endif
 
diff --git a/libio/Makefile b/libio/Makefile
index 08e1e0ec..b345f806 100644
--- a/libio/Makefile
+++ b/libio/Makefile
@@ -43,7 +43,7 @@ routines	:=							      \
 									      \
 	clearerr feof ferror fileno fputc freopen fseek getc getchar	      \
 	memstream pclose putc putchar rewind setbuf setlinebuf vasprintf      \
-	iovdprintf vscanf vsnprintf obprintf fcloseall fseeko ftello	      \
+	vaprintf iovdprintf vscanf vsnprintf obprintf fcloseall fseeko ftello \
 	freopen64 fseeko64 ftello64					      \
 									      \
 	__fbufsize __freading __fwriting __freadable __fwritable __flbf	      \
@@ -62,6 +62,7 @@ routines_no_fortify += \
   iofgetws_u \
   iovdprintf \
   swprintf \
+  vaprintf \
   vasprintf \
   vsnprintf \
   vswprintf \
@@ -89,6 +90,7 @@ tests = \
   test-fmemopen \
   test-fputs-unbuffered-full \
   test-fputws-unbuffered-full \
+  tst-aprintf \
   tst-asprintf-null \
   tst-atime \
   tst-bz22415 \
diff --git a/libio/Versions b/libio/Versions
index b91a7bc9..48ffe3d3 100644
--- a/libio/Versions
+++ b/libio/Versions
@@ -155,6 +155,9 @@ libc {
     # f*
     fmemopen;
   }
+  GLIBC_2.44 {
+    vaprintf;
+  }
   GLIBC_PRIVATE {
     # Used by NPTL and librt
     __libc_fatal;
diff --git a/libio/bits/stdio-ldbl.h b/libio/bits/stdio-ldbl.h
index 3cbff14e..3b805b3e 100644
--- a/libio/bits/stdio-ldbl.h
+++ b/libio/bits/stdio-ldbl.h
@@ -99,6 +99,9 @@ __LDBL_REDIR_DECL (dprintf)
 #endif
 
 #ifdef __USE_GNU
+__LDBL_REDIR_DECL (vaprintf)
+__LDBL_REDIR2_DECL (aprintf)
+__LDBL_REDIR_DECL (aprintf)
 __LDBL_REDIR_DECL (vasprintf)
 __LDBL_REDIR2_DECL (asprintf)
 __LDBL_REDIR_DECL (asprintf)
@@ -123,6 +126,8 @@ __LDBL_REDIR2_DECL (dprintf_chk)
 __LDBL_REDIR2_DECL (vdprintf_chk)
 #  endif
 #  ifdef __USE_GNU
+__LDBL_REDIR2_DECL (aprintf_chk)
+__LDBL_REDIR2_DECL (vaprintf_chk)
 __LDBL_REDIR2_DECL (asprintf_chk)
 __LDBL_REDIR2_DECL (vasprintf_chk)
 __LDBL_REDIR2_DECL (obstack_printf_chk)
diff --git a/libio/bits/stdio2-decl.h b/libio/bits/stdio2-decl.h
index ada092ea..cf52c46c 100644
--- a/libio/bits/stdio2-decl.h
+++ b/libio/bits/stdio2-decl.h
@@ -66,6 +66,14 @@ extern int __vdprintf_chk (int __fd, int __flag,
 
 # ifdef __USE_GNU
 
+extern char *__aprintf_chk (int __flag,
+			   const char *__restrict __fmt, ...)
+     __THROW __attribute__ ((__format__ (__printf__, 2, 3)))
+     __attribute_malloc__;
+extern char *__vaprintf_chk (int __flag,
+			    const char *__restrict __fmt, __gnuc_va_list __ap)
+     __THROW __attribute__ ((__format__ (__printf__, 2, 0)))
+     __attribute_malloc__;
 extern int __asprintf_chk (char **__restrict __ptr, int __flag,
 			   const char *__restrict __fmt, ...)
      __THROW __attribute__ ((__format__ (__printf__, 3, 4))) __wur;
diff --git a/libio/bits/stdio2.h b/libio/bits/stdio2.h
index 193494db..b9fed67e 100644
--- a/libio/bits/stdio2.h
+++ b/libio/bits/stdio2.h
@@ -200,6 +200,18 @@ vdprintf (int __fd, const char *__restrict __fmt, __gnuc_va_list __ap)
 
 # ifdef __USE_GNU
 #  ifdef __va_arg_pack
+__fortify_function char *
+__NTH (aprintf (const char *__restrict __fmt, ...))
+{
+  return __aprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack ());
+}
+
+__fortify_function char *
+__NTH (__aprintf (const char *__restrict __fmt, ...))
+{
+  return __aprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __va_arg_pack ());
+}
+
 __fortify_function int
 __NTH (asprintf (char **__restrict __ptr, const char *__restrict __fmt, ...))
 {
@@ -223,6 +235,26 @@ __NTH (obstack_printf (struct obstack *__restrict __obstack,
 			       __va_arg_pack ());
 }
 #  elif __fortify_use_clang
+__fortify_function char *
+__NTH (aprintf (const char *__restrict __fmt, ...))
+{
+  __gnuc_va_list __fortify_ap;
+  __builtin_va_start (__fortify_ap, __fmt);
+  char * __p = __vaprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __fortify_ap);
+  __builtin_va_end (__fortify_ap);
+  return __p;
+}
+
+__fortify_function char *
+__NTH (__aprintf (const char *__restrict __fmt, ...))
+{
+  __gnuc_va_list __fortify_ap;
+  __builtin_va_start (__fortify_ap, __fmt);
+  char *__p = __vaprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __fortify_ap);
+  __builtin_va_end (__fortify_ap);
+  return __p;
+}
+
 __fortify_function_error_function __attribute_overloadable__ int
 __NTH (asprintf (__fortify_clang_overload_arg (char **, __restrict, __ptr),
 		 const char *__restrict __fmt, ...))
@@ -260,6 +292,10 @@ __NTH (obstack_printf (__fortify_clang_overload_arg (struct obstack *,
   return __r;
 }
 #  elif !defined __cplusplus
+#   define aprintf(...) \
+  __aprintf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
+#   define __aprintf(...) \
+  __aprintf_chk (__USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
 #   define asprintf(ptr, ...) \
   __asprintf_chk (ptr, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
 #   define __asprintf(ptr, ...) \
@@ -268,6 +304,12 @@ __NTH (obstack_printf (__fortify_clang_overload_arg (struct obstack *,
   __obstack_printf_chk (obstack, __USE_FORTIFY_LEVEL - 1, __VA_ARGS__)
 #  endif
 
+__fortify_function char *
+__NTH (vaprintf (const char *__restrict __fmt, __gnuc_va_list __ap))
+{
+  return __vaprintf_chk (__USE_FORTIFY_LEVEL - 1, __fmt, __ap);
+}
+
 __fortify_function int
 __NTH (vasprintf (char **__restrict __ptr, const char *__restrict __fmt,
 		  __gnuc_va_list __ap))
diff --git a/libio/stdio.h b/libio/stdio.h
index 3bf6a1f6..81d7176c 100644
--- a/libio/stdio.h
+++ b/libio/stdio.h
@@ -412,6 +412,19 @@ extern int asprintf (char **__restrict __ptr,
      __THROWNL __attribute__ ((__format__ (__printf__, 2, 3))) __wur;
 #endif
 
+#ifdef __USE_GNU
+/* Write formatted output to a string dynamically allocated with `malloc'.  */
+extern char *vaprintf (const char *__restrict __fmt, __gnuc_va_list __ap)
+     __THROWNL __attribute__ ((__format__ (__printf__, 1, 0)))
+     __attribute_malloc__;
+extern char *__aprintf (const char *__restrict __fmt, ...)
+     __THROWNL __attribute__ ((__format__ (__printf__, 1, 2)))
+     __attribute_malloc__;
+extern char *aprintf (const char *__restrict __fmt, ...)
+     __THROWNL __attribute__ ((__format__ (__printf__, 1, 2)))
+     __attribute_malloc__;
+#endif
+
 #ifdef __USE_XOPEN2K8
 /* Write formatted output to a file descriptor.  */
 extern int vdprintf (int __fd, const char *__restrict __fmt,
diff --git a/libio/tst-aprintf.c b/libio/tst-aprintf.c
new file mode 100644
index 00000000..e10eb591
--- /dev/null
+++ b/libio/tst-aprintf.c
@@ -0,0 +1,57 @@
+/* Test aprintf.
+   Copyright (C) 2026 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <errno.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <support/check.h>
+#include <sys/resource.h>
+
+static int
+do_test (void)
+{
+  char *buf;
+
+  /* Success */
+  buf = aprintf ("foo %d", 42);
+  TEST_COMPARE_STRING (buf, "foo 42");
+  free(buf);
+
+  {
+    /* Avoid -Wformat-overflow warning.  */
+    const char *volatile format = "%2000000000d %2000000000d";
+    buf = aprintf (format, 1, 2);
+    TEST_VERIFY (buf == NULL);
+  }
+  if (errno != ENOMEM)
+    TEST_COMPARE (errno, EOVERFLOW);
+
+  /* Force ENOMEM in the test below.  */
+  struct rlimit rl;
+  TEST_COMPARE (getrlimit (RLIMIT_AS, &rl), 0);
+  rl.rlim_cur = 10 * 1024 * 1024;
+  TEST_COMPARE (setrlimit (RLIMIT_AS, &rl), 0);
+
+  buf = aprintf ("%20000000d", 1);
+  TEST_VERIFY (buf == NULL);
+  TEST_COMPARE (errno, ENOMEM);
+
+  return 0;
+}
+
+#include <support/test-driver.c>
diff --git a/libio/vaprintf.c b/libio/vaprintf.c
new file mode 100644
index 00000000..157f783d
--- /dev/null
+++ b/libio/vaprintf.c
@@ -0,0 +1,39 @@
+/* Copyright (C) 2026 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.
+
+   As a special exception, if you link the code in this file with
+   files compiled with a GNU compiler to produce an executable,
+   that does not cause the resulting executable to be covered by
+   the GNU Lesser General Public License.  This exception does not
+   however invalidate any other reasons why the executable file
+   might be covered by the GNU Lesser General Public License.
+   This exception applies to code released by its copyright holders
+   in files containing the exception.  */
+
+#include <libioP.h>
+#include <stdarg.h>
+#include <stddef.h>
+#include <stdio.h>
+
+char *
+__vaprintf (const char *fmt, va_list ap)
+{
+  char *p;
+
+  return __vasprintf_internal (&p, fmt, ap, 0) < 0 ? NULL : p;
+}
+ldbl_weak_alias (__vaprintf, vaprintf)
diff --git a/manual/stdio.texi b/manual/stdio.texi
index c01feaed..e7deca78 100644
--- a/manual/stdio.texi
+++ b/manual/stdio.texi
@@ -2578,6 +2578,32 @@ other systems offer this function as an async-signal-safe alternative to
 The functions in this section do formatted output and place the results
 in dynamically allocated memory.
 
+@deftypefun {char *} aprintf (const char *@var{template}, @dots{})
+@standards{GNU, stdio.h}
+@safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
+This function is similar to @code{sprintf},
+except that it dynamically allocates a string
+(as with @code{malloc}; @pxref{Unconstrained Allocation})
+to hold the output,
+instead of putting the output in a buffer you allocate in advance.
+A successful call to @code{aprintf} returns
+a pointer to the newly allocated string.
+
+Here is how to use @code{aprintf}
+to get the same result as the @code{snprintf} example,
+but more easily:
+
+@smallexample
+/* @r{Construct a message describing the value of a variable}
+   @r{whose name is @var{name} and whose value is @var{value}.} */
+char *
+make_message (char *name, char *value)
+@{
+  return aprintf ("value of %s is %s", name, value);
+@}
+@end smallexample
+@end deftypefun
+
 @deftypefun int asprintf (char **@var{ptr}, const char *@var{template}, @dots{})
 @standards{GNU, stdio.h}
 @safety{@prelim{}@mtsafe{@mtslocale{}}@asunsafe{@ascuheap{}}@acunsafe{@acsmem{}}}
diff --git a/stdio-common/Makefile b/stdio-common/Makefile
index 21094483..9a26773e 100644
--- a/stdio-common/Makefile
+++ b/stdio-common/Makefile
@@ -89,6 +89,7 @@ routines := \
   _fitoa_word \
   _itoa \
   _itowa \
+  aprintf \
   asprintf \
   ctermid \
   cuserid \
@@ -177,6 +178,7 @@ routines := \
 
 # Exclude fortified routines from being built with _FORTIFY_SOURCE
 routines_no_fortify += \
+  aprintf \
   asprintf \
   dprintf \
   fprintf \
diff --git a/stdio-common/Versions b/stdio-common/Versions
index 8e1cbf85..aee611b2 100644
--- a/stdio-common/Versions
+++ b/stdio-common/Versions
@@ -70,6 +70,8 @@ libc {
     __isoc23_vfscanf;
     __isoc23_sscanf;
     __isoc23_vsscanf;
+  GLIBC_2.44 {
+    aprintf;
   }
   GLIBC_PRIVATE {
     # global variables
diff --git a/stdio-common/aprintf.c b/stdio-common/aprintf.c
new file mode 100644
index 00000000..bee49667
--- /dev/null
+++ b/stdio-common/aprintf.c
@@ -0,0 +1,40 @@
+/* Copyright (C) 2026 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <stdarg.h>
+#include <libioP.h>
+
+/* Write formatted output from FORMAT to a string which is
+   allocated with malloc.  */
+/* VARARGS1 */
+char *
+___aprintf (const char *fmt, ...)
+{
+  char *p;
+  va_list ap;
+
+  va_start (ap, fmt);
+  if (__vasprintf_internal (&p, fmt, ap, 0) < 0)
+    p = NULL;
+  va_end (ap);
+
+  return p;
+}
+ldbl_hidden_def (___aprintf, __aprintf)
+
+ldbl_strong_alias (___aprintf, __aprintf)
+ldbl_weak_alias (___aprintf, aprintf)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
index 10ae73db..e0989a51 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/Makefile
@@ -5,6 +5,7 @@ ldbl-extra-routines += fwscanf \
 		       swscanf \
 		       swprintf \
 		       wscanf \
+		       vaprintf \
 		       vasprintf \
 		       vdprintf \
 		       vscanf \
@@ -40,6 +41,7 @@ endif
 
 ifeq ($(subdir),stdio-common)
 ldbl-extra-routines += printf_size \
+		       aprintf \
 		       asprintf \
 		       dprintf \
 		       fprintf \
@@ -250,12 +252,14 @@ $(objpfx)test-printf-size-ibm128.out: \
 endif
 
 ifeq ($(subdir),debug)
-ldbl-extra-routines += asprintf_chk \
+ldbl-extra-routines += aprintf_chk \
+		       asprintf_chk \
 		       dprintf_chk \
 		       fprintf_chk \
 		       printf_chk \
 		       snprintf_chk \
 		       sprintf_chk \
+		       vaprintf_chk \
 		       vasprintf_chk \
 		       vdprintf_chk \
 		       vfprintf_chk \
@@ -480,6 +484,7 @@ endif
 routines += $(foreach r,$(ldbl-extra-routines),ieee128-$(r))
 
 routines_no_fortify += \
+  ieee128-aprintf \
   ieee128-asprintf \
   ieee128-dprintf \
   ieee128-fprintf \
@@ -490,6 +495,7 @@ routines_no_fortify += \
   ieee128-sprintf \
   ieee128-swprintf \
   ieee128-syslog \
+  ieee128-vaprintf \
   ieee128-vasprintf \
   ieee128-vdprintf \
   ieee128-vfprintf \
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-aprintf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-aprintf.c
new file mode 100644
index 00000000..041ebc01
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-aprintf.c
@@ -0,0 +1,36 @@
+/* Wrapper for aprintf.  IEEE128 version.
+   Copyright (C) 2026 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <stdarg.h>
+#include <libio/libioP.h>
+
+extern char *
+___ieee128___aprintf (const char *fmt, ...)
+{
+  va_list ap;
+  char *p;
+
+  va_start (ap, fmt);
+  if (__vasprintf_internal (&p, fmt, ap, PRINTF_LDBL_USES_FLOAT128) < 0)
+    p = NULL;
+  va_end (ap);
+
+  return p;
+}
+hidden_def (___ieee128___aprintf)
+strong_alias (___ieee128___aprintf, __aprintfieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-aprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-aprintf_chk.c
new file mode 100644
index 00000000..0e1e395d
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-aprintf_chk.c
@@ -0,0 +1,40 @@
+/* Wrapper for __aprintf_chk.  IEEE128 version.
+   Copyright (C) 2026 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <stdarg.h>
+#include <libio/libioP.h>
+
+extern char *
+___ieee128___aprintf_chk (int flag, const char *fmt, ...)
+{
+  va_list ap;
+  char *p;
+
+  unsigned int mode = PRINTF_LDBL_USES_FLOAT128;
+  if (flag > 0)
+    mode |= PRINTF_FORTIFY;
+
+  va_start (ap, fmt);
+  if (__vasprintf_internal (&p, fmt, ap, mode) < 0)
+    p = NULL;
+  va_end (ap);
+
+  return p;
+}
+hidden_def (___ieee128___aprintf_chk)
+strong_alias (___ieee128___aprintf_chk, __aprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vaprintf.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vaprintf.c
new file mode 100644
index 00000000..6157f306
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vaprintf.c
@@ -0,0 +1,29 @@
+/* Wrapper for vaprintf.  IEEE128 version.
+   Copyright (C) 2026 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <libio/libioP.h>
+
+extern char *
+___ieee128_vaprintf (const char *fmt, va_list ap)
+{
+  char *p;
+  if (__vasprintf_internal (&p, fmt, ap, PRINTF_LDBL_USES_FLOAT128) < 0)
+    p = NULL;
+  return p;
+}
+strong_alias (___ieee128_vaprintf, __vaprintfieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vaprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vaprintf_chk.c
new file mode 100644
index 00000000..4fd0ca8c
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vaprintf_chk.c
@@ -0,0 +1,31 @@
+/* Wrapper for __vaprintf_chk.  IEEE128 version.
+   Copyright (C) 2026 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#include <libio/libioP.h>
+
+extern char *
+___ieee128___vaprintf_chk (int flag, const char *fmt, va_list ap)
+{
+  char *p;
+  unsigned int mode = PRINTF_LDBL_USES_FLOAT128;
+  if (flag > 0)
+    mode |= PRINTF_FORTIFY;
+
+  return __vasprintf_internal (&p, fmt, ap, mode) < 0 ? NULL : p;
+}
+strong_alias (___ieee128___vaprintf_chk, __vaprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-opt/Makefile b/sysdeps/ieee754/ldbl-opt/Makefile
index ef7da1f8..3effc4ef 100644
--- a/sysdeps/ieee754/ldbl-opt/Makefile
+++ b/sysdeps/ieee754/ldbl-opt/Makefile
@@ -15,6 +15,8 @@ libnldbl-calls = \
   acos \
   acosh \
   acospi \
+  aprintf \
+  aprintf_chk \
   asin \
   asinh \
   asinpi \
@@ -223,6 +225,8 @@ libnldbl-calls = \
   trunc \
   ufromfp \
   ufromfpx \
+  vaprintf \
+  vaprintf_chk \
   vasprintf \
   vasprintf_chk \
   vdprintf \
@@ -556,6 +560,7 @@ CFLAGS-tst-nldbl-wscanf-binary-gnu89.c += -mlong-double-64 -std=gnu89 \
 endif
 
 routines_no_fortify += \
+  nldbl-aprintf \
   nldbl-asprintf \
   nldbl-dprintf \
   nldbl-fprintf \
@@ -567,6 +572,7 @@ routines_no_fortify += \
   nldbl-sprintf \
   nldbl-swprintf \
   nldbl-syslog \
+  nldbl-vaprintf \
   nldbl-vasprintf \
   nldbl-vdprintf \
   nldbl-vfprintf \
diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-aprintf.c b/sysdeps/ieee754/ldbl-opt/nldbl-aprintf.c
new file mode 100644
index 00000000..fe250c03
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-opt/nldbl-aprintf.c
@@ -0,0 +1,17 @@
+#include "nldbl-compat.h"
+
+attribute_hidden
+char *
+__aprintf (const char *fmt, ...)
+{
+  va_list ap;
+  char *p;
+
+  va_start (ap, fmt);
+  p = __nldbl_vaprintf (fmt, ap);
+  va_end (ap);
+
+  return p;
+}
+extern __typeof (__aprintf) aprintf attribute_hidden;
+weak_alias (__aprintf, aprintf)
diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-aprintf_chk.c b/sysdeps/ieee754/ldbl-opt/nldbl-aprintf_chk.c
new file mode 100644
index 00000000..77b1d221
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-opt/nldbl-aprintf_chk.c
@@ -0,0 +1,15 @@
+#include "nldbl-compat.h"
+
+attribute_hidden
+char *
+__aprintf_chk (int flag, const char *fmt, ...)
+{
+  va_list ap;
+  char *p;
+
+  va_start (ap, fmt);
+  p = __nldbl___vaprintf_chk (flag, fmt, ap);
+  va_end (ap);
+
+  return p;
+}
diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-vaprintf.c b/sysdeps/ieee754/ldbl-opt/nldbl-vaprintf.c
new file mode 100644
index 00000000..6ba7789c
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-opt/nldbl-vaprintf.c
@@ -0,0 +1,9 @@
+#include "nldbl-compat.h"
+
+attribute_hidden
+weak_function
+char *
+vaprintf (const char *fmt, va_list ap)
+{
+  return __nldbl_vaprintf (fmt, ap);
+}
diff --git a/sysdeps/ieee754/ldbl-opt/nldbl-vaprintf_chk.c b/sysdeps/ieee754/ldbl-opt/nldbl-vaprintf_chk.c
new file mode 100644
index 00000000..72e4fca7
--- /dev/null
+++ b/sysdeps/ieee754/ldbl-opt/nldbl-vaprintf_chk.c
@@ -0,0 +1,8 @@
+#include "nldbl-compat.h"
+
+attribute_hidden
+char *
+__vaprintf_chk (int flag, const char *fmt, va_list ap)
+{
+  return __nldbl___vaprintf_chk (flag, fmt, ap);
+}
