mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-21 20:40:05 +00:00
stdio: Ensure *_chk routines have their hidden builtin definition available
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>
This commit is contained in:
parent
dd8486ffc1
commit
505c884aeb
@ -22,7 +22,7 @@
|
|||||||
/* Write formatted output from FORMAT to a string which is
|
/* Write formatted output from FORMAT to a string which is
|
||||||
allocated with malloc and stored in *STRING_PTR. */
|
allocated with malloc and stored in *STRING_PTR. */
|
||||||
int
|
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
|
/* For flag > 0 (i.e. __USE_FORTIFY_LEVEL > 1) request that %n
|
||||||
can only come from read-only format strings. */
|
can only come from read-only format strings. */
|
||||||
@ -36,3 +36,19 @@ __asprintf_chk (char **result_ptr, int flag, const char *format, ...)
|
|||||||
|
|
||||||
return ret;
|
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
|
||||||
|
@ -56,3 +56,4 @@ __fgets_unlocked_chk (char *buf, size_t size, int n, FILE *fp)
|
|||||||
fp->_flags |= old_error;
|
fp->_flags |= old_error;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
libc_hidden_builtin_def (__fgets_unlocked_chk)
|
||||||
|
@ -35,4 +35,5 @@ ___fprintf_chk (FILE *fp, int flag, const char *format, ...)
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
ldbl_hidden_def (___fprintf_chk, __fprintf_chk)
|
||||||
ldbl_strong_alias (___fprintf_chk, __fprintf_chk)
|
ldbl_strong_alias (___fprintf_chk, __fprintf_chk)
|
||||||
|
@ -42,4 +42,5 @@ ___sprintf_chk (char *s, int flag, size_t slen, const char *format, ...)
|
|||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
ldbl_hidden_def (___sprintf_chk, __sprintf_chk)
|
||||||
ldbl_strong_alias (___sprintf_chk, __sprintf_chk)
|
ldbl_strong_alias (___sprintf_chk, __sprintf_chk)
|
||||||
|
@ -276,7 +276,18 @@ extern FILE *__open_memstream (char **, size_t *) __THROW __wur;
|
|||||||
libc_hidden_proto (__open_memstream)
|
libc_hidden_proto (__open_memstream)
|
||||||
libc_hidden_proto (__libc_fatal)
|
libc_hidden_proto (__libc_fatal)
|
||||||
rtld_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);
|
extern FILE * __fmemopen (void *buf, size_t len, const char *mode);
|
||||||
libc_hidden_proto (__fmemopen)
|
libc_hidden_proto (__fmemopen)
|
||||||
|
@ -35,4 +35,5 @@ ___ieee128___asprintf_chk (char **string_ptr, int flag, const char *format, ...)
|
|||||||
|
|
||||||
return done;
|
return done;
|
||||||
}
|
}
|
||||||
|
hidden_def (___ieee128___asprintf_chk)
|
||||||
strong_alias (___ieee128___asprintf_chk, __asprintf_chkieee128)
|
strong_alias (___ieee128___asprintf_chk, __asprintf_chkieee128)
|
||||||
|
@ -35,4 +35,5 @@ ___ieee128___fprintf_chk (FILE *fp, int flag, const char *format, ...)
|
|||||||
|
|
||||||
return done;
|
return done;
|
||||||
}
|
}
|
||||||
|
hidden_def (___ieee128___fprintf_chk)
|
||||||
strong_alias (___ieee128___fprintf_chk, __fprintf_chkieee128)
|
strong_alias (___ieee128___fprintf_chk, __fprintf_chkieee128)
|
||||||
|
@ -43,4 +43,5 @@ ___ieee128___sprintf_chk (char *s, int flag, size_t slen,
|
|||||||
|
|
||||||
return done;
|
return done;
|
||||||
}
|
}
|
||||||
|
hidden_def (___ieee128___sprintf_chk)
|
||||||
strong_alias (___ieee128___sprintf_chk, __sprintf_chkieee128)
|
strong_alias (___ieee128___sprintf_chk, __sprintf_chkieee128)
|
||||||
|
@ -35,4 +35,5 @@ ___ieee128___vsprintf_chk (char *string, int flag, size_t slen,
|
|||||||
|
|
||||||
return __vsprintf_internal (string, slen, format, ap, mode);
|
return __vsprintf_internal (string, slen, format, ap, mode);
|
||||||
}
|
}
|
||||||
|
hidden_def (___ieee128___vsprintf_chk)
|
||||||
strong_alias (___ieee128___vsprintf_chk, __vsprintf_chkieee128)
|
strong_alias (___ieee128___vsprintf_chk, __vsprintf_chkieee128)
|
||||||
|
Loading…
Reference in New Issue
Block a user