[PATCH v4 05/15] stdio: Ensure *_chk routines have their hidden builtin definition available
Carlos O'Donell
carlos@redhat.com
Wed Jul 5 12:12:25 GMT 2023
On 7/4/23 12:55, Frédéric Bérat via Libc-alpha wrote:
> 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.
OK.
> 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.
LGTM. I would like to see this move forward for the release. We are in the release
freeze.
Reviewed-by: Carlos O'Donell <carlos@redhat.com>
> 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
> ---
> 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, ...)
OK. Adds extra underscore to differentiate the redirects.
> {
> /* 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)
OK.
> +#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)
OK.
> 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)
OK.
> 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)
OK.
> 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)
OK.
>
> 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)
OK.
> 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)
OK.
> 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)
OK.
> 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)
OK.
> strong_alias (___ieee128___vsprintf_chk, __vsprintf_chkieee128)
--
Cheers,
Carlos.
More information about the Libc-alpha
mailing list