mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-30 00:31:08 +00:00
45ae17dd7e
Tweak the PLT bypass magic when building glibc with long double redirects. This is made more difficult by the fact we only get one chance to redirect functions. This happens via the public headers. There are roughly three classes of redirect we need to attend to today: 1. Simple redirects, redirected via cdef macro overrides and and new libc_hidden_ldbl_proto macro. 2. Internal usage of internal API, e.g __snprintf, which has no direct analogue. This is bypassed directly on case-by- case basis. 3. Double redirects, e.g sscanf and related. These require a heavier handed approach of macro renaming to existing symbols. Most simple redirects are handled via 1. Ideally, the libc_* macro would live in libc-symbols.h, but in practice the macros needed for it to do anything useful live in cdefs.h, so they are defined in the local override. Notably, the internal name of the asprintf generated for ieee ldbl redirects is renamed to work with internal prefixed usage. This resolves the local plt usage introduced when building glibc with ldbl == ieee128 on ppc64le. Reviewed-by: Tulio Magno Quites Machado Filho <tuliom@linux.ibm.com>
41 lines
1.3 KiB
C
41 lines
1.3 KiB
C
/* Wrapper for __isoc99_sscanf. IEEE128 version.
|
|
Copyright (C) 2019-2020 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 <strfile.h>
|
|
#include <libioP.h>
|
|
|
|
extern int
|
|
___ieee128_isoc99_sscanf (const char *string, const char *format, ...)
|
|
{
|
|
va_list arg;
|
|
int done;
|
|
int mode_flags = SCANF_ISOC99_A | SCANF_LDBL_USES_FLOAT128;
|
|
|
|
_IO_strfile sf;
|
|
FILE *fp = _IO_strfile_read (&sf, string);
|
|
|
|
va_start (arg, format);
|
|
done = __vfscanf_internal (fp, format, arg, mode_flags);
|
|
va_end (arg);
|
|
|
|
return done;
|
|
}
|
|
strong_alias (___ieee128_isoc99_sscanf, __isoc99_sscanfieee128)
|
|
hidden_def (___ieee128_isoc99_sscanf)
|