Update.
1998-04-07 16:18 Ulrich Drepper <drepper@cygnus.com> * libc.map: Add __asprintf to GLIBC_2.1. * elf/dlerror.c: Use __asprintf, not asprintf. * libio/stdio.h: Declare __asprintf. * stdio-common/asprintf.c: Define as __asprintf and make asprintf a weak alias. * elf/dl-minimal.c: Add definition of strtol and strtoul (und friends) to avoid inclusion from libc_pic.a. * elf/dl-runtime.c: Undo last patch. * stdlib/strtod.c: Don't use mbtowc, use btowc. * sysdeps/i386/dl-machine.h (dl_platform_init): Don't use "i386" as default, use NULL.
This commit is contained in:
parent
6ca96fe202
commit
27a5bb33ac
18
ChangeLog
18
ChangeLog
@ -1,3 +1,21 @@
|
||||
1998-04-07 16:18 Ulrich Drepper <drepper@cygnus.com>
|
||||
|
||||
* libc.map: Add __asprintf to GLIBC_2.1.
|
||||
* elf/dlerror.c: Use __asprintf, not asprintf.
|
||||
* libio/stdio.h: Declare __asprintf.
|
||||
* stdio-common/asprintf.c: Define as __asprintf and make asprintf
|
||||
a weak alias.
|
||||
|
||||
* elf/dl-minimal.c: Add definition of strtol and strtoul (und friends)
|
||||
to avoid inclusion from libc_pic.a.
|
||||
|
||||
* elf/dl-runtime.c: Undo last patch.
|
||||
|
||||
* stdlib/strtod.c: Don't use mbtowc, use btowc.
|
||||
|
||||
* sysdeps/i386/dl-machine.h (dl_platform_init): Don't use "i386"
|
||||
as default, use NULL.
|
||||
|
||||
1998-04-04 Andreas Jaeger <aj@arthur.rhein-neckar.de>
|
||||
|
||||
* resolv/Makefile: Include ../Makeconfig - needed for building
|
||||
|
4
configure
vendored
4
configure
vendored
@ -1634,8 +1634,8 @@ if test -n "$path_binutils"; then
|
||||
path_binutils=`(cd $path_binutils; pwd) | sed 's%/*$%/%'`
|
||||
CC="$CC -B$path_binutils"
|
||||
fi
|
||||
AS=`$CC -print-file-name=as`
|
||||
LD=`$CC -print-file-name=ld`
|
||||
AS=`$CC -print-prog-name=as`
|
||||
LD=`$CC -print-prog-name=ld`
|
||||
|
||||
# Determine whether we are using GNU binutils.
|
||||
echo $ac_n "checking whether $AS is GNU as""... $ac_c" 1>&6
|
||||
|
127
elf/dl-minimal.c
127
elf/dl-minimal.c
@ -18,6 +18,7 @@
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <limits.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
@ -202,3 +203,129 @@ __assert_perror_fail (int errnum,
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* This function is only used in eval.c. */
|
||||
long int
|
||||
weak_function
|
||||
__strtol_internal (const char *nptr, char **endptr, int base, int group)
|
||||
{
|
||||
long int result = 0;
|
||||
long int sign = 1;
|
||||
|
||||
while (*nptr == ' ' || *nptr == '\t')
|
||||
++nptr;
|
||||
|
||||
if (*nptr == '-')
|
||||
{
|
||||
sign = -1;
|
||||
++nptr;
|
||||
}
|
||||
else if (*nptr == '+')
|
||||
++nptr;
|
||||
|
||||
if (*nptr < '0' || *nptr > '9')
|
||||
{
|
||||
if (endptr != NULL)
|
||||
*endptr = (char *) nptr;
|
||||
return 0L;
|
||||
}
|
||||
|
||||
assert (base == 0);
|
||||
if (*nptr == '0')
|
||||
{
|
||||
if (nptr[1] == 'x' || nptr[1] == 'X')
|
||||
{
|
||||
base = 16;
|
||||
nptr += 2;
|
||||
}
|
||||
else
|
||||
base = 8;
|
||||
}
|
||||
else
|
||||
base = 10;
|
||||
|
||||
while (*nptr >= '0' && *nptr <= '9')
|
||||
{
|
||||
long int digval = *nptr - '0';
|
||||
if (result > LONG_MAX / 10
|
||||
|| (result == (sign ? LONG_MAX : LONG_MAX + 1) / 10
|
||||
&& digval > (sign ? LONG_MAX : LONG_MAX + 1) % 10))
|
||||
{
|
||||
errno = ERANGE;
|
||||
return LONG_MAX * sign;
|
||||
}
|
||||
result *= 10;
|
||||
result += digval;
|
||||
}
|
||||
|
||||
return result * sign;
|
||||
}
|
||||
|
||||
long int
|
||||
weak_function
|
||||
strtol (const char *nptr, char **endptr, int base)
|
||||
{
|
||||
return __strtol_internal (nptr, endptr, base, 0);
|
||||
}
|
||||
|
||||
unsigned long int
|
||||
weak_function
|
||||
__strtoul_internal (const char *nptr, char **endptr, int base, int group)
|
||||
{
|
||||
long int result = 0;
|
||||
long int sign = 1;
|
||||
|
||||
while (*nptr == ' ' || *nptr == '\t')
|
||||
++nptr;
|
||||
|
||||
if (*nptr == '-')
|
||||
{
|
||||
sign = -1;
|
||||
++nptr;
|
||||
}
|
||||
else if (*nptr == '+')
|
||||
++nptr;
|
||||
|
||||
if (*nptr < '0' || *nptr > '9')
|
||||
{
|
||||
if (endptr != NULL)
|
||||
*endptr = (char *) nptr;
|
||||
return 0UL;
|
||||
}
|
||||
|
||||
assert (base == 0);
|
||||
if (*nptr == '0')
|
||||
{
|
||||
if (nptr[1] == 'x' || nptr[1] == 'X')
|
||||
{
|
||||
base = 16;
|
||||
nptr += 2;
|
||||
}
|
||||
else
|
||||
base = 8;
|
||||
}
|
||||
else
|
||||
base = 10;
|
||||
|
||||
while (*nptr >= '0' && *nptr <= '9')
|
||||
{
|
||||
long int digval = *nptr - '0';
|
||||
if (result > LONG_MAX / 10
|
||||
|| (result == ULONG_MAX / 10 && digval > ULONG_MAX % 10))
|
||||
{
|
||||
errno = ERANGE;
|
||||
return ULONG_MAX;
|
||||
}
|
||||
result *= 10;
|
||||
result += digval;
|
||||
}
|
||||
|
||||
return result * sign;
|
||||
}
|
||||
|
||||
unsigned long int
|
||||
weak_function
|
||||
strtoul (const char *nptr, char **endptr, int base)
|
||||
{
|
||||
return (unsigned long int) __strtoul_internal (nptr, endptr, base, 0);
|
||||
}
|
||||
|
@ -128,13 +128,13 @@ fixup (
|
||||
{
|
||||
value = _dl_lookup_versioned_symbol(strtab + sym->st_name,
|
||||
&sym, scope, l->l_name,
|
||||
version, DL_LOOKUP_NOPLT);
|
||||
version, ELF_MACHINE_JMP_SLOT);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0:
|
||||
value = _dl_lookup_symbol (strtab + sym->st_name, &sym, scope,
|
||||
l->l_name, DL_LOOKUP_NOPLT);
|
||||
l->l_name, ELF_MACHINE_JMP_SLOT);
|
||||
}
|
||||
|
||||
/* Currently value contains the base load address of the object
|
||||
@ -205,13 +205,13 @@ profile_fixup (
|
||||
value = _dl_lookup_versioned_symbol(strtab + sym->st_name,
|
||||
&sym, scope, l->l_name,
|
||||
version,
|
||||
DL_LOOKUP_NOPLT);
|
||||
ELF_MACHINE_JMP_SLOT);
|
||||
break;
|
||||
}
|
||||
}
|
||||
case 0:
|
||||
value = _dl_lookup_symbol (strtab + sym->st_name, &sym, scope,
|
||||
l->l_name, DL_LOOKUP_NOPLT);
|
||||
l->l_name, ELF_MACHINE_JMP_SLOT);
|
||||
}
|
||||
|
||||
/* Currently value contains the base load address of the object
|
||||
|
@ -72,8 +72,8 @@ dlerror (void)
|
||||
buf = result->errstring;
|
||||
else
|
||||
{
|
||||
if (asprintf (&buf, "%s: %s",
|
||||
result->errstring, strerror (result->errcode)) == -1)
|
||||
if (__asprintf (&buf, "%s: %s",
|
||||
result->errstring, strerror (result->errcode)) == -1)
|
||||
buf = NULL;
|
||||
|
||||
/* We don't need the error string anymore. */
|
||||
|
2
libc.map
2
libc.map
@ -439,7 +439,7 @@ GLIBC_2.1 {
|
||||
__signbit; __signbitf; __signbitl; __libc_sa_len;
|
||||
|
||||
# functions used in other libraries
|
||||
_IO_fclose; _IO_fopen; _IO_fdopen;
|
||||
_IO_fclose; _IO_fopen; _IO_fdopen; __asprintf;
|
||||
__syscall_rt_sigqueueinfo;
|
||||
__xstat64; __fxstat64; __lxstat64;
|
||||
__pread64; __pwrite64;
|
||||
|
@ -310,6 +310,9 @@ extern int vsnprintf __P ((char *__restrict __s, size_t __maxlen,
|
||||
extern int vasprintf __P ((char **__restrict __ptr,
|
||||
__const char *__restrict __f, _G_va_list __arg))
|
||||
__attribute__ ((__format__ (__printf__, 2, 0)));
|
||||
extern int __asprintf __P ((char **__restrict __ptr,
|
||||
__const char *__restrict __fmt, ...))
|
||||
__attribute__ ((__format__ (__printf__, 2, 3)));
|
||||
extern int asprintf __P ((char **__restrict __ptr,
|
||||
__const char *__restrict __fmt, ...))
|
||||
__attribute__ ((__format__ (__printf__, 2, 3)));
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 1991, 1995, 1997 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 1991, 1995, 1997, 1998 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
|
||||
@ -23,7 +23,7 @@
|
||||
allocated with malloc and stored in *STRING_PTR. */
|
||||
/* VARARGS2 */
|
||||
int
|
||||
asprintf (char **string_ptr, const char *format, ...)
|
||||
__asprintf (char **string_ptr, const char *format, ...)
|
||||
{
|
||||
va_list arg;
|
||||
int done;
|
||||
@ -34,3 +34,4 @@ asprintf (char **string_ptr, const char *format, ...)
|
||||
|
||||
return done;
|
||||
}
|
||||
weak_alias (__asprintf, asprintf)
|
||||
|
@ -88,10 +88,12 @@
|
||||
# define LOCALE_PARAM_DECL
|
||||
#endif
|
||||
|
||||
#if defined _LIBC || defined HAVE_WCHAR_H
|
||||
# include <wchar.h>
|
||||
#endif
|
||||
|
||||
#ifdef USE_WIDE_CHAR
|
||||
# include <wctype.h>
|
||||
# include <wchar.h>
|
||||
# define STRING_TYPE wchar_t
|
||||
# define CHAR_TYPE wint_t
|
||||
# define L_(Ch) L##Ch
|
||||
@ -440,7 +442,7 @@ INTERNAL (STRTOF) (nptr, endptr, group LOCALE_PARAM)
|
||||
/* The radix character of the current locale. */
|
||||
wchar_t decimal;
|
||||
/* The thousands character of the current locale. */
|
||||
wchar_t thousands;
|
||||
wchar_t thousands = L'\0';
|
||||
/* The numeric grouping specification of the current locale,
|
||||
in the format described in <locale.h>. */
|
||||
const char *grouping;
|
||||
@ -457,18 +459,17 @@ INTERNAL (STRTOF) (nptr, endptr, group LOCALE_PARAM)
|
||||
else
|
||||
{
|
||||
/* Figure out the thousands separator character. */
|
||||
if (mbtowc (&thousands, _NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP),
|
||||
strlen (_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP))) <= 0)
|
||||
thousands = (wchar_t) *_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP);
|
||||
#if defined _LIBC || defined _HAVE_BTOWC
|
||||
thousands = btowc (*_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP));
|
||||
if (thousands == WEOF)
|
||||
thousands = L'\0';
|
||||
#endif
|
||||
if (thousands == L'\0')
|
||||
grouping = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
grouping = NULL;
|
||||
thousands = L'\0';
|
||||
}
|
||||
grouping = NULL;
|
||||
|
||||
/* Find the locale's decimal point character. */
|
||||
if (mbtowc ((wchar_t *) &decimal, _NL_CURRENT (LC_NUMERIC, DECIMAL_POINT),
|
||||
|
@ -1,5 +1,5 @@
|
||||
/* Convert string representation of a number into an integer value.
|
||||
Copyright (C) 1991, 92, 94, 95, 96, 97 Free Software Foundation, Inc.
|
||||
Copyright (C) 1991, 92, 94, 95, 96, 97, 98 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
|
||||
@ -167,9 +167,11 @@ extern int errno;
|
||||
# define LOCALE_PARAM_DECL
|
||||
#endif
|
||||
|
||||
#if defined _LIBC || defined HAVE_WCHAR_H
|
||||
# include <wchar.h>
|
||||
#endif
|
||||
|
||||
#ifdef USE_WIDE_CHAR
|
||||
# include <wchar.h>
|
||||
# include <wctype.h>
|
||||
# define L_(Ch) L##Ch
|
||||
# define UCHAR_TYPE wint_t
|
||||
@ -247,7 +249,7 @@ INTERNAL (strtol) (nptr, endptr, base, group LOCALE_PARAM)
|
||||
struct locale_data *current = loc->__locales[LC_NUMERIC];
|
||||
# endif
|
||||
/* The thousands character of the current locale. */
|
||||
wchar_t thousands;
|
||||
wchar_t thousands = L'\0';
|
||||
/* The numeric grouping specification of the current locale,
|
||||
in the format described in <locale.h>. */
|
||||
const char *grouping;
|
||||
@ -260,9 +262,11 @@ INTERNAL (strtol) (nptr, endptr, base, group LOCALE_PARAM)
|
||||
else
|
||||
{
|
||||
/* Figure out the thousands separator character. */
|
||||
if (mbtowc (&thousands, _NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP),
|
||||
strlen (_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP))) <= 0)
|
||||
thousands = (wchar_t) *_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP);
|
||||
# if defined _LIBC || defined _HAVE_BTOWC
|
||||
thousands = btowc (*_NL_CURRENT (LC_NUMERIC, THOUSANDS_SEP));
|
||||
if (thousands == WEOF)
|
||||
thousands = L'\0';
|
||||
# endif
|
||||
if (thousands == L'\0')
|
||||
grouping = NULL;
|
||||
}
|
||||
@ -299,23 +303,19 @@ INTERNAL (strtol) (nptr, endptr, base, group LOCALE_PARAM)
|
||||
else
|
||||
negative = 0;
|
||||
|
||||
if (base == 16 && s[0] == L_('0') && TOUPPER (s[1]) == L_('X'))
|
||||
s += 2;
|
||||
|
||||
/* If BASE is zero, figure it out ourselves. */
|
||||
if (base == 0)
|
||||
if (*s == L_('0'))
|
||||
{
|
||||
if (TOUPPER (s[1]) == L_('X'))
|
||||
{
|
||||
s += 2;
|
||||
base = 16;
|
||||
}
|
||||
else
|
||||
base = 8;
|
||||
}
|
||||
else
|
||||
base = 10;
|
||||
/* Recognize number prefix and if BASE is zero, figure it out ourselves. */
|
||||
if (*s == L_('0'))
|
||||
{
|
||||
if (TOUPPER (s[1]) == L_('X'))
|
||||
{
|
||||
s += 2;
|
||||
base = 16;
|
||||
}
|
||||
else if (base == 0)
|
||||
base = 8;
|
||||
}
|
||||
else if (base == 0)
|
||||
base = 10;
|
||||
|
||||
/* Save the pointer so we can check later if anything happened. */
|
||||
save = s;
|
||||
@ -396,7 +396,7 @@ INTERNAL (strtol) (nptr, endptr, base, group LOCALE_PARAM)
|
||||
}
|
||||
|
||||
/* Return the result of the appropriate sign. */
|
||||
return (negative ? -i : i);
|
||||
return negative ? -i : i;
|
||||
|
||||
noconv:
|
||||
/* We must handle a special case here: the base is 0 or 16 and the
|
||||
|
@ -274,11 +274,8 @@ extern const char *_dl_platform;
|
||||
static inline void __attribute__ ((unused))
|
||||
dl_platform_init (void)
|
||||
{
|
||||
if (_dl_platform == NULL)
|
||||
/* We default to i386 since all instructions understood by the i386
|
||||
are also understood by later processors. */
|
||||
_dl_platform = "i386";
|
||||
else if (*_dl_platform == '\0')
|
||||
if (_dl_platform != NULL && *_dl_platform == '\0')
|
||||
/* Avoid an empty string which would disturb us. */
|
||||
_dl_platform = NULL;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user