public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
From: "Frédéric Bérat" <fberat@redhat.com>
To: libc-alpha@sourceware.org
Cc: siddhesh@gotplt.org, fberat@redhat.com,
	Carlos O'Donell <carlos@redhat.com>
Subject: [PATCH v6 05/14] stdio: Ensure *_chk routines have their hidden builtin definition available
Date: Wed,  5 Jul 2023 16:38:11 +0200	[thread overview]
Message-ID: <20230705143822.275049-6-fberat@redhat.com> (raw)
In-Reply-To: <20230705143822.275049-1-fberat@redhat.com>

If libc_hidden_builtin_{def,proto} isn't properly set for *_chk routines,
there are unwanted PLT entries in libc.so.

There is a special case with __asprintf_chk:
If ldbl_* macros are used for asprintf, ABI gets broken on s390x,
if it isn't, ppc64le isn't building due to multiple asm redirections.

This is due to the inclusion of bits/stdio-lbdl.h for ppc64le whereas it
isn't for s390x. This header creates redirections, which are not
compatible with the ones generated using libc_hidden_def.
Yet, we can't use libc_hidden_ldbl_proto on s390x since it will not
create a simple strong alias (e.g. as done on x86_64), but a versioned
alias, leading to ABI breakage.

This results in errors on s390x:
/usr/bin/ld: glibc/iconv/../libio/bits/stdio2.h:137: undefined reference
to `__asprintf_chk'

Original __asprintf_chk symbols:
00000000001395b0 T __asprintf_chk
0000000000177e90 T __nldbl___asprintf_chk

__asprintf_chk symbols with ldbl_* macros:
000000000012d590 t ___asprintf_chk
000000000012d590 t __asprintf_chk@@GLIBC_2.4
000000000012d590 t __GI___asprintf_chk
000000000012d590 t __GL____asprintf_chk___asprintf_chk
0000000000172240 T __nldbl___asprintf_chk

__asprintf_chk symbols with the patch:
000000000012d590 t ___asprintf_chk
000000000012d590 T __asprintf_chk
000000000012d590 t __GI___asprintf_chk
0000000000172240 T __nldbl___asprintf_chk

Reviewed-by: Carlos O'Donell <carlos@redhat.com>
---
 debug/asprintf_chk.c                           | 18 +++++++++++++++++-
 debug/fgets_u_chk.c                            |  1 +
 debug/fprintf_chk.c                            |  1 +
 debug/sprintf_chk.c                            |  1 +
 include/stdio.h                                | 13 ++++++++++++-
 .../ldbl-128ibm-compat/ieee128-asprintf_chk.c  |  1 +
 .../ldbl-128ibm-compat/ieee128-fprintf_chk.c   |  1 +
 .../ldbl-128ibm-compat/ieee128-sprintf_chk.c   |  1 +
 .../ldbl-128ibm-compat/ieee128-vsprintf_chk.c  |  1 +
 9 files changed, 36 insertions(+), 2 deletions(-)

diff --git a/debug/asprintf_chk.c b/debug/asprintf_chk.c
index 651c2cd76b..e233d5d737 100644
--- a/debug/asprintf_chk.c
+++ b/debug/asprintf_chk.c
@@ -22,7 +22,7 @@
 /* Write formatted output from FORMAT to a string which is
    allocated with malloc and stored in *STRING_PTR.  */
 int
-__asprintf_chk (char **result_ptr, int flag, const char *format, ...)
+___asprintf_chk (char **result_ptr, int flag, const char *format, ...)
 {
   /* For flag > 0 (i.e. __USE_FORTIFY_LEVEL > 1) request that %n
      can only come from read-only format strings.  */
@@ -36,3 +36,19 @@ __asprintf_chk (char **result_ptr, int flag, const char *format, ...)
 
   return ret;
 }
+#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 (___asprintf_chk, __asprintf_chk)
+ldbl_strong_alias (___asprintf_chk, __asprintf_chk)
+#else
+/* On some systems introduction of ldbl_* macros lead to ABI breakage due to the
+ * long_double_symbol aliasing, e.g. on s390x:
+ * /usr/bin/ld: glibc/iconv/../libio/bits/stdio2.h:137: undefined reference to
+ * `__asprintf_chk'
+ * Due to __asprintf_chk@@GLIBC_2.4 alias replacing __asprintf_chk.
+ */
+strong_alias (___asprintf_chk, __asprintf_chk)
+libc_hidden_def (__asprintf_chk)
+#endif
diff --git a/debug/fgets_u_chk.c b/debug/fgets_u_chk.c
index a16ba655e6..74275381f5 100644
--- a/debug/fgets_u_chk.c
+++ b/debug/fgets_u_chk.c
@@ -56,3 +56,4 @@ __fgets_unlocked_chk (char *buf, size_t size, int n, FILE *fp)
   fp->_flags |= old_error;
   return result;
 }
+libc_hidden_builtin_def (__fgets_unlocked_chk)
diff --git a/debug/fprintf_chk.c b/debug/fprintf_chk.c
index b57d538d03..273051ef91 100644
--- a/debug/fprintf_chk.c
+++ b/debug/fprintf_chk.c
@@ -35,4 +35,5 @@ ___fprintf_chk (FILE *fp, int flag, const char *format, ...)
 
   return ret;
 }
+ldbl_hidden_def (___fprintf_chk, __fprintf_chk)
 ldbl_strong_alias (___fprintf_chk, __fprintf_chk)
diff --git a/debug/sprintf_chk.c b/debug/sprintf_chk.c
index b27f4afae8..e45f1e7b3b 100644
--- a/debug/sprintf_chk.c
+++ b/debug/sprintf_chk.c
@@ -42,4 +42,5 @@ ___sprintf_chk (char *s, int flag, size_t slen, const char *format, ...)
 
   return ret;
 }
+ldbl_hidden_def (___sprintf_chk, __sprintf_chk)
 ldbl_strong_alias (___sprintf_chk, __sprintf_chk)
diff --git a/include/stdio.h b/include/stdio.h
index da47d1ce99..6755877911 100644
--- a/include/stdio.h
+++ b/include/stdio.h
@@ -276,7 +276,18 @@ extern FILE *__open_memstream (char **, size_t *) __THROW __wur;
 libc_hidden_proto (__open_memstream)
 libc_hidden_proto (__libc_fatal)
 rtld_hidden_proto (__libc_fatal)
-libc_hidden_proto (__vsprintf_chk)
+
+libc_hidden_proto (__fgets_unlocked_chk)
+
+#if defined __LDBL_COMPAT || __LDOUBLE_REDIRECTS_TO_FLOAT128_ABI == 1
+libc_hidden_ldbl_proto (__asprintf_chk)
+#else
+libc_hidden_proto (__asprintf_chk)
+#endif
+
+libc_hidden_ldbl_proto (__fprintf_chk)
+libc_hidden_ldbl_proto (__sprintf_chk)
+libc_hidden_ldbl_proto (__vsprintf_chk)
 
 extern FILE * __fmemopen (void *buf, size_t len, const char *mode);
 libc_hidden_proto (__fmemopen)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf_chk.c
index fbf953a728..6e93ee81fc 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-asprintf_chk.c
@@ -35,4 +35,5 @@ ___ieee128___asprintf_chk (char **string_ptr, int flag, const char *format, ...)
 
   return done;
 }
+hidden_def (___ieee128___asprintf_chk)
 strong_alias (___ieee128___asprintf_chk, __asprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fprintf_chk.c
index bd10e9c3db..e0865b6663 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-fprintf_chk.c
@@ -35,4 +35,5 @@ ___ieee128___fprintf_chk (FILE *fp, int flag, const char *format, ...)
 
   return done;
 }
+hidden_def (___ieee128___fprintf_chk)
 strong_alias (___ieee128___fprintf_chk, __fprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-sprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-sprintf_chk.c
index 0039c3b53d..762757a5c7 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-sprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-sprintf_chk.c
@@ -43,4 +43,5 @@ ___ieee128___sprintf_chk (char *s, int flag, size_t slen,
 
   return done;
 }
+hidden_def (___ieee128___sprintf_chk)
 strong_alias (___ieee128___sprintf_chk, __sprintf_chkieee128)
diff --git a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsprintf_chk.c b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsprintf_chk.c
index 22137269c0..c251b60d4e 100644
--- a/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsprintf_chk.c
+++ b/sysdeps/ieee754/ldbl-128ibm-compat/ieee128-vsprintf_chk.c
@@ -35,4 +35,5 @@ ___ieee128___vsprintf_chk (char *string, int flag, size_t slen,
 
   return __vsprintf_internal (string, slen, format, ap, mode);
 }
+hidden_def (___ieee128___vsprintf_chk)
 strong_alias (___ieee128___vsprintf_chk, __vsprintf_chkieee128)
-- 
2.41.0


  parent reply	other threads:[~2023-07-05 14:38 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-07-05 14:38 [PATCH v6 00/14] Allow glibc to be built with _FORTIFY_SOURCE Frédéric Bérat
2023-07-05 14:38 ` [PATCH v6 01/14] " Frédéric Bérat
2023-07-05 14:41   ` Siddhesh Poyarekar
2023-07-05 14:38 ` [PATCH v6 02/14] Exclude routines from fortification Frédéric Bérat
2023-07-05 14:38 ` [PATCH v6 03/14] sysdeps: Ensure ieee128*_chk routines to be properly named Frédéric Bérat
2023-07-05 14:38 ` [PATCH v6 04/14] string: Ensure *_chk routines have their hidden builtin definition available Frédéric Bérat
2023-07-05 14:38 ` Frédéric Bérat [this message]
2023-07-05 14:38 ` [PATCH v6 06/14] misc/sys/cdefs.h: Create FORTIFY redirects for internal calls Frédéric Bérat
2023-07-05 14:38 ` [PATCH v6 07/14] wchar: Avoid PLT entries with _FORTIFY_SOURCE Frédéric Bérat
2023-07-05 14:38 ` [PATCH v6 08/14] posix/bits/unistd.h: Clearly separate declaration from definitions Frédéric Bérat
2023-07-05 14:38 ` [PATCH v6 09/14] unistd: Avoid PLT entries with _FORTIFY_SOURCE Frédéric Bérat
2023-07-05 14:38 ` [PATCH v6 10/14] misc/bits/select2.h: Clearly separate declaration from definitions Frédéric Bérat
2023-07-05 14:38 ` [PATCH v6 11/14] misc/bits/syslog.h: Clearly separate declaration from definition Frédéric Bérat
2023-07-05 14:38 ` [PATCH v6 12/14] libio/bits/stdio2.h: Clearly separate declaration from definitions Frédéric Bérat
2023-07-05 14:38 ` [PATCH v6 13/14] libio/bits/stdio2-decl.h: Avoid PLT entries with _FORTIFY_SOURCE Frédéric Bérat
2023-07-05 14:38 ` [PATCH v6 14/14] sysdeps/ieee754/ldbl-128ibm-compat: Fix warn unused result Frédéric Bérat
2023-07-06 13:15 ` [PATCH v6 00/14] Allow glibc to be built with _FORTIFY_SOURCE Andreas Schwab
2023-07-06 13:41   ` Frederic Berat
2023-07-06 13:46     ` Andreas Schwab
2023-07-10  5:57   ` Frederic Berat
2023-07-06 13:38 ` Andreas Schwab
2023-07-10  5:56   ` Frederic Berat
2023-07-11  8:44 ` Andreas Schwab
2023-07-12 13:35   ` Frederic Berat
2023-07-12 13:38     ` Andreas Schwab
2023-07-12 13:42       ` Frederic Berat

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230705143822.275049-6-fberat@redhat.com \
    --to=fberat@redhat.com \
    --cc=carlos@redhat.com \
    --cc=libc-alpha@sourceware.org \
    --cc=siddhesh@gotplt.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).