mirror of
https://sourceware.org/git/glibc.git
synced 2024-11-23 01:33:36 +08:00
2005-12-13 Ulrich Drepper <drepper@redhat.com>
This commit is contained in:
parent
d1dc39a44e
commit
b6ab06cef4
13
Makeconfig
13
Makeconfig
@ -622,14 +622,15 @@ endif # $(+cflags) == ""
|
||||
+cflags := $(sort $(+cflags))
|
||||
|
||||
|
||||
# These are flags given to the C compiler to tell it to look for include
|
||||
# files (including ones given in angle brackets) in the current directory,
|
||||
# in the parent library source directory and in the include directory.
|
||||
# These are flags given to the C compiler to tell it to look for
|
||||
# include files (including ones given in angle brackets) in the parent
|
||||
# library source directory, in the include directory, and in the
|
||||
# current directory.
|
||||
# `+sysdep-includes' will be defined by Makerules.
|
||||
+includes = -I$(..)include -I. \
|
||||
$(patsubst %/,-I%,$(objpfx)) $(patsubst %/,-I%,$(..)) \
|
||||
+includes = -I$(..)include $(patsubst %/,-I%,$(..)) \
|
||||
$(libio-include) $(includes) \
|
||||
$(+sysdep-includes) $(sysincludes)
|
||||
$(+sysdep-includes) $(sysincludes) -I. \
|
||||
$(patsubst %/,-I%,$(objpfx))
|
||||
|
||||
# Since libio has several internal header files, we use a -I instead
|
||||
# of many little headers in the include directory.
|
||||
|
95
Makerules
95
Makerules
@ -208,53 +208,6 @@ before-compile += $(gen-as-const-headers:%.sym=$(common-objpfx)%.h)
|
||||
# later directory would be chosen over a .c file in an earlier directory,
|
||||
# which does not preserve the desired sysdeps ordering behavior.
|
||||
|
||||
# It matters that this set of rules, for compiling from sources in
|
||||
# the current directory (the $srcdir/$subdir) come before the
|
||||
# generated sysdep rules in included from sysd-rules below. When
|
||||
# compiling in the source tree, generated sources go into the current
|
||||
# directory, and those should be chosen before any sources in sysdeps.
|
||||
define o-iterator-doit
|
||||
$(objpfx)%$o: %.S $(before-compile); $$(compile-command.S)
|
||||
endef
|
||||
object-suffixes-left := $(all-object-suffixes)
|
||||
include $(o-iterator)
|
||||
|
||||
define o-iterator-doit
|
||||
$(objpfx)%$o: %.s $(before-compile); $$(compile-command.s)
|
||||
endef
|
||||
object-suffixes-left := $(all-object-suffixes)
|
||||
include $(o-iterator)
|
||||
|
||||
define o-iterator-doit
|
||||
$(objpfx)%$o: %.c $(before-compile); $$(compile-command.c)
|
||||
endef
|
||||
object-suffixes-left := $(all-object-suffixes)
|
||||
include $(o-iterator)
|
||||
|
||||
# Omit the objpfx rules when building in the source tree, because
|
||||
# objpfx is empty and so these rules just override the ones above.
|
||||
ifdef objpfx
|
||||
# Define first rules to find the source files in $(objpfx).
|
||||
# Generated source files will end up there.
|
||||
define o-iterator-doit
|
||||
$(objpfx)%$o: $(objpfx)%.S $(before-compile); $$(compile-command.S)
|
||||
endef
|
||||
object-suffixes-left := $(all-object-suffixes)
|
||||
include $(o-iterator)
|
||||
|
||||
define o-iterator-doit
|
||||
$(objpfx)%$o: $(objpfx)%.s $(before-compile); $$(compile-command.s)
|
||||
endef
|
||||
object-suffixes-left := $(all-object-suffixes)
|
||||
include $(o-iterator)
|
||||
|
||||
define o-iterator-doit
|
||||
$(objpfx)%$o: $(objpfx)%.c $(before-compile); $$(compile-command.c)
|
||||
endef
|
||||
object-suffixes-left := $(all-object-suffixes)
|
||||
include $(o-iterator)
|
||||
endif
|
||||
|
||||
# System-dependent makefiles can put in `inhibit-sysdep-asm' wildcard
|
||||
# patterns matching sysdep directories whose assembly source files should
|
||||
# be suppressed.
|
||||
@ -304,6 +257,7 @@ $(+sysdir_pfx)sysd-rules: $(+sysdir_pfx)config.make $(..)Makerules \
|
||||
echo "\$$(objpfx)m_%.S: $$dir/s_%.S; \$$(+make-include-of-dep)"; \
|
||||
echo "\$$(objpfx)m_%.c: $$dir/s_%.c; \$$(+make-include-of-dep)"; \
|
||||
done; \
|
||||
echo "\$$(objpfx)m_%.c: s_%.c; \$$(+make-include-of-dep)"; \
|
||||
echo 'sysd-rules-done = t') > $@T
|
||||
mv -f $@T $@
|
||||
|
||||
@ -318,6 +272,53 @@ echo '#include <$<>' > $@T
|
||||
mv -f $@T $@
|
||||
endef
|
||||
|
||||
# It matters that this set of rules, for compiling from sources in
|
||||
# the current directory (the $srcdir/$subdir) come before the
|
||||
# generated sysdep rules in included from sysd-rules below. When
|
||||
# compiling in the source tree, generated sources go into the current
|
||||
# directory, and those should be chosen before any sources in sysdeps.
|
||||
define o-iterator-doit
|
||||
$(objpfx)%$o: %.S $(before-compile); $$(compile-command.S)
|
||||
endef
|
||||
object-suffixes-left := $(all-object-suffixes)
|
||||
include $(o-iterator)
|
||||
|
||||
define o-iterator-doit
|
||||
$(objpfx)%$o: %.s $(before-compile); $$(compile-command.s)
|
||||
endef
|
||||
object-suffixes-left := $(all-object-suffixes)
|
||||
include $(o-iterator)
|
||||
|
||||
define o-iterator-doit
|
||||
$(objpfx)%$o: %.c $(before-compile); $$(compile-command.c)
|
||||
endef
|
||||
object-suffixes-left := $(all-object-suffixes)
|
||||
include $(o-iterator)
|
||||
|
||||
# Omit the objpfx rules when building in the source tree, because
|
||||
# objpfx is empty and so these rules just override the ones above.
|
||||
ifdef objpfx
|
||||
# Define first rules to find the source files in $(objpfx).
|
||||
# Generated source files will end up there.
|
||||
define o-iterator-doit
|
||||
$(objpfx)%$o: $(objpfx)%.S $(before-compile); $$(compile-command.S)
|
||||
endef
|
||||
object-suffixes-left := $(all-object-suffixes)
|
||||
include $(o-iterator)
|
||||
|
||||
define o-iterator-doit
|
||||
$(objpfx)%$o: $(objpfx)%.s $(before-compile); $$(compile-command.s)
|
||||
endef
|
||||
object-suffixes-left := $(all-object-suffixes)
|
||||
include $(o-iterator)
|
||||
|
||||
define o-iterator-doit
|
||||
$(objpfx)%$o: $(objpfx)%.c $(before-compile); $$(compile-command.c)
|
||||
endef
|
||||
object-suffixes-left := $(all-object-suffixes)
|
||||
include $(o-iterator)
|
||||
endif
|
||||
|
||||
# Generate version maps, but wait until sysdep-subdirs is known
|
||||
ifeq ($(sysd-sorted-done),t)
|
||||
ifeq ($(versioning),yes)
|
||||
|
32
bare/brdinit.c
Normal file
32
bare/brdinit.c
Normal file
@ -0,0 +1,32 @@
|
||||
/* Copyright (C) 1994, 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil),
|
||||
On-Line Applications Research Corporation.
|
||||
|
||||
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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <standalone.h>
|
||||
|
||||
/* This file is only required when a "bare" board is configured. */
|
||||
|
||||
/* _Board_Initialize
|
||||
|
||||
This routine normally performs board specific initialization. */
|
||||
|
||||
void
|
||||
_Board_Initialize ()
|
||||
{
|
||||
}
|
42
bare/console.c
Normal file
42
bare/console.c
Normal file
@ -0,0 +1,42 @@
|
||||
/* Copyright (C) 1994, 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Joel Sherrill (jsherril@redstone-emh2.army.mil),
|
||||
On-Line Applications Research Corporation.
|
||||
|
||||
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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <standalone.h>
|
||||
|
||||
/* This file is only required when a "bare" board is configured. */
|
||||
|
||||
/* These routines provide console IO routines for your embedded target. */
|
||||
|
||||
int
|
||||
_Console_Putc (ch)
|
||||
char ch;
|
||||
{
|
||||
/* eat the character */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
_Console_Getc (poll)
|
||||
int poll;
|
||||
{
|
||||
/* boring user, never types anything */
|
||||
return -1;
|
||||
}
|
102
csu/check_fds.c
Normal file
102
csu/check_fds.c
Normal file
@ -0,0 +1,102 @@
|
||||
/* Copyright (C) 2000, 2002, 2003, 2005 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <paths.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/sysmacros.h>
|
||||
|
||||
/* Try to get a machine dependent instruction which will make the
|
||||
program crash. This is used in case everything else fails. */
|
||||
#include <abort-instr.h>
|
||||
#ifndef ABORT_INSTRUCTION
|
||||
/* No such instruction is available. */
|
||||
# define ABORT_INSTRUCTION
|
||||
#endif
|
||||
|
||||
#include <device-nrs.h>
|
||||
#include <not-cancel.h>
|
||||
|
||||
|
||||
/* Should other OSes (e.g., Hurd) have different versions which can
|
||||
be written in a better way? */
|
||||
static void
|
||||
check_one_fd (int fd, int mode)
|
||||
{
|
||||
/* Note that fcntl() with this parameter is not a cancellation point. */
|
||||
if (__builtin_expect (__libc_fcntl (fd, F_GETFD), 0) == -1
|
||||
&& errno == EBADF)
|
||||
{
|
||||
const char *name;
|
||||
dev_t dev;
|
||||
|
||||
/* For writable descriptors we use /dev/full. */
|
||||
if ((mode & O_ACCMODE) == O_WRONLY)
|
||||
{
|
||||
name = _PATH_DEV "full";
|
||||
dev = makedev (DEV_FULL_MAJOR, DEV_FULL_MINOR);
|
||||
}
|
||||
else
|
||||
{
|
||||
name = _PATH_DEVNULL;
|
||||
dev = makedev (DEV_NULL_MAJOR, DEV_NULL_MINOR);
|
||||
}
|
||||
|
||||
/* Something is wrong with this descriptor, it's probably not
|
||||
opened. Open /dev/null so that the SUID program we are
|
||||
about to start does not accidently use this descriptor. */
|
||||
int nullfd = open_not_cancel (name, mode, 0);
|
||||
|
||||
/* We are very paranoid here. With all means we try to ensure
|
||||
that we are actually opening the /dev/null device and nothing
|
||||
else.
|
||||
|
||||
Note that the following code assumes that STDIN_FILENO,
|
||||
STDOUT_FILENO, STDERR_FILENO are the three lowest file
|
||||
decsriptor numbers, in this order. */
|
||||
struct stat64 st;
|
||||
if (__builtin_expect (nullfd != fd, 0)
|
||||
|| __builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0) != 0
|
||||
|| __builtin_expect (S_ISCHR (st.st_mode), 1) == 0
|
||||
|| st.st_rdev != dev)
|
||||
/* We cannot even give an error message here since it would
|
||||
run into the same problems. */
|
||||
while (1)
|
||||
/* Try for ever and ever. */
|
||||
ABORT_INSTRUCTION;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
__libc_check_standard_fds (void)
|
||||
{
|
||||
/* This is really paranoid but some people actually are. If /dev/null
|
||||
should happen to be a symlink to somewhere else and not the device
|
||||
commonly known as "/dev/null" we bail out. We can detect this with
|
||||
the O_NOFOLLOW flag for open() but only on some system. */
|
||||
#ifndef O_NOFOLLOW
|
||||
# define O_NOFOLLOW 0
|
||||
#endif
|
||||
/* Check all three standard file descriptors. */
|
||||
check_one_fd (STDIN_FILENO, O_WRONLY | O_NOFOLLOW);
|
||||
check_one_fd (STDOUT_FILENO, O_RDONLY | O_NOFOLLOW);
|
||||
check_one_fd (STDERR_FILENO, O_RDONLY | O_NOFOLLOW);
|
||||
}
|
37
csu/errno-loc.c
Normal file
37
csu/errno-loc.c
Normal file
@ -0,0 +1,37 @@
|
||||
/* MT support function to get address of `errno' variable, non-threaded
|
||||
version.
|
||||
Copyright (C) 1996, 1998, 2002, 2004 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <tls.h>
|
||||
|
||||
#if ! USE___THREAD && !RTLD_PRIVATE_ERRNO
|
||||
#undef errno
|
||||
extern int errno;
|
||||
#endif
|
||||
|
||||
int *
|
||||
#if ! USE___THREAD
|
||||
weak_const_function
|
||||
#endif
|
||||
__errno_location (void)
|
||||
{
|
||||
return &errno;
|
||||
}
|
||||
libc_hidden_def (__errno_location)
|
94
debug/backtrace.c
Normal file
94
debug/backtrace.c
Normal file
@ -0,0 +1,94 @@
|
||||
/* Return backtrace of current program state. Generic version.
|
||||
Copyright (C) 1998, 2000, 2002, 2004, 2005 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
|
||||
|
||||
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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <execinfo.h>
|
||||
#include <signal.h>
|
||||
#include <frame.h>
|
||||
#include <sigcontextinfo.h>
|
||||
#include <bp-checks.h>
|
||||
#include <ldsodefs.h>
|
||||
|
||||
/* This implementation assumes a stack layout that matches the defaults
|
||||
used by gcc's `__builtin_frame_address' and `__builtin_return_address'
|
||||
(FP is the frame pointer register):
|
||||
|
||||
+-----------------+ +-----------------+
|
||||
FP -> | previous FP --------> | previous FP ------>...
|
||||
| | | |
|
||||
| return address | | return address |
|
||||
+-----------------+ +-----------------+
|
||||
|
||||
*/
|
||||
|
||||
/* Get some notion of the current stack. Need not be exactly the top
|
||||
of the stack, just something somewhere in the current frame. */
|
||||
#ifndef CURRENT_STACK_FRAME
|
||||
# define CURRENT_STACK_FRAME ({ char __csf; &__csf; })
|
||||
#endif
|
||||
|
||||
/* By default we assume that the stack grows downward. */
|
||||
#ifndef INNER_THAN
|
||||
# define INNER_THAN <
|
||||
#endif
|
||||
|
||||
/* By default assume the `next' pointer in struct layout points to the
|
||||
next struct layout. */
|
||||
#ifndef ADVANCE_STACK_FRAME
|
||||
# define ADVANCE_STACK_FRAME(next) BOUNDED_1 ((struct layout *) (next))
|
||||
#endif
|
||||
|
||||
/* By default, the frame pointer is just what we get from gcc. */
|
||||
#ifndef FIRST_FRAME_POINTER
|
||||
# define FIRST_FRAME_POINTER __builtin_frame_address (0)
|
||||
#endif
|
||||
|
||||
int
|
||||
__backtrace (array, size)
|
||||
void **array;
|
||||
int size;
|
||||
{
|
||||
struct layout *current;
|
||||
void *__unbounded top_frame;
|
||||
void *__unbounded top_stack;
|
||||
int cnt = 0;
|
||||
|
||||
top_frame = FIRST_FRAME_POINTER;
|
||||
top_stack = CURRENT_STACK_FRAME;
|
||||
|
||||
/* We skip the call to this function, it makes no sense to record it. */
|
||||
current = BOUNDED_1 ((struct layout *) top_frame);
|
||||
while (cnt < size)
|
||||
{
|
||||
if ((void *) current INNER_THAN top_stack
|
||||
|| !((void *) current INNER_THAN __libc_stack_end))
|
||||
/* This means the address is out of range. Note that for the
|
||||
toplevel we see a frame pointer with value NULL which clearly is
|
||||
out of range. */
|
||||
break;
|
||||
|
||||
array[cnt++] = current->return_address;
|
||||
|
||||
current = ADVANCE_STACK_FRAME (current->next);
|
||||
}
|
||||
|
||||
return cnt;
|
||||
}
|
||||
weak_alias (__backtrace, backtrace)
|
||||
libc_hidden_def (__backtrace)
|
58
debug/backtracesyms.c
Normal file
58
debug/backtracesyms.c
Normal file
@ -0,0 +1,58 @@
|
||||
/* Return list with names for address in backtrace.
|
||||
Copyright (C) 1998, 2000 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
|
||||
|
||||
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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <execinfo.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
/* Assume the worst for the width of an address. */
|
||||
#define WORD_WIDTH 16
|
||||
|
||||
|
||||
char **
|
||||
__backtrace_symbols (array, size)
|
||||
void *const *array;
|
||||
int size;
|
||||
{
|
||||
int cnt;
|
||||
size_t total = 0;
|
||||
char **result;
|
||||
|
||||
/* We can compute the text size needed for the symbols since we print
|
||||
them all as "[+0x<addr>]". */
|
||||
total = size * (WORD_WIDTH + 6);
|
||||
|
||||
/* Allocate memory for the result. */
|
||||
result = malloc (size * sizeof (char *) + total);
|
||||
if (result != NULL)
|
||||
{
|
||||
char *last = (char *) (result + size);
|
||||
|
||||
for (cnt = 0; cnt < size; ++cnt)
|
||||
{
|
||||
result[cnt] = last;
|
||||
last += 1 + sprintf (last, "[+%p]", array[cnt]);
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
weak_alias (__backtrace_symbols, backtrace_symbols)
|
64
debug/backtracesymsfd.c
Normal file
64
debug/backtracesymsfd.c
Normal file
@ -0,0 +1,64 @@
|
||||
/* Write formatted list with names for addresses in backtrace to a file.
|
||||
Copyright (C) 1998, 2003, 2005 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
|
||||
|
||||
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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <execinfo.h>
|
||||
#include <string.h>
|
||||
#include <sys/uio.h>
|
||||
|
||||
#include <stdio-common/_itoa.h>
|
||||
#include <not-cancel.h>
|
||||
|
||||
#if __ELF_NATIVE_CLASS == 32
|
||||
# define WORD_WIDTH 8
|
||||
#else
|
||||
/* We assume 64bits. */
|
||||
# define WORD_WIDTH 16
|
||||
#endif
|
||||
|
||||
|
||||
void
|
||||
__backtrace_symbols_fd (array, size, fd)
|
||||
void *const *array;
|
||||
int size;
|
||||
int fd;
|
||||
{
|
||||
struct iovec iov[3];
|
||||
int cnt;
|
||||
|
||||
for (cnt = 0; cnt < size; ++cnt)
|
||||
{
|
||||
char buf[WORD_WIDTH];
|
||||
|
||||
iov[0].iov_base = (void *) "[0x";
|
||||
iov[0].iov_len = 3;
|
||||
|
||||
iov[1].iov_base = _itoa_word ((unsigned long int) array[cnt],
|
||||
&buf[WORD_WIDTH], 16, 0);
|
||||
iov[1].iov_len = &buf[WORD_WIDTH] - (char *) iov[1].iov_base;
|
||||
|
||||
iov[2].iov_base = (void *) "]\n";
|
||||
iov[2].iov_len = 2;
|
||||
|
||||
/* We prefer to use the non-cancelable interface if it is available. */
|
||||
writev_not_cancel_no_status (fd, iov, 3);
|
||||
}
|
||||
}
|
||||
weak_alias (__backtrace_symbols_fd, backtrace_symbols_fd)
|
||||
libc_hidden_def (__backtrace_symbols_fd)
|
27
dirent/alphasort64.c
Normal file
27
dirent/alphasort64.c
Normal file
@ -0,0 +1,27 @@
|
||||
/* Copyright (C) 1992, 1997, 1998, 2000 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <dirent.h>
|
||||
#include <string.h>
|
||||
|
||||
int
|
||||
alphasort64 (const void *a, const void *b)
|
||||
{
|
||||
return strcoll ((*(const struct dirent64 **) a)->d_name,
|
||||
(*(const struct dirent64 **) b)->d_name);
|
||||
}
|
35
dirent/closedir.c
Normal file
35
dirent/closedir.c
Normal file
@ -0,0 +1,35 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stddef.h>
|
||||
#include <dirent.h>
|
||||
|
||||
|
||||
/* Close the directory stream DIRP.
|
||||
Return 0 if successful, -1 if not. */
|
||||
int
|
||||
__closedir (DIR *dirp)
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
weak_alias (__closedir, closedir)
|
||||
|
||||
stub_warning (closedir)
|
||||
#include <stub-tag.h>
|
33
dirent/dirfd.c
Normal file
33
dirent/dirfd.c
Normal file
@ -0,0 +1,33 @@
|
||||
/* Return the file descriptor used by a DIR stream. Stub version.
|
||||
Copyright (C) 1995, 1996 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <dirent.h>
|
||||
#include <dirstream.h>
|
||||
#include <errno.h>
|
||||
|
||||
int
|
||||
dirfd (dirp)
|
||||
DIR *dirp;
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
|
||||
stub_warning (dirfd)
|
||||
#include <stub-tag.h>
|
5
elf/dl-brk.c
Normal file
5
elf/dl-brk.c
Normal file
@ -0,0 +1,5 @@
|
||||
/* We can use the normal code but we also know the __curbrk is not exported
|
||||
from ld.so. */
|
||||
extern void *__curbrk attribute_hidden;
|
||||
|
||||
#include <brk.c>
|
311
elf/dl-cache.c
Normal file
311
elf/dl-cache.c
Normal file
@ -0,0 +1,311 @@
|
||||
/* Support for reading /etc/ld.so.cache files written by Linux ldconfig.
|
||||
Copyright (C) 1996-2002, 2003, 2004 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <assert.h>
|
||||
#include <unistd.h>
|
||||
#include <ldsodefs.h>
|
||||
#include <sys/mman.h>
|
||||
#include <dl-cache.h>
|
||||
#include <dl-procinfo.h>
|
||||
|
||||
#include <stdio-common/_itoa.h>
|
||||
|
||||
#ifndef _DL_PLATFORMS_COUNT
|
||||
# define _DL_PLATFORMS_COUNT 0
|
||||
#endif
|
||||
|
||||
/* This is the starting address and the size of the mmap()ed file. */
|
||||
static struct cache_file *cache;
|
||||
static struct cache_file_new *cache_new;
|
||||
static size_t cachesize;
|
||||
|
||||
/* 1 if cache_data + PTR points into the cache. */
|
||||
#define _dl_cache_verify_ptr(ptr) (ptr < cache_data_size)
|
||||
|
||||
#define SEARCH_CACHE(cache) \
|
||||
/* We use binary search since the table is sorted in the cache file. \
|
||||
The first matching entry in the table is returned. \
|
||||
It is important to use the same algorithm as used while generating \
|
||||
the cache file. */ \
|
||||
do \
|
||||
{ \
|
||||
left = 0; \
|
||||
right = cache->nlibs - 1; \
|
||||
\
|
||||
while (left <= right) \
|
||||
{ \
|
||||
__typeof__ (cache->libs[0].key) key; \
|
||||
\
|
||||
middle = (left + right) / 2; \
|
||||
\
|
||||
key = cache->libs[middle].key; \
|
||||
\
|
||||
/* Make sure string table indices are not bogus before using \
|
||||
them. */ \
|
||||
if (! _dl_cache_verify_ptr (key)) \
|
||||
{ \
|
||||
cmpres = 1; \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
/* Actually compare the entry with the key. */ \
|
||||
cmpres = _dl_cache_libcmp (name, cache_data + key); \
|
||||
if (__builtin_expect (cmpres == 0, 0)) \
|
||||
{ \
|
||||
/* Found it. LEFT now marks the last entry for which we \
|
||||
know the name is correct. */ \
|
||||
left = middle; \
|
||||
\
|
||||
/* There might be entries with this name before the one we \
|
||||
found. So we have to find the beginning. */ \
|
||||
while (middle > 0) \
|
||||
{ \
|
||||
__typeof__ (cache->libs[0].key) key; \
|
||||
\
|
||||
key = cache->libs[middle - 1].key; \
|
||||
/* Make sure string table indices are not bogus before \
|
||||
using them. */ \
|
||||
if (! _dl_cache_verify_ptr (key) \
|
||||
/* Actually compare the entry. */ \
|
||||
|| _dl_cache_libcmp (name, cache_data + key) != 0) \
|
||||
break; \
|
||||
--middle; \
|
||||
} \
|
||||
\
|
||||
do \
|
||||
{ \
|
||||
int flags; \
|
||||
__typeof__ (cache->libs[0]) *lib = &cache->libs[middle]; \
|
||||
\
|
||||
/* Only perform the name test if necessary. */ \
|
||||
if (middle > left \
|
||||
/* We haven't seen this string so far. Test whether the \
|
||||
index is ok and whether the name matches. Otherwise \
|
||||
we are done. */ \
|
||||
&& (! _dl_cache_verify_ptr (lib->key) \
|
||||
|| (_dl_cache_libcmp (name, cache_data + lib->key) \
|
||||
!= 0))) \
|
||||
break; \
|
||||
\
|
||||
flags = lib->flags; \
|
||||
if (_dl_cache_check_flags (flags) \
|
||||
&& _dl_cache_verify_ptr (lib->value)) \
|
||||
{ \
|
||||
if (best == NULL || flags == GLRO(dl_correct_cache_id)) \
|
||||
{ \
|
||||
HWCAP_CHECK; \
|
||||
best = cache_data + lib->value; \
|
||||
\
|
||||
if (flags == GLRO(dl_correct_cache_id)) \
|
||||
/* We've found an exact match for the shared \
|
||||
object and no general `ELF' release. Stop \
|
||||
searching. */ \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
} \
|
||||
while (++middle <= right); \
|
||||
break; \
|
||||
} \
|
||||
\
|
||||
if (cmpres < 0) \
|
||||
left = middle + 1; \
|
||||
else \
|
||||
right = middle - 1; \
|
||||
} \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
|
||||
int
|
||||
internal_function
|
||||
_dl_cache_libcmp (const char *p1, const char *p2)
|
||||
{
|
||||
while (*p1 != '\0')
|
||||
{
|
||||
if (*p1 >= '0' && *p1 <= '9')
|
||||
{
|
||||
if (*p2 >= '0' && *p2 <= '9')
|
||||
{
|
||||
/* Must compare this numerically. */
|
||||
int val1;
|
||||
int val2;
|
||||
|
||||
val1 = *p1++ - '0';
|
||||
val2 = *p2++ - '0';
|
||||
while (*p1 >= '0' && *p1 <= '9')
|
||||
val1 = val1 * 10 + *p1++ - '0';
|
||||
while (*p2 >= '0' && *p2 <= '9')
|
||||
val2 = val2 * 10 + *p2++ - '0';
|
||||
if (val1 != val2)
|
||||
return val1 - val2;
|
||||
}
|
||||
else
|
||||
return 1;
|
||||
}
|
||||
else if (*p2 >= '0' && *p2 <= '9')
|
||||
return -1;
|
||||
else if (*p1 != *p2)
|
||||
return *p1 - *p2;
|
||||
else
|
||||
{
|
||||
++p1;
|
||||
++p2;
|
||||
}
|
||||
}
|
||||
return *p1 - *p2;
|
||||
}
|
||||
|
||||
|
||||
/* Look up NAME in ld.so.cache and return the file name stored there,
|
||||
or null if none is found. */
|
||||
|
||||
const char *
|
||||
internal_function
|
||||
_dl_load_cache_lookup (const char *name)
|
||||
{
|
||||
int left, right, middle;
|
||||
int cmpres;
|
||||
const char *cache_data;
|
||||
uint32_t cache_data_size;
|
||||
const char *best;
|
||||
|
||||
/* Print a message if the loading of libs is traced. */
|
||||
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0))
|
||||
_dl_debug_printf (" search cache=%s\n", LD_SO_CACHE);
|
||||
|
||||
if (cache == NULL)
|
||||
{
|
||||
/* Read the contents of the file. */
|
||||
void *file = _dl_sysdep_read_whole_file (LD_SO_CACHE, &cachesize,
|
||||
PROT_READ);
|
||||
|
||||
/* We can handle three different cache file formats here:
|
||||
- the old libc5/glibc2.0/2.1 format
|
||||
- the old format with the new format in it
|
||||
- only the new format
|
||||
The following checks if the cache contains any of these formats. */
|
||||
if (file != MAP_FAILED && cachesize > sizeof *cache
|
||||
&& memcmp (file, CACHEMAGIC, sizeof CACHEMAGIC - 1) == 0)
|
||||
{
|
||||
size_t offset;
|
||||
/* Looks ok. */
|
||||
cache = file;
|
||||
|
||||
/* Check for new version. */
|
||||
offset = ALIGN_CACHE (sizeof (struct cache_file)
|
||||
+ cache->nlibs * sizeof (struct file_entry));
|
||||
|
||||
cache_new = (struct cache_file_new *) ((void *) cache + offset);
|
||||
if (cachesize < (offset + sizeof (struct cache_file_new))
|
||||
|| memcmp (cache_new->magic, CACHEMAGIC_VERSION_NEW,
|
||||
sizeof CACHEMAGIC_VERSION_NEW - 1) != 0)
|
||||
cache_new = (void *) -1;
|
||||
}
|
||||
else if (file != MAP_FAILED && cachesize > sizeof *cache_new
|
||||
&& memcmp (file, CACHEMAGIC_VERSION_NEW,
|
||||
sizeof CACHEMAGIC_VERSION_NEW - 1) == 0)
|
||||
{
|
||||
cache_new = file;
|
||||
cache = file;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (file != MAP_FAILED)
|
||||
__munmap (file, cachesize);
|
||||
cache = (void *) -1;
|
||||
}
|
||||
|
||||
assert (cache != NULL);
|
||||
}
|
||||
|
||||
if (cache == (void *) -1)
|
||||
/* Previously looked for the cache file and didn't find it. */
|
||||
return NULL;
|
||||
|
||||
best = NULL;
|
||||
|
||||
if (cache_new != (void *) -1)
|
||||
{
|
||||
uint64_t platform;
|
||||
|
||||
/* This is where the strings start. */
|
||||
cache_data = (const char *) cache_new;
|
||||
|
||||
/* Now we can compute how large the string table is. */
|
||||
cache_data_size = (const char *) cache + cachesize - cache_data;
|
||||
|
||||
platform = _dl_string_platform (GLRO(dl_platform));
|
||||
if (platform != (uint64_t) -1)
|
||||
platform = 1ULL << platform;
|
||||
|
||||
/* Only accept hwcap if it's for the right platform. */
|
||||
#ifdef USE_TLS
|
||||
# define _DL_HWCAP_TLS_MASK (1LL << 63)
|
||||
#else
|
||||
# define _DL_HWCAP_TLS_MASK 0
|
||||
#endif
|
||||
#define HWCAP_CHECK \
|
||||
if (GLRO(dl_osversion) && lib->osversion > GLRO(dl_osversion)) \
|
||||
continue; \
|
||||
if (_DL_PLATFORMS_COUNT && platform != -1 \
|
||||
&& (lib->hwcap & _DL_HWCAP_PLATFORM) != 0 \
|
||||
&& (lib->hwcap & _DL_HWCAP_PLATFORM) != platform) \
|
||||
continue; \
|
||||
if (lib->hwcap \
|
||||
& ~(GLRO(dl_hwcap) | _DL_HWCAP_PLATFORM | _DL_HWCAP_TLS_MASK)) \
|
||||
continue
|
||||
SEARCH_CACHE (cache_new);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* This is where the strings start. */
|
||||
cache_data = (const char *) &cache->libs[cache->nlibs];
|
||||
|
||||
/* Now we can compute how large the string table is. */
|
||||
cache_data_size = (const char *) cache + cachesize - cache_data;
|
||||
|
||||
#undef HWCAP_CHECK
|
||||
#define HWCAP_CHECK do {} while (0)
|
||||
SEARCH_CACHE (cache);
|
||||
}
|
||||
|
||||
/* Print our result if wanted. */
|
||||
if (__builtin_expect (GLRO(dl_debug_mask) & DL_DEBUG_LIBS, 0)
|
||||
&& best != NULL)
|
||||
_dl_debug_printf (" trying file=%s\n", best);
|
||||
|
||||
return best;
|
||||
}
|
||||
|
||||
#ifndef MAP_COPY
|
||||
/* If the system does not support MAP_COPY we cannot leave the file open
|
||||
all the time since this would create problems when the file is replaced.
|
||||
Therefore we provide this function to close the file and open it again
|
||||
once needed. */
|
||||
void
|
||||
_dl_unload_cache (void)
|
||||
{
|
||||
if (cache != NULL && cache != (struct cache_file *) -1)
|
||||
{
|
||||
__munmap (cache, cachesize);
|
||||
cache = NULL;
|
||||
}
|
||||
}
|
||||
#endif
|
86
elf/dl-environ.c
Normal file
86
elf/dl-environ.c
Normal file
@ -0,0 +1,86 @@
|
||||
/* Environment handling for dynamic loader.
|
||||
Copyright (C) 1995-1998, 2000, 2001, 2002 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <ldsodefs.h>
|
||||
|
||||
/* Walk through the environment of the process and return all entries
|
||||
starting with `LD_'. */
|
||||
char *
|
||||
internal_function
|
||||
_dl_next_ld_env_entry (char ***position)
|
||||
{
|
||||
char **current = *position;
|
||||
char *result = NULL;
|
||||
|
||||
while (*current != NULL)
|
||||
{
|
||||
if (__builtin_expect ((*current)[0] == 'L', 0)
|
||||
&& (*current)[1] == 'D' && (*current)[2] == '_')
|
||||
{
|
||||
result = &(*current)[3];
|
||||
|
||||
/* Save current position for next visit. */
|
||||
*position = ++current;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
++current;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* In ld.so __environ is not exported. */
|
||||
extern char **__environ attribute_hidden;
|
||||
|
||||
int
|
||||
unsetenv (const char *name)
|
||||
{
|
||||
char **ep;
|
||||
|
||||
ep = __environ;
|
||||
while (*ep != NULL)
|
||||
{
|
||||
size_t cnt = 0;
|
||||
|
||||
while ((*ep)[cnt] == name[cnt] && name[cnt] != '\0')
|
||||
++cnt;
|
||||
|
||||
if (name[cnt] == '\0' && (*ep)[cnt] == '=')
|
||||
{
|
||||
/* Found it. Remove this pointer by moving later ones to
|
||||
the front. */
|
||||
char **dp = ep;
|
||||
|
||||
do
|
||||
dp[0] = dp[1];
|
||||
while (*dp++);
|
||||
/* Continue the loop in case NAME appears again. */
|
||||
}
|
||||
else
|
||||
++ep;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
32
elf/dl-execstack.c
Normal file
32
elf/dl-execstack.c
Normal file
@ -0,0 +1,32 @@
|
||||
/* Stack executability handling for GNU dynamic linker. Stub version.
|
||||
Copyright (C) 2003, 2004 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <ldsodefs.h>
|
||||
#include <errno.h>
|
||||
|
||||
/* There is no portable way to know the bounds of the initial thread's stack
|
||||
so as to mprotect it. */
|
||||
|
||||
int
|
||||
internal_function
|
||||
_dl_make_stack_executable (void **stack_endp)
|
||||
{
|
||||
return ENOSYS;
|
||||
}
|
||||
rtld_hidden_def (_dl_make_stack_executable)
|
323
elf/dl-fptr.c
Normal file
323
elf/dl-fptr.c
Normal file
@ -0,0 +1,323 @@
|
||||
/* Manage function descriptors. Generic version.
|
||||
Copyright (C) 1999,2000,2001,2002,2003,2004 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <libintl.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/mman.h>
|
||||
#include <link.h>
|
||||
#include <ldsodefs.h>
|
||||
#include <elf/dynamic-link.h>
|
||||
#include <dl-fptr.h>
|
||||
#include <atomic.h>
|
||||
|
||||
#ifndef ELF_MACHINE_BOOT_FPTR_TABLE_LEN
|
||||
/* ELF_MACHINE_BOOT_FPTR_TABLE_LEN should be greater than the number of
|
||||
dynamic symbols in ld.so. */
|
||||
# define ELF_MACHINE_BOOT_FPTR_TABLE_LEN 256
|
||||
#endif
|
||||
|
||||
#ifndef ELF_MACHINE_LOAD_ADDRESS
|
||||
# error "ELF_MACHINE_LOAD_ADDRESS is not defined."
|
||||
#endif
|
||||
|
||||
#ifndef COMPARE_AND_SWAP
|
||||
# define COMPARE_AND_SWAP(ptr, old, new) \
|
||||
(atomic_compare_and_exchange_bool_acq (ptr, new, old) == 0)
|
||||
#endif
|
||||
|
||||
ElfW(Addr) _dl_boot_fptr_table [ELF_MACHINE_BOOT_FPTR_TABLE_LEN];
|
||||
|
||||
static struct local
|
||||
{
|
||||
struct fdesc_table *root;
|
||||
struct fdesc *free_list;
|
||||
unsigned int npages; /* # of pages to allocate */
|
||||
/* the next to members MUST be consecutive! */
|
||||
struct fdesc_table boot_table;
|
||||
struct fdesc boot_fdescs[1024];
|
||||
}
|
||||
local =
|
||||
{
|
||||
.root = &local.boot_table,
|
||||
.npages = 2,
|
||||
.boot_table =
|
||||
{
|
||||
.len = sizeof (local.boot_fdescs) / sizeof (local.boot_fdescs[0]),
|
||||
.first_unused = 0
|
||||
}
|
||||
};
|
||||
|
||||
/* Create a new fdesc table and return a pointer to the first fdesc
|
||||
entry. The fdesc lock must have been acquired already. */
|
||||
|
||||
static struct fdesc_table *
|
||||
new_fdesc_table (struct local *l, size_t *size)
|
||||
{
|
||||
size_t old_npages = l->npages;
|
||||
size_t new_npages = old_npages + old_npages;
|
||||
struct fdesc_table *new_table;
|
||||
|
||||
/* If someone has just created a new table, we return NULL to tell
|
||||
the caller to use the new table. */
|
||||
if (! COMPARE_AND_SWAP (&l->npages, old_npages, new_npages))
|
||||
return (struct fdesc_table *) NULL;
|
||||
|
||||
*size = old_npages * GLRO(dl_pagesize);
|
||||
new_table = __mmap (NULL, *size,
|
||||
PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE, -1, 0);
|
||||
if (new_table == MAP_FAILED)
|
||||
_dl_signal_error (errno, NULL, NULL,
|
||||
N_("cannot map pages for fdesc table"));
|
||||
|
||||
new_table->len
|
||||
= (*size - sizeof (*new_table)) / sizeof (struct fdesc);
|
||||
new_table->first_unused = 1;
|
||||
return new_table;
|
||||
}
|
||||
|
||||
|
||||
static ElfW(Addr)
|
||||
make_fdesc (ElfW(Addr) ip, ElfW(Addr) gp)
|
||||
{
|
||||
struct fdesc *fdesc = NULL;
|
||||
struct fdesc_table *root;
|
||||
unsigned int old;
|
||||
struct local *l;
|
||||
|
||||
ELF_MACHINE_LOAD_ADDRESS (l, local);
|
||||
|
||||
retry:
|
||||
root = l->root;
|
||||
while (1)
|
||||
{
|
||||
old = root->first_unused;
|
||||
if (old >= root->len)
|
||||
break;
|
||||
else if (COMPARE_AND_SWAP (&root->first_unused, old, old + 1))
|
||||
{
|
||||
fdesc = &root->fdesc[old];
|
||||
goto install;
|
||||
}
|
||||
}
|
||||
|
||||
if (l->free_list)
|
||||
{
|
||||
/* Get it from free-list. */
|
||||
do
|
||||
{
|
||||
fdesc = l->free_list;
|
||||
if (fdesc == NULL)
|
||||
goto retry;
|
||||
}
|
||||
while (! COMPARE_AND_SWAP ((ElfW(Addr) *) &l->free_list,
|
||||
(ElfW(Addr)) fdesc, fdesc->ip));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Create a new fdesc table. */
|
||||
size_t size;
|
||||
struct fdesc_table *new_table = new_fdesc_table (l, &size);
|
||||
|
||||
if (new_table == NULL)
|
||||
goto retry;
|
||||
|
||||
new_table->next = root;
|
||||
if (! COMPARE_AND_SWAP ((ElfW(Addr) *) &l->root,
|
||||
(ElfW(Addr)) root,
|
||||
(ElfW(Addr)) new_table))
|
||||
{
|
||||
/* Someone has just installed a new table. Return NULL to
|
||||
tell the caller to use the new table. */
|
||||
__munmap (new_table, size);
|
||||
goto retry;
|
||||
}
|
||||
|
||||
/* Note that the first entry was reserved while allocating the
|
||||
memory for the new page. */
|
||||
fdesc = &new_table->fdesc[0];
|
||||
}
|
||||
|
||||
install:
|
||||
fdesc->ip = ip;
|
||||
fdesc->gp = gp;
|
||||
|
||||
return (ElfW(Addr)) fdesc;
|
||||
}
|
||||
|
||||
|
||||
static inline ElfW(Addr) * __attribute__ ((always_inline))
|
||||
make_fptr_table (struct link_map *map)
|
||||
{
|
||||
const ElfW(Sym) *symtab
|
||||
= (const void *) D_PTR (map, l_info[DT_SYMTAB]);
|
||||
const char *strtab = (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
||||
ElfW(Addr) *fptr_table;
|
||||
size_t size;
|
||||
size_t len;
|
||||
|
||||
/* XXX Apparently the only way to find out the size of the dynamic
|
||||
symbol section is to assume that the string table follows right
|
||||
afterwards... */
|
||||
len = ((strtab - (char *) symtab)
|
||||
/ map->l_info[DT_SYMENT]->d_un.d_val);
|
||||
size = ((len * sizeof (fptr_table[0]) + GLRO(dl_pagesize) - 1)
|
||||
& -GLRO(dl_pagesize));
|
||||
/* XXX We don't support here in the moment systems without MAP_ANON.
|
||||
There probably are none for IA-64. In case this is proven wrong
|
||||
we will have to open /dev/null here and use the file descriptor
|
||||
instead of the hard-coded -1. */
|
||||
fptr_table = __mmap (NULL, size,
|
||||
PROT_READ | PROT_WRITE, MAP_ANON | MAP_PRIVATE,
|
||||
-1, 0);
|
||||
if (fptr_table == MAP_FAILED)
|
||||
_dl_signal_error (errno, NULL, NULL,
|
||||
N_("cannot map pages for fptr table"));
|
||||
|
||||
if (COMPARE_AND_SWAP ((ElfW(Addr) *) &map->l_mach.fptr_table,
|
||||
(ElfW(Addr)) NULL, (ElfW(Addr)) fptr_table))
|
||||
map->l_mach.fptr_table_len = len;
|
||||
else
|
||||
__munmap (fptr_table, len * sizeof (fptr_table[0]));
|
||||
|
||||
return map->l_mach.fptr_table;
|
||||
}
|
||||
|
||||
|
||||
ElfW(Addr)
|
||||
_dl_make_fptr (struct link_map *map, const ElfW(Sym) *sym,
|
||||
ElfW(Addr) ip)
|
||||
{
|
||||
ElfW(Addr) *ftab = map->l_mach.fptr_table;
|
||||
const ElfW(Sym) *symtab;
|
||||
Elf_Symndx symidx;
|
||||
struct local *l;
|
||||
|
||||
if (__builtin_expect (ftab == NULL, 0))
|
||||
ftab = make_fptr_table (map);
|
||||
|
||||
symtab = (const void *) D_PTR (map, l_info[DT_SYMTAB]);
|
||||
symidx = sym - symtab;
|
||||
|
||||
if (symidx >= map->l_mach.fptr_table_len)
|
||||
_dl_signal_error (0, NULL, NULL,
|
||||
N_("internal error: symidx out of range of fptr table"));
|
||||
|
||||
while (ftab[symidx] == 0)
|
||||
{
|
||||
/* GOT has already been relocated in elf_get_dynamic_info -
|
||||
don't try to relocate it again. */
|
||||
ElfW(Addr) fdesc
|
||||
= make_fdesc (ip, map->l_info[DT_PLTGOT]->d_un.d_ptr);
|
||||
|
||||
if (__builtin_expect (COMPARE_AND_SWAP (&ftab[symidx], (ElfW(Addr)) NULL,
|
||||
fdesc), 1))
|
||||
{
|
||||
/* Noone has updated the entry and the new function
|
||||
descriptor has been installed. */
|
||||
#if 0
|
||||
const char *strtab
|
||||
= (const void *) D_PTR (map, l_info[DT_STRTAB]);
|
||||
|
||||
ELF_MACHINE_LOAD_ADDRESS (l, local);
|
||||
if (l->root != &l->boot_table
|
||||
|| l->boot_table.first_unused > 20)
|
||||
_dl_debug_printf ("created fdesc symbol `%s' at %lx\n",
|
||||
strtab + sym->st_name, ftab[symidx]);
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* We created a duplicated function descriptor. We put it on
|
||||
free-list. */
|
||||
struct fdesc *f = (struct fdesc *) fdesc;
|
||||
|
||||
ELF_MACHINE_LOAD_ADDRESS (l, local);
|
||||
|
||||
do
|
||||
f->ip = (ElfW(Addr)) l->free_list;
|
||||
while (! COMPARE_AND_SWAP ((ElfW(Addr) *) &l->free_list,
|
||||
f->ip, fdesc));
|
||||
}
|
||||
}
|
||||
|
||||
return ftab[symidx];
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
_dl_unmap (struct link_map *map)
|
||||
{
|
||||
ElfW(Addr) *ftab = map->l_mach.fptr_table;
|
||||
struct fdesc *head = NULL, *tail = NULL;
|
||||
size_t i;
|
||||
|
||||
__munmap ((void *) map->l_map_start,
|
||||
map->l_map_end - map->l_map_start);
|
||||
|
||||
if (ftab == NULL)
|
||||
return;
|
||||
|
||||
/* String together the fdesc structures that are being freed. */
|
||||
for (i = 0; i < map->l_mach.fptr_table_len; ++i)
|
||||
{
|
||||
if (ftab[i])
|
||||
{
|
||||
*(struct fdesc **) ftab[i] = head;
|
||||
head = (struct fdesc *) ftab[i];
|
||||
if (tail == NULL)
|
||||
tail = head;
|
||||
}
|
||||
}
|
||||
|
||||
/* Prepend the new list to the free_list: */
|
||||
if (tail)
|
||||
do
|
||||
tail->ip = (ElfW(Addr)) local.free_list;
|
||||
while (! COMPARE_AND_SWAP ((ElfW(Addr) *) &local.free_list,
|
||||
tail->ip, (ElfW(Addr)) head));
|
||||
|
||||
__munmap (ftab, (map->l_mach.fptr_table_len
|
||||
* sizeof (map->l_mach.fptr_table[0])));
|
||||
|
||||
map->l_mach.fptr_table = NULL;
|
||||
}
|
||||
|
||||
|
||||
ElfW(Addr)
|
||||
_dl_lookup_address (const void *address)
|
||||
{
|
||||
ElfW(Addr) addr = (ElfW(Addr)) address;
|
||||
struct fdesc_table *t;
|
||||
unsigned long int i;
|
||||
|
||||
for (t = local.root; t != NULL; t = t->next)
|
||||
{
|
||||
i = (struct fdesc *) addr - &t->fdesc[0];
|
||||
if (i < t->first_unused && addr == (ElfW(Addr)) &t->fdesc[i])
|
||||
{
|
||||
addr = t->fdesc[i].ip;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return addr;
|
||||
}
|
51
elf/dl-origin.c
Normal file
51
elf/dl-origin.c
Normal file
@ -0,0 +1,51 @@
|
||||
/* Find path of executable.
|
||||
Copyright (C) 1998, 1999, 2000, 2002, 2004 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
|
||||
|
||||
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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <sys/param.h>
|
||||
#include <ldsodefs.h>
|
||||
|
||||
#include <dl-dst.h>
|
||||
|
||||
|
||||
const char *
|
||||
_dl_get_origin (void)
|
||||
{
|
||||
char *result = (char *) -1;
|
||||
/* We use the environment variable LD_ORIGIN_PATH. If it is set make
|
||||
a copy and strip out trailing slashes. */
|
||||
if (GLRO(dl_origin_path) != NULL)
|
||||
{
|
||||
size_t len = strlen (GLRO(dl_origin_path));
|
||||
result = (char *) malloc (len + 1);
|
||||
if (result == NULL)
|
||||
result = (char *) -1;
|
||||
else
|
||||
{
|
||||
char *cp = __mempcpy (result, GLRO(dl_origin_path), len);
|
||||
while (cp > result + 1 && cp[-1] == '/')
|
||||
--cp;
|
||||
*cp = '\0';
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
5
elf/dl-sbrk.c
Normal file
5
elf/dl-sbrk.c
Normal file
@ -0,0 +1,5 @@
|
||||
/* We can use the normal code but we also know the __curbrk is not exported
|
||||
from ld.so. */
|
||||
extern void *__curbrk attribute_hidden;
|
||||
|
||||
#include <sbrk.c>
|
33
elf/dl-symaddr.c
Normal file
33
elf/dl-symaddr.c
Normal file
@ -0,0 +1,33 @@
|
||||
/* Get the symbol address. Generic version.
|
||||
Copyright (C) 1999, 2000, 2001, 2003 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <ldsodefs.h>
|
||||
#include <dl-fptr.h>
|
||||
|
||||
void *
|
||||
_dl_symbol_address (struct link_map *map, const ElfW(Sym) *ref)
|
||||
{
|
||||
ElfW(Addr) value = (map ? map->l_addr : 0) + ref->st_value;
|
||||
|
||||
/* Return the pointer to function descriptor. */
|
||||
if (ELFW(ST_TYPE) (ref->st_info) == STT_FUNC)
|
||||
return (void *) _dl_make_fptr (map, ref, value);
|
||||
else
|
||||
return (void *) value;
|
||||
}
|
590
elf/dl-sysdep.c
Normal file
590
elf/dl-sysdep.c
Normal file
@ -0,0 +1,590 @@
|
||||
/* Operating system support for run-time dynamic linker. Generic Unix version.
|
||||
Copyright (C) 1995-1998, 2000-2003, 2004, 2005 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <assert.h>
|
||||
#include <elf.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <libintl.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/mman.h>
|
||||
#include <ldsodefs.h>
|
||||
#include <stdio-common/_itoa.h>
|
||||
#include <fpu_control.h>
|
||||
|
||||
#include <entry.h>
|
||||
#include <dl-machine.h>
|
||||
#include <dl-procinfo.h>
|
||||
#include <dl-osinfo.h>
|
||||
#include <hp-timing.h>
|
||||
#include <tls.h>
|
||||
|
||||
#ifdef _DL_FIRST_PLATFORM
|
||||
# define _DL_FIRST_EXTRA (_DL_FIRST_PLATFORM + _DL_PLATFORMS_COUNT)
|
||||
#else
|
||||
# define _DL_FIRST_EXTRA _DL_HWCAP_COUNT
|
||||
#endif
|
||||
|
||||
extern char **_environ attribute_hidden;
|
||||
extern void _end attribute_hidden;
|
||||
|
||||
/* Protect SUID program against misuse of file descriptors. */
|
||||
extern void __libc_check_standard_fds (void);
|
||||
|
||||
#ifdef NEED_DL_BASE_ADDR
|
||||
ElfW(Addr) _dl_base_addr;
|
||||
#endif
|
||||
int __libc_enable_secure attribute_relro = 0;
|
||||
INTVARDEF(__libc_enable_secure)
|
||||
int __libc_multiple_libcs = 0; /* Defining this here avoids the inclusion
|
||||
of init-first. */
|
||||
/* This variable contains the lowest stack address ever used. */
|
||||
void *__libc_stack_end attribute_relro = NULL;
|
||||
rtld_hidden_data_def(__libc_stack_end)
|
||||
static ElfW(auxv_t) *_dl_auxv attribute_relro;
|
||||
|
||||
#ifndef DL_FIND_ARG_COMPONENTS
|
||||
# define DL_FIND_ARG_COMPONENTS(cookie, argc, argv, envp, auxp) \
|
||||
do { \
|
||||
void **_tmp; \
|
||||
(argc) = *(long int *) cookie; \
|
||||
(argv) = (char **) ((long int *) cookie + 1); \
|
||||
(envp) = (argv) + (argc) + 1; \
|
||||
for (_tmp = (void **) (envp); *_tmp; ++_tmp) \
|
||||
continue; \
|
||||
(auxp) = (void *) ++_tmp; \
|
||||
} while (0)
|
||||
#endif
|
||||
|
||||
#ifndef DL_STACK_END
|
||||
# define DL_STACK_END(cookie) ((void *) (cookie))
|
||||
#endif
|
||||
|
||||
ElfW(Addr)
|
||||
_dl_sysdep_start (void **start_argptr,
|
||||
void (*dl_main) (const ElfW(Phdr) *phdr, ElfW(Word) phnum,
|
||||
ElfW(Addr) *user_entry))
|
||||
{
|
||||
const ElfW(Phdr) *phdr = NULL;
|
||||
ElfW(Word) phnum = 0;
|
||||
ElfW(Addr) user_entry;
|
||||
ElfW(auxv_t) *av;
|
||||
#ifdef HAVE_AUX_SECURE
|
||||
# define set_seen(tag) (tag) /* Evaluate for the side effects. */
|
||||
# define set_seen_secure() ((void) 0)
|
||||
#else
|
||||
uid_t uid = 0;
|
||||
gid_t gid = 0;
|
||||
unsigned int seen = 0;
|
||||
# define set_seen_secure() (seen = -1)
|
||||
# ifdef HAVE_AUX_XID
|
||||
# define set_seen(tag) (tag) /* Evaluate for the side effects. */
|
||||
# else
|
||||
# define M(type) (1 << (type))
|
||||
# define set_seen(tag) seen |= M ((tag)->a_type)
|
||||
# endif
|
||||
#endif
|
||||
#ifdef NEED_DL_SYSINFO
|
||||
uintptr_t new_sysinfo = 0;
|
||||
#endif
|
||||
|
||||
__libc_stack_end = DL_STACK_END (start_argptr);
|
||||
DL_FIND_ARG_COMPONENTS (start_argptr, _dl_argc, INTUSE(_dl_argv), _environ,
|
||||
_dl_auxv);
|
||||
|
||||
user_entry = (ElfW(Addr)) ENTRY_POINT;
|
||||
GLRO(dl_platform) = NULL; /* Default to nothing known about the platform. */
|
||||
|
||||
for (av = _dl_auxv; av->a_type != AT_NULL; set_seen (av++))
|
||||
switch (av->a_type)
|
||||
{
|
||||
case AT_PHDR:
|
||||
phdr = (void *) av->a_un.a_val;
|
||||
break;
|
||||
case AT_PHNUM:
|
||||
phnum = av->a_un.a_val;
|
||||
break;
|
||||
case AT_PAGESZ:
|
||||
GLRO(dl_pagesize) = av->a_un.a_val;
|
||||
break;
|
||||
case AT_ENTRY:
|
||||
user_entry = av->a_un.a_val;
|
||||
break;
|
||||
#ifdef NEED_DL_BASE_ADDR
|
||||
case AT_BASE:
|
||||
_dl_base_addr = av->a_un.a_val;
|
||||
break;
|
||||
#endif
|
||||
#ifndef HAVE_AUX_SECURE
|
||||
case AT_UID:
|
||||
case AT_EUID:
|
||||
uid ^= av->a_un.a_val;
|
||||
break;
|
||||
case AT_GID:
|
||||
case AT_EGID:
|
||||
gid ^= av->a_un.a_val;
|
||||
break;
|
||||
#endif
|
||||
case AT_SECURE:
|
||||
#ifndef HAVE_AUX_SECURE
|
||||
seen = -1;
|
||||
#endif
|
||||
INTUSE(__libc_enable_secure) = av->a_un.a_val;
|
||||
break;
|
||||
case AT_PLATFORM:
|
||||
GLRO(dl_platform) = (void *) av->a_un.a_val;
|
||||
break;
|
||||
case AT_HWCAP:
|
||||
GLRO(dl_hwcap) = (unsigned long int) av->a_un.a_val;
|
||||
break;
|
||||
case AT_CLKTCK:
|
||||
GLRO(dl_clktck) = av->a_un.a_val;
|
||||
break;
|
||||
case AT_FPUCW:
|
||||
GLRO(dl_fpu_control) = av->a_un.a_val;
|
||||
break;
|
||||
#ifdef NEED_DL_SYSINFO
|
||||
case AT_SYSINFO:
|
||||
new_sysinfo = av->a_un.a_val;
|
||||
break;
|
||||
#endif
|
||||
#if defined NEED_DL_SYSINFO || defined NEED_DL_SYSINFO_DSO
|
||||
case AT_SYSINFO_EHDR:
|
||||
GLRO(dl_sysinfo_dso) = (void *) av->a_un.a_val;
|
||||
break;
|
||||
#endif
|
||||
#ifdef DL_PLATFORM_AUXV
|
||||
DL_PLATFORM_AUXV
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifndef HAVE_AUX_SECURE
|
||||
if (seen != -1)
|
||||
{
|
||||
/* Fill in the values we have not gotten from the kernel through the
|
||||
auxiliary vector. */
|
||||
# ifndef HAVE_AUX_XID
|
||||
# define SEE(UID, var, uid) \
|
||||
if ((seen & M (AT_##UID)) == 0) var ^= __get##uid ()
|
||||
SEE (UID, uid, uid);
|
||||
SEE (EUID, uid, euid);
|
||||
SEE (GID, gid, gid);
|
||||
SEE (EGID, gid, egid);
|
||||
# endif
|
||||
|
||||
/* If one of the two pairs of IDs does not match this is a setuid
|
||||
or setgid run. */
|
||||
INTUSE(__libc_enable_secure) = uid | gid;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_AUX_PAGESIZE
|
||||
if (GLRO(dl_pagesize) == 0)
|
||||
GLRO(dl_pagesize) = __getpagesize ();
|
||||
#endif
|
||||
|
||||
#if defined NEED_DL_SYSINFO
|
||||
/* Only set the sysinfo value if we also have the vsyscall DSO. */
|
||||
if (GLRO(dl_sysinfo_dso) != 0 && new_sysinfo)
|
||||
GLRO(dl_sysinfo) = new_sysinfo;
|
||||
#endif
|
||||
|
||||
#ifdef DL_SYSDEP_INIT
|
||||
DL_SYSDEP_INIT;
|
||||
#endif
|
||||
|
||||
#ifdef DL_PLATFORM_INIT
|
||||
DL_PLATFORM_INIT;
|
||||
#endif
|
||||
|
||||
/* Determine the length of the platform name. */
|
||||
if (GLRO(dl_platform) != NULL)
|
||||
GLRO(dl_platformlen) = strlen (GLRO(dl_platform));
|
||||
|
||||
if (__sbrk (0) == &_end)
|
||||
/* The dynamic linker was run as a program, and so the initial break
|
||||
starts just after our bss, at &_end. The malloc in dl-minimal.c
|
||||
will consume the rest of this page, so tell the kernel to move the
|
||||
break up that far. When the user program examines its break, it
|
||||
will see this new value and not clobber our data. */
|
||||
__sbrk (GLRO(dl_pagesize)
|
||||
- ((&_end - (void *) 0) & (GLRO(dl_pagesize) - 1)));
|
||||
|
||||
/* If this is a SUID program we make sure that FDs 0, 1, and 2 are
|
||||
allocated. If necessary we are doing it ourself. If it is not
|
||||
possible we stop the program. */
|
||||
if (__builtin_expect (INTUSE(__libc_enable_secure), 0))
|
||||
__libc_check_standard_fds ();
|
||||
|
||||
(*dl_main) (phdr, phnum, &user_entry);
|
||||
return user_entry;
|
||||
}
|
||||
|
||||
void
|
||||
internal_function
|
||||
_dl_sysdep_start_cleanup (void)
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
internal_function
|
||||
_dl_show_auxv (void)
|
||||
{
|
||||
char buf[64];
|
||||
ElfW(auxv_t) *av;
|
||||
|
||||
/* Terminate string. */
|
||||
buf[63] = '\0';
|
||||
|
||||
/* The following code assumes that the AT_* values are encoded
|
||||
starting from 0 with AT_NULL, 1 for AT_IGNORE, and all other values
|
||||
close by (otherwise the array will be too large). In case we have
|
||||
to support a platform where these requirements are not fulfilled
|
||||
some alternative implementation has to be used. */
|
||||
for (av = _dl_auxv; av->a_type != AT_NULL; ++av)
|
||||
{
|
||||
static const struct
|
||||
{
|
||||
const char label[20];
|
||||
enum { unknown = 0, dec, hex, str, ignore } form;
|
||||
} auxvars[] =
|
||||
{
|
||||
[AT_EXECFD - 2] = { "AT_EXECFD: ", dec },
|
||||
[AT_PHDR - 2] = { "AT_PHDR: 0x", hex },
|
||||
[AT_PHENT - 2] = { "AT_PHENT: ", dec },
|
||||
[AT_PHNUM - 2] = { "AT_PHNUM: ", dec },
|
||||
[AT_PAGESZ - 2] = { "AT_PAGESZ: ", dec },
|
||||
[AT_BASE - 2] = { "AT_BASE: 0x", hex },
|
||||
[AT_FLAGS - 2] = { "AT_FLAGS: 0x", hex },
|
||||
[AT_ENTRY - 2] = { "AT_ENTRY: 0x", hex },
|
||||
[AT_NOTELF - 2] = { "AT_NOTELF: ", hex },
|
||||
[AT_UID - 2] = { "AT_UID: ", dec },
|
||||
[AT_EUID - 2] = { "AT_EUID: ", dec },
|
||||
[AT_GID - 2] = { "AT_GID: ", dec },
|
||||
[AT_EGID - 2] = { "AT_EGID: ", dec },
|
||||
[AT_PLATFORM - 2] = { "AT_PLATFORM: ", str },
|
||||
[AT_HWCAP - 2] = { "AT_HWCAP: ", hex },
|
||||
[AT_CLKTCK - 2] = { "AT_CLKTCK: ", dec },
|
||||
[AT_FPUCW - 2] = { "AT_FPUCW: ", hex },
|
||||
[AT_DCACHEBSIZE - 2] = { "AT_DCACHEBSIZE: 0x", hex },
|
||||
[AT_ICACHEBSIZE - 2] = { "AT_ICACHEBSIZE: 0x", hex },
|
||||
[AT_UCACHEBSIZE - 2] = { "AT_UCACHEBSIZE: 0x", hex },
|
||||
[AT_IGNOREPPC - 2] = { "AT_IGNOREPPC", ignore },
|
||||
[AT_SECURE - 2] = { "AT_SECURE: ", dec },
|
||||
[AT_SYSINFO - 2] = { "AT_SYSINFO: 0x", hex },
|
||||
[AT_SYSINFO_EHDR - 2] = { "AT_SYSINFO_EHDR: 0x", hex },
|
||||
};
|
||||
unsigned int idx = (unsigned int) (av->a_type - 2);
|
||||
|
||||
if ((unsigned int) av->a_type < 2u || auxvars[idx].form == ignore)
|
||||
continue;
|
||||
|
||||
assert (AT_NULL == 0);
|
||||
assert (AT_IGNORE == 1);
|
||||
|
||||
if (av->a_type == AT_HWCAP)
|
||||
{
|
||||
/* This is handled special. */
|
||||
if (_dl_procinfo (av->a_un.a_val) == 0)
|
||||
continue;
|
||||
}
|
||||
|
||||
if (idx < sizeof (auxvars) / sizeof (auxvars[0])
|
||||
&& auxvars[idx].form != unknown)
|
||||
{
|
||||
const char *val = (char *) av->a_un.a_val;
|
||||
|
||||
if (__builtin_expect (auxvars[idx].form, dec) == dec)
|
||||
val = _itoa ((unsigned long int) av->a_un.a_val,
|
||||
buf + sizeof buf - 1, 10, 0);
|
||||
else if (__builtin_expect (auxvars[idx].form, hex) == hex)
|
||||
val = _itoa ((unsigned long int) av->a_un.a_val,
|
||||
buf + sizeof buf - 1, 16, 0);
|
||||
|
||||
_dl_printf ("%s%s\n", auxvars[idx].label, val);
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Unknown value: print a generic line. */
|
||||
char buf2[17];
|
||||
buf[sizeof (buf2) - 1] = '\0';
|
||||
const char *val2 = _itoa ((unsigned long int) av->a_un.a_val,
|
||||
buf2 + sizeof buf2 - 1, 16, 0);
|
||||
const char *val = _itoa ((unsigned long int) av->a_type,
|
||||
buf + sizeof buf - 1, 16, 0);
|
||||
_dl_printf ("AT_??? (0x%s): 0x%s\n", val, val2);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Return an array of useful/necessary hardware capability names. */
|
||||
const struct r_strlenpair *
|
||||
internal_function
|
||||
_dl_important_hwcaps (const char *platform, size_t platform_len, size_t *sz,
|
||||
size_t *max_capstrlen)
|
||||
{
|
||||
/* Determine how many important bits are set. */
|
||||
uint64_t masked = GLRO(dl_hwcap) & GLRO(dl_hwcap_mask);
|
||||
size_t cnt = platform != NULL;
|
||||
size_t n, m;
|
||||
size_t total;
|
||||
struct r_strlenpair *temp;
|
||||
struct r_strlenpair *result;
|
||||
struct r_strlenpair *rp;
|
||||
char *cp;
|
||||
|
||||
/* Count the number of bits set in the masked value. */
|
||||
for (n = 0; (~((1ULL << n) - 1) & masked) != 0; ++n)
|
||||
if ((masked & (1ULL << n)) != 0)
|
||||
++cnt;
|
||||
|
||||
#if (defined NEED_DL_SYSINFO || defined NEED_DL_SYSINFO_DSO) && defined SHARED
|
||||
/* The system-supplied DSO can contain a note of type 2, vendor "GNU".
|
||||
This gives us a list of names to treat as fake hwcap bits. */
|
||||
|
||||
const char *dsocaps = NULL;
|
||||
size_t dsocapslen = 0;
|
||||
if (GLRO(dl_sysinfo_map) != NULL)
|
||||
{
|
||||
const ElfW(Phdr) *const phdr = GLRO(dl_sysinfo_map)->l_phdr;
|
||||
const ElfW(Word) phnum = GLRO(dl_sysinfo_map)->l_phnum;
|
||||
for (uint_fast16_t i = 0; i < phnum; ++i)
|
||||
if (phdr[i].p_type == PT_NOTE)
|
||||
{
|
||||
const ElfW(Addr) start = (phdr[i].p_vaddr
|
||||
+ GLRO(dl_sysinfo_map)->l_addr);
|
||||
const struct
|
||||
{
|
||||
ElfW(Word) vendorlen;
|
||||
ElfW(Word) datalen;
|
||||
ElfW(Word) type;
|
||||
} *note = (const void *) start;
|
||||
while ((ElfW(Addr)) (note + 1) - start < phdr[i].p_memsz)
|
||||
{
|
||||
#define ROUND(len) (((len) + sizeof (ElfW(Word)) - 1) & -sizeof (ElfW(Word)))
|
||||
if (note->type == 2
|
||||
&& note->vendorlen == sizeof "GNU"
|
||||
&& !memcmp ((note + 1), "GNU", sizeof "GNU")
|
||||
&& note->datalen > 2 * sizeof (ElfW(Word)) + 2)
|
||||
{
|
||||
const ElfW(Word) *p = ((const void *) (note + 1)
|
||||
+ ROUND (sizeof "GNU"));
|
||||
cnt += *p++;
|
||||
++p; /* Skip mask word. */
|
||||
dsocaps = (const char *) p;
|
||||
dsocapslen = note->datalen - sizeof *p * 2;
|
||||
break;
|
||||
}
|
||||
note = ((const void *) (note + 1)
|
||||
+ ROUND (note->vendorlen) + ROUND (note->datalen));
|
||||
}
|
||||
if (dsocaps != NULL)
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef USE_TLS
|
||||
/* For TLS enabled builds always add 'tls'. */
|
||||
++cnt;
|
||||
#else
|
||||
if (cnt == 0)
|
||||
{
|
||||
/* If we no have platform name and no important capability we only
|
||||
have the base directory to search. */
|
||||
result = (struct r_strlenpair *) malloc (sizeof (*result));
|
||||
if (result == NULL)
|
||||
goto no_memory;
|
||||
|
||||
result[0].str = (char *) result; /* Does not really matter. */
|
||||
result[0].len = 0;
|
||||
|
||||
*sz = 1;
|
||||
return result;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Create temporary data structure to generate result table. */
|
||||
temp = (struct r_strlenpair *) alloca (cnt * sizeof (*temp));
|
||||
m = 0;
|
||||
#if defined NEED_DL_SYSINFO || defined NEED_DL_SYSINFO_DSO
|
||||
if (dsocaps != NULL)
|
||||
{
|
||||
const ElfW(Word) mask = ((const ElfW(Word) *) dsocaps)[-1];
|
||||
GLRO(dl_hwcap) |= (uint64_t) mask << _DL_FIRST_EXTRA;
|
||||
size_t len;
|
||||
for (const char *p = dsocaps; p < dsocaps + dsocapslen; p += len + 1)
|
||||
{
|
||||
uint_fast8_t bit = *p++;
|
||||
len = strlen (p);
|
||||
|
||||
/* Skip entries that are not enabled in the mask word. */
|
||||
if (__builtin_expect (mask & ((ElfW(Word)) 1 << bit), 1))
|
||||
{
|
||||
temp[m].str = p;
|
||||
temp[m].len = len;
|
||||
++m;
|
||||
}
|
||||
else
|
||||
--cnt;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
for (n = 0; masked != 0; ++n)
|
||||
if ((masked & (1ULL << n)) != 0)
|
||||
{
|
||||
temp[m].str = _dl_hwcap_string (n);
|
||||
temp[m].len = strlen (temp[m].str);
|
||||
masked ^= 1ULL << n;
|
||||
++m;
|
||||
}
|
||||
if (platform != NULL)
|
||||
{
|
||||
temp[m].str = platform;
|
||||
temp[m].len = platform_len;
|
||||
++m;
|
||||
}
|
||||
#ifdef USE_TLS
|
||||
temp[m].str = "tls";
|
||||
temp[m].len = 3;
|
||||
++m;
|
||||
#endif
|
||||
assert (m == cnt);
|
||||
|
||||
/* Determine the total size of all strings together. */
|
||||
if (cnt == 1)
|
||||
total = temp[0].len + 1;
|
||||
else
|
||||
{
|
||||
total = (1UL << (cnt - 2)) * (temp[0].len + temp[cnt - 1].len + 2);
|
||||
for (n = 1; n + 1 < cnt; ++n)
|
||||
total += (1UL << (cnt - 3)) * (temp[n].len + 1);
|
||||
}
|
||||
|
||||
/* The result structure: we use a very compressed way to store the
|
||||
various combinations of capability names. */
|
||||
*sz = 1 << cnt;
|
||||
result = (struct r_strlenpair *) malloc (*sz * sizeof (*result) + total);
|
||||
if (result == NULL)
|
||||
{
|
||||
#ifndef USE_TLS
|
||||
no_memory:
|
||||
#endif
|
||||
_dl_signal_error (ENOMEM, NULL, NULL,
|
||||
N_("cannot create capability list"));
|
||||
}
|
||||
|
||||
if (cnt == 1)
|
||||
{
|
||||
result[0].str = (char *) (result + *sz);
|
||||
result[0].len = temp[0].len + 1;
|
||||
result[1].str = (char *) (result + *sz);
|
||||
result[1].len = 0;
|
||||
cp = __mempcpy ((char *) (result + *sz), temp[0].str, temp[0].len);
|
||||
*cp = '/';
|
||||
*sz = 2;
|
||||
*max_capstrlen = result[0].len;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
/* Fill in the information. This follows the following scheme
|
||||
(indeces from TEMP for four strings):
|
||||
entry #0: 0, 1, 2, 3 binary: 1111
|
||||
#1: 0, 1, 3 1101
|
||||
#2: 0, 2, 3 1011
|
||||
#3: 0, 3 1001
|
||||
This allows the representation of all possible combinations of
|
||||
capability names in the string. First generate the strings. */
|
||||
result[1].str = result[0].str = cp = (char *) (result + *sz);
|
||||
#define add(idx) \
|
||||
cp = __mempcpy (__mempcpy (cp, temp[idx].str, temp[idx].len), "/", 1);
|
||||
if (cnt == 2)
|
||||
{
|
||||
add (1);
|
||||
add (0);
|
||||
}
|
||||
else
|
||||
{
|
||||
n = 1 << (cnt - 1);
|
||||
do
|
||||
{
|
||||
n -= 2;
|
||||
|
||||
/* We always add the last string. */
|
||||
add (cnt - 1);
|
||||
|
||||
/* Add the strings which have the bit set in N. */
|
||||
for (m = cnt - 2; m > 0; --m)
|
||||
if ((n & (1 << m)) != 0)
|
||||
add (m);
|
||||
|
||||
/* Always add the first string. */
|
||||
add (0);
|
||||
}
|
||||
while (n != 0);
|
||||
}
|
||||
#undef add
|
||||
|
||||
/* Now we are ready to install the string pointers and length. */
|
||||
for (n = 0; n < (1UL << cnt); ++n)
|
||||
result[n].len = 0;
|
||||
n = cnt;
|
||||
do
|
||||
{
|
||||
size_t mask = 1 << --n;
|
||||
|
||||
rp = result;
|
||||
for (m = 1 << cnt; m > 0; ++rp)
|
||||
if ((--m & mask) != 0)
|
||||
rp->len += temp[n].len + 1;
|
||||
}
|
||||
while (n != 0);
|
||||
|
||||
/* The first half of the strings all include the first string. */
|
||||
n = (1 << cnt) - 2;
|
||||
rp = &result[2];
|
||||
while (n != (1UL << (cnt - 1)))
|
||||
{
|
||||
if ((--n & 1) != 0)
|
||||
rp[0].str = rp[-2].str + rp[-2].len;
|
||||
else
|
||||
rp[0].str = rp[-1].str;
|
||||
++rp;
|
||||
}
|
||||
|
||||
/* The second half starts right after the first part of the string of
|
||||
the corresponding entry in the first half. */
|
||||
do
|
||||
{
|
||||
rp[0].str = rp[-(1 << (cnt - 1))].str + temp[cnt - 1].len + 1;
|
||||
++rp;
|
||||
}
|
||||
while (--n != 0);
|
||||
|
||||
/* The maximum string length. */
|
||||
*max_capstrlen = result[0].len;
|
||||
|
||||
return result;
|
||||
}
|
799
elf/dl-tls.c
Normal file
799
elf/dl-tls.c
Normal file
@ -0,0 +1,799 @@
|
||||
/* Thread-local storage handling in the ELF dynamic linker. Generic version.
|
||||
Copyright (C) 2002, 2003, 2004, 2005 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <assert.h>
|
||||
#include <errno.h>
|
||||
#include <libintl.h>
|
||||
#include <signal.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/param.h>
|
||||
|
||||
#include <tls.h>
|
||||
|
||||
/* We don't need any of this if TLS is not supported. */
|
||||
#ifdef USE_TLS
|
||||
|
||||
# include <dl-tls.h>
|
||||
# include <ldsodefs.h>
|
||||
|
||||
/* Amount of excess space to allocate in the static TLS area
|
||||
to allow dynamic loading of modules defining IE-model TLS data. */
|
||||
# define TLS_STATIC_SURPLUS 64 + DL_NNS * 100
|
||||
|
||||
/* Value used for dtv entries for which the allocation is delayed. */
|
||||
# define TLS_DTV_UNALLOCATED ((void *) -1l)
|
||||
|
||||
|
||||
/* Out-of-memory handler. */
|
||||
# ifdef SHARED
|
||||
static void
|
||||
__attribute__ ((__noreturn__))
|
||||
oom (void)
|
||||
{
|
||||
_dl_fatal_printf ("cannot allocate memory for thread-local data: ABORT\n");
|
||||
}
|
||||
# endif
|
||||
|
||||
|
||||
size_t
|
||||
internal_function
|
||||
_dl_next_tls_modid (void)
|
||||
{
|
||||
size_t result;
|
||||
|
||||
if (__builtin_expect (GL(dl_tls_dtv_gaps), false))
|
||||
{
|
||||
size_t disp = 0;
|
||||
struct dtv_slotinfo_list *runp = GL(dl_tls_dtv_slotinfo_list);
|
||||
|
||||
/* Note that this branch will never be executed during program
|
||||
start since there are no gaps at that time. Therefore it
|
||||
does not matter that the dl_tls_dtv_slotinfo is not allocated
|
||||
yet when the function is called for the first times.
|
||||
|
||||
NB: the offset +1 is due to the fact that DTV[0] is used
|
||||
for something else. */
|
||||
result = GL(dl_tls_static_nelem) + 1;
|
||||
if (result <= GL(dl_tls_max_dtv_idx))
|
||||
do
|
||||
{
|
||||
while (result - disp < runp->len)
|
||||
{
|
||||
if (runp->slotinfo[result - disp].map == NULL)
|
||||
break;
|
||||
|
||||
++result;
|
||||
assert (result <= GL(dl_tls_max_dtv_idx) + 1);
|
||||
}
|
||||
|
||||
if (result - disp < runp->len)
|
||||
break;
|
||||
|
||||
disp += runp->len;
|
||||
}
|
||||
while ((runp = runp->next) != NULL);
|
||||
|
||||
if (result > GL(dl_tls_max_dtv_idx))
|
||||
{
|
||||
/* The new index must indeed be exactly one higher than the
|
||||
previous high. */
|
||||
assert (result == GL(dl_tls_max_dtv_idx) + 1);
|
||||
/* There is no gap anymore. */
|
||||
GL(dl_tls_dtv_gaps) = false;
|
||||
|
||||
goto nogaps;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* No gaps, allocate a new entry. */
|
||||
nogaps:
|
||||
|
||||
result = ++GL(dl_tls_max_dtv_idx);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
# ifdef SHARED
|
||||
void
|
||||
internal_function
|
||||
_dl_determine_tlsoffset (void)
|
||||
{
|
||||
size_t max_align = TLS_TCB_ALIGN;
|
||||
size_t freetop = 0;
|
||||
size_t freebottom = 0;
|
||||
|
||||
/* The first element of the dtv slot info list is allocated. */
|
||||
assert (GL(dl_tls_dtv_slotinfo_list) != NULL);
|
||||
/* There is at this point only one element in the
|
||||
dl_tls_dtv_slotinfo_list list. */
|
||||
assert (GL(dl_tls_dtv_slotinfo_list)->next == NULL);
|
||||
|
||||
struct dtv_slotinfo *slotinfo = GL(dl_tls_dtv_slotinfo_list)->slotinfo;
|
||||
|
||||
/* Determining the offset of the various parts of the static TLS
|
||||
block has several dependencies. In addition we have to work
|
||||
around bugs in some toolchains.
|
||||
|
||||
Each TLS block from the objects available at link time has a size
|
||||
and an alignment requirement. The GNU ld computes the alignment
|
||||
requirements for the data at the positions *in the file*, though.
|
||||
I.e, it is not simply possible to allocate a block with the size
|
||||
of the TLS program header entry. The data is layed out assuming
|
||||
that the first byte of the TLS block fulfills
|
||||
|
||||
p_vaddr mod p_align == &TLS_BLOCK mod p_align
|
||||
|
||||
This means we have to add artificial padding at the beginning of
|
||||
the TLS block. These bytes are never used for the TLS data in
|
||||
this module but the first byte allocated must be aligned
|
||||
according to mod p_align == 0 so that the first byte of the TLS
|
||||
block is aligned according to p_vaddr mod p_align. This is ugly
|
||||
and the linker can help by computing the offsets in the TLS block
|
||||
assuming the first byte of the TLS block is aligned according to
|
||||
p_align.
|
||||
|
||||
The extra space which might be allocated before the first byte of
|
||||
the TLS block need not go unused. The code below tries to use
|
||||
that memory for the next TLS block. This can work if the total
|
||||
memory requirement for the next TLS block is smaller than the
|
||||
gap. */
|
||||
|
||||
# if TLS_TCB_AT_TP
|
||||
/* We simply start with zero. */
|
||||
size_t offset = 0;
|
||||
|
||||
for (size_t cnt = 0; slotinfo[cnt].map != NULL; ++cnt)
|
||||
{
|
||||
assert (cnt < GL(dl_tls_dtv_slotinfo_list)->len);
|
||||
|
||||
size_t firstbyte = (-slotinfo[cnt].map->l_tls_firstbyte_offset
|
||||
& (slotinfo[cnt].map->l_tls_align - 1));
|
||||
size_t off;
|
||||
max_align = MAX (max_align, slotinfo[cnt].map->l_tls_align);
|
||||
|
||||
if (freebottom - freetop >= slotinfo[cnt].map->l_tls_blocksize)
|
||||
{
|
||||
off = roundup (freetop + slotinfo[cnt].map->l_tls_blocksize
|
||||
- firstbyte, slotinfo[cnt].map->l_tls_align)
|
||||
+ firstbyte;
|
||||
if (off <= freebottom)
|
||||
{
|
||||
freetop = off;
|
||||
|
||||
/* XXX For some architectures we perhaps should store the
|
||||
negative offset. */
|
||||
slotinfo[cnt].map->l_tls_offset = off;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
off = roundup (offset + slotinfo[cnt].map->l_tls_blocksize - firstbyte,
|
||||
slotinfo[cnt].map->l_tls_align) + firstbyte;
|
||||
if (off > offset + slotinfo[cnt].map->l_tls_blocksize
|
||||
+ (freebottom - freetop))
|
||||
{
|
||||
freetop = offset;
|
||||
freebottom = off - slotinfo[cnt].map->l_tls_blocksize;
|
||||
}
|
||||
offset = off;
|
||||
|
||||
/* XXX For some architectures we perhaps should store the
|
||||
negative offset. */
|
||||
slotinfo[cnt].map->l_tls_offset = off;
|
||||
}
|
||||
|
||||
GL(dl_tls_static_used) = offset;
|
||||
GL(dl_tls_static_size) = (roundup (offset + TLS_STATIC_SURPLUS, max_align)
|
||||
+ TLS_TCB_SIZE);
|
||||
# elif TLS_DTV_AT_TP
|
||||
/* The TLS blocks start right after the TCB. */
|
||||
size_t offset = TLS_TCB_SIZE;
|
||||
|
||||
for (size_t cnt = 0; slotinfo[cnt].map != NULL; ++cnt)
|
||||
{
|
||||
assert (cnt < GL(dl_tls_dtv_slotinfo_list)->len);
|
||||
|
||||
size_t firstbyte = (-slotinfo[cnt].map->l_tls_firstbyte_offset
|
||||
& (slotinfo[cnt].map->l_tls_align - 1));
|
||||
size_t off;
|
||||
max_align = MAX (max_align, slotinfo[cnt].map->l_tls_align);
|
||||
|
||||
if (slotinfo[cnt].map->l_tls_blocksize <= freetop - freebottom)
|
||||
{
|
||||
off = roundup (freebottom, slotinfo[cnt].map->l_tls_align);
|
||||
if (off - freebottom < firstbyte)
|
||||
off += slotinfo[cnt].map->l_tls_align;
|
||||
if (off + slotinfo[cnt].map->l_tls_blocksize - firstbyte <= freetop)
|
||||
{
|
||||
slotinfo[cnt].map->l_tls_offset = off - firstbyte;
|
||||
freebottom = (off + slotinfo[cnt].map->l_tls_blocksize
|
||||
- firstbyte);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
off = roundup (offset, slotinfo[cnt].map->l_tls_align);
|
||||
if (off - offset < firstbyte)
|
||||
off += slotinfo[cnt].map->l_tls_align;
|
||||
|
||||
slotinfo[cnt].map->l_tls_offset = off - firstbyte;
|
||||
if (off - firstbyte - offset > freetop - freebottom)
|
||||
{
|
||||
freebottom = offset;
|
||||
freetop = off - firstbyte;
|
||||
}
|
||||
|
||||
offset = off + slotinfo[cnt].map->l_tls_blocksize - firstbyte;
|
||||
}
|
||||
|
||||
GL(dl_tls_static_used) = offset;
|
||||
GL(dl_tls_static_size) = roundup (offset + TLS_STATIC_SURPLUS,
|
||||
TLS_TCB_ALIGN);
|
||||
# else
|
||||
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
|
||||
# endif
|
||||
|
||||
/* The alignment requirement for the static TLS block. */
|
||||
GL(dl_tls_static_align) = max_align;
|
||||
}
|
||||
|
||||
|
||||
/* This is called only when the data structure setup was skipped at startup,
|
||||
when there was no need for it then. Now we have dynamically loaded
|
||||
something needing TLS, or libpthread needs it. */
|
||||
int
|
||||
internal_function
|
||||
_dl_tls_setup (void)
|
||||
{
|
||||
assert (GL(dl_tls_dtv_slotinfo_list) == NULL);
|
||||
assert (GL(dl_tls_max_dtv_idx) == 0);
|
||||
|
||||
const size_t nelem = 2 + TLS_SLOTINFO_SURPLUS;
|
||||
|
||||
GL(dl_tls_dtv_slotinfo_list)
|
||||
= calloc (1, (sizeof (struct dtv_slotinfo_list)
|
||||
+ nelem * sizeof (struct dtv_slotinfo)));
|
||||
if (GL(dl_tls_dtv_slotinfo_list) == NULL)
|
||||
return -1;
|
||||
|
||||
GL(dl_tls_dtv_slotinfo_list)->len = nelem;
|
||||
|
||||
/* Number of elements in the static TLS block. It can't be zero
|
||||
because of various assumptions. The one element is null. */
|
||||
GL(dl_tls_static_nelem) = GL(dl_tls_max_dtv_idx) = 1;
|
||||
|
||||
/* This initializes more variables for us. */
|
||||
_dl_determine_tlsoffset ();
|
||||
|
||||
return 0;
|
||||
}
|
||||
rtld_hidden_def (_dl_tls_setup)
|
||||
# endif
|
||||
|
||||
static void *
|
||||
internal_function
|
||||
allocate_dtv (void *result)
|
||||
{
|
||||
dtv_t *dtv;
|
||||
size_t dtv_length;
|
||||
|
||||
/* We allocate a few more elements in the dtv than are needed for the
|
||||
initial set of modules. This should avoid in most cases expansions
|
||||
of the dtv. */
|
||||
dtv_length = GL(dl_tls_max_dtv_idx) + DTV_SURPLUS;
|
||||
dtv = calloc (dtv_length + 2, sizeof (dtv_t));
|
||||
if (dtv != NULL)
|
||||
{
|
||||
/* This is the initial length of the dtv. */
|
||||
dtv[0].counter = dtv_length;
|
||||
|
||||
/* The rest of the dtv (including the generation counter) is
|
||||
Initialize with zero to indicate nothing there. */
|
||||
|
||||
/* Add the dtv to the thread data structures. */
|
||||
INSTALL_DTV (result, dtv);
|
||||
}
|
||||
else
|
||||
result = NULL;
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* Get size and alignment requirements of the static TLS block. */
|
||||
void
|
||||
internal_function
|
||||
_dl_get_tls_static_info (size_t *sizep, size_t *alignp)
|
||||
{
|
||||
*sizep = GL(dl_tls_static_size);
|
||||
*alignp = GL(dl_tls_static_align);
|
||||
}
|
||||
|
||||
|
||||
void *
|
||||
internal_function
|
||||
_dl_allocate_tls_storage (void)
|
||||
{
|
||||
void *result;
|
||||
size_t size = GL(dl_tls_static_size);
|
||||
|
||||
# if TLS_DTV_AT_TP
|
||||
/* Memory layout is:
|
||||
[ TLS_PRE_TCB_SIZE ] [ TLS_TCB_SIZE ] [ TLS blocks ]
|
||||
^ This should be returned. */
|
||||
size += (TLS_PRE_TCB_SIZE + GL(dl_tls_static_align) - 1)
|
||||
& ~(GL(dl_tls_static_align) - 1);
|
||||
# endif
|
||||
|
||||
/* Allocate a correctly aligned chunk of memory. */
|
||||
result = __libc_memalign (GL(dl_tls_static_align), size);
|
||||
if (__builtin_expect (result != NULL, 1))
|
||||
{
|
||||
/* Allocate the DTV. */
|
||||
void *allocated = result;
|
||||
|
||||
# if TLS_TCB_AT_TP
|
||||
/* The TCB follows the TLS blocks. */
|
||||
result = (char *) result + size - TLS_TCB_SIZE;
|
||||
|
||||
/* Clear the TCB data structure. We can't ask the caller (i.e.
|
||||
libpthread) to do it, because we will initialize the DTV et al. */
|
||||
memset (result, '\0', TLS_TCB_SIZE);
|
||||
# elif TLS_DTV_AT_TP
|
||||
result = (char *) result + size - GL(dl_tls_static_size);
|
||||
|
||||
/* Clear the TCB data structure and TLS_PRE_TCB_SIZE bytes before it.
|
||||
We can't ask the caller (i.e. libpthread) to do it, because we will
|
||||
initialize the DTV et al. */
|
||||
memset ((char *) result - TLS_PRE_TCB_SIZE, '\0',
|
||||
TLS_PRE_TCB_SIZE + TLS_TCB_SIZE);
|
||||
# endif
|
||||
|
||||
result = allocate_dtv (result);
|
||||
if (result == NULL)
|
||||
free (allocated);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
void *
|
||||
internal_function
|
||||
_dl_allocate_tls_init (void *result)
|
||||
{
|
||||
if (result == NULL)
|
||||
/* The memory allocation failed. */
|
||||
return NULL;
|
||||
|
||||
dtv_t *dtv = GET_DTV (result);
|
||||
struct dtv_slotinfo_list *listp;
|
||||
size_t total = 0;
|
||||
size_t maxgen = 0;
|
||||
|
||||
/* We have to prepare the dtv for all currently loaded modules using
|
||||
TLS. For those which are dynamically loaded we add the values
|
||||
indicating deferred allocation. */
|
||||
listp = GL(dl_tls_dtv_slotinfo_list);
|
||||
while (1)
|
||||
{
|
||||
size_t cnt;
|
||||
|
||||
for (cnt = total == 0 ? 1 : 0; cnt < listp->len; ++cnt)
|
||||
{
|
||||
struct link_map *map;
|
||||
void *dest;
|
||||
|
||||
/* Check for the total number of used slots. */
|
||||
if (total + cnt > GL(dl_tls_max_dtv_idx))
|
||||
break;
|
||||
|
||||
map = listp->slotinfo[cnt].map;
|
||||
if (map == NULL)
|
||||
/* Unused entry. */
|
||||
continue;
|
||||
|
||||
/* Keep track of the maximum generation number. This might
|
||||
not be the generation counter. */
|
||||
maxgen = MAX (maxgen, listp->slotinfo[cnt].gen);
|
||||
|
||||
if (map->l_tls_offset == NO_TLS_OFFSET)
|
||||
{
|
||||
/* For dynamically loaded modules we simply store
|
||||
the value indicating deferred allocation. */
|
||||
dtv[map->l_tls_modid].pointer.val = TLS_DTV_UNALLOCATED;
|
||||
dtv[map->l_tls_modid].pointer.is_static = false;
|
||||
continue;
|
||||
}
|
||||
|
||||
assert (map->l_tls_modid == cnt);
|
||||
assert (map->l_tls_blocksize >= map->l_tls_initimage_size);
|
||||
# if TLS_TCB_AT_TP
|
||||
assert ((size_t) map->l_tls_offset >= map->l_tls_blocksize);
|
||||
dest = (char *) result - map->l_tls_offset;
|
||||
# elif TLS_DTV_AT_TP
|
||||
dest = (char *) result + map->l_tls_offset;
|
||||
# else
|
||||
# error "Either TLS_TCB_AT_TP or TLS_DTV_AT_TP must be defined"
|
||||
# endif
|
||||
|
||||
/* Copy the initialization image and clear the BSS part. */
|
||||
dtv[map->l_tls_modid].pointer.val = dest;
|
||||
dtv[map->l_tls_modid].pointer.is_static = true;
|
||||
memset (__mempcpy (dest, map->l_tls_initimage,
|
||||
map->l_tls_initimage_size), '\0',
|
||||
map->l_tls_blocksize - map->l_tls_initimage_size);
|
||||
}
|
||||
|
||||
total += cnt;
|
||||
if (total >= GL(dl_tls_max_dtv_idx))
|
||||
break;
|
||||
|
||||
listp = listp->next;
|
||||
assert (listp != NULL);
|
||||
}
|
||||
|
||||
/* The DTV version is up-to-date now. */
|
||||
dtv[0].counter = maxgen;
|
||||
|
||||
return result;
|
||||
}
|
||||
rtld_hidden_def (_dl_allocate_tls_init)
|
||||
|
||||
void *
|
||||
internal_function
|
||||
_dl_allocate_tls (void *mem)
|
||||
{
|
||||
return _dl_allocate_tls_init (mem == NULL
|
||||
? _dl_allocate_tls_storage ()
|
||||
: allocate_dtv (mem));
|
||||
}
|
||||
rtld_hidden_def (_dl_allocate_tls)
|
||||
|
||||
|
||||
void
|
||||
internal_function
|
||||
_dl_deallocate_tls (void *tcb, bool dealloc_tcb)
|
||||
{
|
||||
dtv_t *dtv = GET_DTV (tcb);
|
||||
|
||||
/* We need to free the memory allocated for non-static TLS. */
|
||||
for (size_t cnt = 0; cnt < dtv[-1].counter; ++cnt)
|
||||
if (! dtv[1 + cnt].pointer.is_static
|
||||
&& dtv[1 + cnt].pointer.val != TLS_DTV_UNALLOCATED)
|
||||
free (dtv[1 + cnt].pointer.val);
|
||||
|
||||
/* The array starts with dtv[-1]. */
|
||||
#ifdef SHARED
|
||||
if (dtv != GL(dl_initial_dtv))
|
||||
#endif
|
||||
free (dtv - 1);
|
||||
|
||||
if (dealloc_tcb)
|
||||
{
|
||||
# if TLS_TCB_AT_TP
|
||||
/* The TCB follows the TLS blocks. Back up to free the whole block. */
|
||||
tcb -= GL(dl_tls_static_size) - TLS_TCB_SIZE;
|
||||
# elif TLS_DTV_AT_TP
|
||||
/* Back up the TLS_PRE_TCB_SIZE bytes. */
|
||||
tcb -= (TLS_PRE_TCB_SIZE + GL(dl_tls_static_align) - 1)
|
||||
& ~(GL(dl_tls_static_align) - 1);
|
||||
# endif
|
||||
free (tcb);
|
||||
}
|
||||
}
|
||||
rtld_hidden_def (_dl_deallocate_tls)
|
||||
|
||||
|
||||
# ifdef SHARED
|
||||
/* The __tls_get_addr function has two basic forms which differ in the
|
||||
arguments. The IA-64 form takes two parameters, the module ID and
|
||||
offset. The form used, among others, on IA-32 takes a reference to
|
||||
a special structure which contain the same information. The second
|
||||
form seems to be more often used (in the moment) so we default to
|
||||
it. Users of the IA-64 form have to provide adequate definitions
|
||||
of the following macros. */
|
||||
# ifndef GET_ADDR_ARGS
|
||||
# define GET_ADDR_ARGS tls_index *ti
|
||||
# endif
|
||||
# ifndef GET_ADDR_MODULE
|
||||
# define GET_ADDR_MODULE ti->ti_module
|
||||
# endif
|
||||
# ifndef GET_ADDR_OFFSET
|
||||
# define GET_ADDR_OFFSET ti->ti_offset
|
||||
# endif
|
||||
|
||||
|
||||
static void *
|
||||
allocate_and_init (struct link_map *map)
|
||||
{
|
||||
void *newp;
|
||||
|
||||
newp = __libc_memalign (map->l_tls_align, map->l_tls_blocksize);
|
||||
if (newp == NULL)
|
||||
oom ();
|
||||
|
||||
/* Initialize the memory. */
|
||||
memset (__mempcpy (newp, map->l_tls_initimage, map->l_tls_initimage_size),
|
||||
'\0', map->l_tls_blocksize - map->l_tls_initimage_size);
|
||||
|
||||
return newp;
|
||||
}
|
||||
|
||||
|
||||
struct link_map *
|
||||
_dl_update_slotinfo (unsigned long int req_modid)
|
||||
{
|
||||
struct link_map *the_map = NULL;
|
||||
dtv_t *dtv = THREAD_DTV ();
|
||||
|
||||
/* The global dl_tls_dtv_slotinfo array contains for each module
|
||||
index the generation counter current when the entry was created.
|
||||
This array never shrinks so that all module indices which were
|
||||
valid at some time can be used to access it. Before the first
|
||||
use of a new module index in this function the array was extended
|
||||
appropriately. Access also does not have to be guarded against
|
||||
modifications of the array. It is assumed that pointer-size
|
||||
values can be read atomically even in SMP environments. It is
|
||||
possible that other threads at the same time dynamically load
|
||||
code and therefore add to the slotinfo list. This is a problem
|
||||
since we must not pick up any information about incomplete work.
|
||||
The solution to this is to ignore all dtv slots which were
|
||||
created after the one we are currently interested. We know that
|
||||
dynamic loading for this module is completed and this is the last
|
||||
load operation we know finished. */
|
||||
unsigned long int idx = req_modid;
|
||||
struct dtv_slotinfo_list *listp = GL(dl_tls_dtv_slotinfo_list);
|
||||
|
||||
while (idx >= listp->len)
|
||||
{
|
||||
idx -= listp->len;
|
||||
listp = listp->next;
|
||||
}
|
||||
|
||||
if (dtv[0].counter < listp->slotinfo[idx].gen)
|
||||
{
|
||||
/* The generation counter for the slot is higher than what the
|
||||
current dtv implements. We have to update the whole dtv but
|
||||
only those entries with a generation counter <= the one for
|
||||
the entry we need. */
|
||||
size_t new_gen = listp->slotinfo[idx].gen;
|
||||
size_t total = 0;
|
||||
|
||||
/* We have to look through the entire dtv slotinfo list. */
|
||||
listp = GL(dl_tls_dtv_slotinfo_list);
|
||||
do
|
||||
{
|
||||
for (size_t cnt = total == 0 ? 1 : 0; cnt < listp->len; ++cnt)
|
||||
{
|
||||
size_t gen = listp->slotinfo[cnt].gen;
|
||||
|
||||
if (gen > new_gen)
|
||||
/* This is a slot for a generation younger than the
|
||||
one we are handling now. It might be incompletely
|
||||
set up so ignore it. */
|
||||
continue;
|
||||
|
||||
/* If the entry is older than the current dtv layout we
|
||||
know we don't have to handle it. */
|
||||
if (gen <= dtv[0].counter)
|
||||
continue;
|
||||
|
||||
/* If there is no map this means the entry is empty. */
|
||||
struct link_map *map = listp->slotinfo[cnt].map;
|
||||
if (map == NULL)
|
||||
{
|
||||
/* If this modid was used at some point the memory
|
||||
might still be allocated. */
|
||||
if (! dtv[total + cnt].pointer.is_static
|
||||
&& dtv[total + cnt].pointer.val != TLS_DTV_UNALLOCATED)
|
||||
{
|
||||
free (dtv[total + cnt].pointer.val);
|
||||
dtv[total + cnt].pointer.val = TLS_DTV_UNALLOCATED;
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check whether the current dtv array is large enough. */
|
||||
size_t modid = map->l_tls_modid;
|
||||
assert (total + cnt == modid);
|
||||
if (dtv[-1].counter < modid)
|
||||
{
|
||||
/* Reallocate the dtv. */
|
||||
dtv_t *newp;
|
||||
size_t newsize = GL(dl_tls_max_dtv_idx) + DTV_SURPLUS;
|
||||
size_t oldsize = dtv[-1].counter;
|
||||
|
||||
assert (map->l_tls_modid <= newsize);
|
||||
|
||||
if (dtv == GL(dl_initial_dtv))
|
||||
{
|
||||
/* This is the initial dtv that was allocated
|
||||
during rtld startup using the dl-minimal.c
|
||||
malloc instead of the real malloc. We can't
|
||||
free it, we have to abandon the old storage. */
|
||||
|
||||
newp = malloc ((2 + newsize) * sizeof (dtv_t));
|
||||
if (newp == NULL)
|
||||
oom ();
|
||||
memcpy (newp, &dtv[-1], oldsize * sizeof (dtv_t));
|
||||
}
|
||||
else
|
||||
{
|
||||
newp = realloc (&dtv[-1],
|
||||
(2 + newsize) * sizeof (dtv_t));
|
||||
if (newp == NULL)
|
||||
oom ();
|
||||
}
|
||||
|
||||
newp[0].counter = newsize;
|
||||
|
||||
/* Clear the newly allocated part. */
|
||||
memset (newp + 2 + oldsize, '\0',
|
||||
(newsize - oldsize) * sizeof (dtv_t));
|
||||
|
||||
/* Point dtv to the generation counter. */
|
||||
dtv = &newp[1];
|
||||
|
||||
/* Install this new dtv in the thread data
|
||||
structures. */
|
||||
INSTALL_NEW_DTV (dtv);
|
||||
}
|
||||
|
||||
/* If there is currently memory allocate for this
|
||||
dtv entry free it. */
|
||||
/* XXX Ideally we will at some point create a memory
|
||||
pool. */
|
||||
if (! dtv[modid].pointer.is_static
|
||||
&& dtv[modid].pointer.val != TLS_DTV_UNALLOCATED)
|
||||
/* Note that free is called for NULL is well. We
|
||||
deallocate even if it is this dtv entry we are
|
||||
supposed to load. The reason is that we call
|
||||
memalign and not malloc. */
|
||||
free (dtv[modid].pointer.val);
|
||||
|
||||
/* This module is loaded dynamically- We defer memory
|
||||
allocation. */
|
||||
dtv[modid].pointer.is_static = false;
|
||||
dtv[modid].pointer.val = TLS_DTV_UNALLOCATED;
|
||||
|
||||
if (modid == req_modid)
|
||||
the_map = map;
|
||||
}
|
||||
|
||||
total += listp->len;
|
||||
}
|
||||
while ((listp = listp->next) != NULL);
|
||||
|
||||
/* This will be the new maximum generation counter. */
|
||||
dtv[0].counter = new_gen;
|
||||
}
|
||||
|
||||
return the_map;
|
||||
}
|
||||
|
||||
|
||||
/* The generic dynamic and local dynamic model cannot be used in
|
||||
statically linked applications. */
|
||||
void *
|
||||
__tls_get_addr (GET_ADDR_ARGS)
|
||||
{
|
||||
dtv_t *dtv = THREAD_DTV ();
|
||||
struct link_map *the_map = NULL;
|
||||
void *p;
|
||||
|
||||
if (__builtin_expect (dtv[0].counter != GL(dl_tls_generation), 0))
|
||||
the_map = _dl_update_slotinfo (GET_ADDR_MODULE);
|
||||
|
||||
p = dtv[GET_ADDR_MODULE].pointer.val;
|
||||
|
||||
if (__builtin_expect (p == TLS_DTV_UNALLOCATED, 0))
|
||||
{
|
||||
/* The allocation was deferred. Do it now. */
|
||||
if (the_map == NULL)
|
||||
{
|
||||
/* Find the link map for this module. */
|
||||
size_t idx = GET_ADDR_MODULE;
|
||||
struct dtv_slotinfo_list *listp = GL(dl_tls_dtv_slotinfo_list);
|
||||
|
||||
while (idx >= listp->len)
|
||||
{
|
||||
idx -= listp->len;
|
||||
listp = listp->next;
|
||||
}
|
||||
|
||||
the_map = listp->slotinfo[idx].map;
|
||||
}
|
||||
|
||||
p = dtv[GET_ADDR_MODULE].pointer.val = allocate_and_init (the_map);
|
||||
dtv[GET_ADDR_MODULE].pointer.is_static = false;
|
||||
}
|
||||
|
||||
return (char *) p + GET_ADDR_OFFSET;
|
||||
}
|
||||
# endif
|
||||
|
||||
|
||||
|
||||
void
|
||||
_dl_add_to_slotinfo (struct link_map *l)
|
||||
{
|
||||
/* Now that we know the object is loaded successfully add
|
||||
modules containing TLS data to the dtv info table. We
|
||||
might have to increase its size. */
|
||||
struct dtv_slotinfo_list *listp;
|
||||
struct dtv_slotinfo_list *prevp;
|
||||
size_t idx = l->l_tls_modid;
|
||||
|
||||
/* Find the place in the dtv slotinfo list. */
|
||||
listp = GL(dl_tls_dtv_slotinfo_list);
|
||||
prevp = NULL; /* Needed to shut up gcc. */
|
||||
do
|
||||
{
|
||||
/* Does it fit in the array of this list element? */
|
||||
if (idx < listp->len)
|
||||
break;
|
||||
idx -= listp->len;
|
||||
prevp = listp;
|
||||
listp = listp->next;
|
||||
}
|
||||
while (listp != NULL);
|
||||
|
||||
if (listp == NULL)
|
||||
{
|
||||
/* When we come here it means we have to add a new element
|
||||
to the slotinfo list. And the new module must be in
|
||||
the first slot. */
|
||||
assert (idx == 0);
|
||||
|
||||
listp = prevp->next = (struct dtv_slotinfo_list *)
|
||||
malloc (sizeof (struct dtv_slotinfo_list)
|
||||
+ TLS_SLOTINFO_SURPLUS * sizeof (struct dtv_slotinfo));
|
||||
if (listp == NULL)
|
||||
{
|
||||
/* We ran out of memory. We will simply fail this
|
||||
call but don't undo anything we did so far. The
|
||||
application will crash or be terminated anyway very
|
||||
soon. */
|
||||
|
||||
/* We have to do this since some entries in the dtv
|
||||
slotinfo array might already point to this
|
||||
generation. */
|
||||
++GL(dl_tls_generation);
|
||||
|
||||
_dl_signal_error (ENOMEM, "dlopen", NULL, N_("\
|
||||
cannot create TLS data structures"));
|
||||
}
|
||||
|
||||
listp->len = TLS_SLOTINFO_SURPLUS;
|
||||
listp->next = NULL;
|
||||
memset (listp->slotinfo, '\0',
|
||||
TLS_SLOTINFO_SURPLUS * sizeof (struct dtv_slotinfo));
|
||||
}
|
||||
|
||||
/* Add the information into the slotinfo data structure. */
|
||||
listp->slotinfo[idx].map = l;
|
||||
listp->slotinfo[idx].gen = GL(dl_tls_generation) + 1;
|
||||
}
|
||||
#endif /* use TLS */
|
1
elf/dl-trampoline.c
Normal file
1
elf/dl-trampoline.c
Normal file
@ -0,0 +1 @@
|
||||
#error "Architecture specific PLT trampolines must be defined."
|
54
gmon/bb_init_func.c
Normal file
54
gmon/bb_init_func.c
Normal file
@ -0,0 +1,54 @@
|
||||
/* Copyright (C) 1996, 1997, 2001 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by David Mosberger (davidm@cs.arizona.edu).
|
||||
|
||||
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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
/* __bb_init_func is invoked at the beginning of each function, before
|
||||
any registers have been saved. This generic routine should work
|
||||
provided that calling this function doesn't mangle the arguments
|
||||
passed to the function being called. If that's not the case, a
|
||||
system specific routine must be provided. */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/gmon.h>
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
void
|
||||
__bb_init_func (struct __bb *bb)
|
||||
{
|
||||
struct gmonparam *p = &_gmonparam;
|
||||
|
||||
if (bb->zero_word != 0)
|
||||
{
|
||||
return; /* handle common case quickly */
|
||||
}
|
||||
|
||||
/* insert this basic-block into basic-block list: */
|
||||
bb->zero_word = 1;
|
||||
bb->next = __bb_head;
|
||||
__bb_head = bb;
|
||||
|
||||
if (bb->next == 0 && p->state != GMON_PROF_ON)
|
||||
{
|
||||
/* we didn't register _mcleanup yet and pc profiling doesn't seem
|
||||
to be active, so let's register it now: */
|
||||
extern void *__dso_handle __attribute__ ((__weak__));
|
||||
__cxa_atexit ((void (*) (void *)) _mcleanup, NULL,
|
||||
&__dso_handle ? __dso_handle : NULL);
|
||||
}
|
||||
}
|
50
inet/check_pf.c
Normal file
50
inet/check_pf.c
Normal file
@ -0,0 +1,50 @@
|
||||
/* Determine protocol families for which interfaces exist. Generic version.
|
||||
Copyright (C) 2003 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <ifaddrs.h>
|
||||
#include <netdb.h>
|
||||
|
||||
|
||||
void
|
||||
attribute_hidden
|
||||
__check_pf (bool *seen_ipv4, bool *seen_ipv6)
|
||||
{
|
||||
/* Get the interface list via getifaddrs. */
|
||||
struct ifaddrs *ifa = NULL;
|
||||
if (getifaddrs (&ifa) != 0)
|
||||
{
|
||||
/* We cannot determine what interfaces are available. Be
|
||||
pessimistic. */
|
||||
*seen_ipv4 = true;
|
||||
*seen_ipv6 = true;
|
||||
return;
|
||||
}
|
||||
|
||||
*seen_ipv4 = false;
|
||||
*seen_ipv6 = false;
|
||||
|
||||
struct ifaddrs *runp;
|
||||
for (runp = ifa; runp != NULL; runp = runp->ifa_next)
|
||||
if (runp->ifa_addr->sa_family == PF_INET)
|
||||
*seen_ipv4 = true;
|
||||
else if (runp->ifa_addr->sa_family == PF_INET6)
|
||||
*seen_ipv6 = true;
|
||||
|
||||
(void) freeifaddrs (ifa);
|
||||
}
|
41
io/access.c
Normal file
41
io/access.c
Normal file
@ -0,0 +1,41 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stddef.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* Test for access to FILE. */
|
||||
int
|
||||
__access (file, type)
|
||||
const char *file;
|
||||
int type;
|
||||
{
|
||||
if (file == NULL || (type & ~(R_OK|W_OK|X_OK|F_OK)) != 0)
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
stub_warning (access)
|
||||
|
||||
weak_alias (__access, access)
|
||||
#include <stub-tag.h>
|
40
io/chdir.c
Normal file
40
io/chdir.c
Normal file
@ -0,0 +1,40 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stddef.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* Change the current directory to PATH. */
|
||||
int
|
||||
__chdir (path)
|
||||
const char *path;
|
||||
{
|
||||
if (path == NULL)
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
stub_warning (chdir)
|
||||
|
||||
weak_alias (__chdir, chdir)
|
||||
#include <stub-tag.h>
|
42
io/chmod.c
Normal file
42
io/chmod.c
Normal file
@ -0,0 +1,42 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stddef.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
/* Change the protections of FILE to MODE. */
|
||||
int
|
||||
__chmod (file, mode)
|
||||
const char *file;
|
||||
mode_t mode;
|
||||
{
|
||||
if (file == NULL)
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
stub_warning (chmod)
|
||||
|
||||
weak_alias (__chmod, chmod)
|
||||
#include <stub-tag.h>
|
45
io/chown.c
Normal file
45
io/chown.c
Normal file
@ -0,0 +1,45 @@
|
||||
/* Copyright (C) 1991, 1992, 1995, 1996, 1997, 2002
|
||||
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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stddef.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
/* Change the owner and group of FILE. */
|
||||
int
|
||||
__chown (file, owner, group)
|
||||
const char *file;
|
||||
uid_t owner;
|
||||
gid_t group;
|
||||
{
|
||||
if (file == NULL)
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
libc_hidden_def (__chown)
|
||||
stub_warning (chown)
|
||||
|
||||
weak_alias (__chown, chown)
|
||||
#include <stub-tag.h>
|
40
io/close.c
Normal file
40
io/close.c
Normal file
@ -0,0 +1,40 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997, 2002 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* Close the file descriptor FD. */
|
||||
int
|
||||
__close (fd)
|
||||
int fd;
|
||||
{
|
||||
if (fd < 0)
|
||||
{
|
||||
__set_errno (EBADF);
|
||||
return -1;
|
||||
}
|
||||
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
libc_hidden_def (__close)
|
||||
stub_warning (close)
|
||||
|
||||
weak_alias (__close, close)
|
||||
#include <stub-tag.h>
|
36
io/creat.c
Normal file
36
io/creat.c
Normal file
@ -0,0 +1,36 @@
|
||||
/* Copyright (C) 1991, 1996, 1997, 2003 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <sys/types.h>
|
||||
#include <sysdep-cancel.h>
|
||||
|
||||
#undef creat
|
||||
|
||||
/* Create FILE with protections MODE. */
|
||||
int
|
||||
__libc_creat (file, mode)
|
||||
const char *file;
|
||||
mode_t mode;
|
||||
{
|
||||
return __open (file, O_WRONLY|O_CREAT|O_TRUNC, mode);
|
||||
}
|
||||
weak_alias (__libc_creat, creat)
|
||||
|
||||
/* __open handles cancellation. */
|
||||
LIBC_CANCEL_HANDLED ();
|
31
io/creat64.c
Normal file
31
io/creat64.c
Normal file
@ -0,0 +1,31 @@
|
||||
/* Copyright (C) 1991, 1996, 1997 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#undef creat
|
||||
|
||||
/* Create FILE with protections MODE. */
|
||||
int
|
||||
creat64 (file, mode)
|
||||
const char *file;
|
||||
mode_t mode;
|
||||
{
|
||||
return __open64 (file, O_WRONLY|O_CREAT|O_TRUNC, mode);
|
||||
}
|
34
io/dup.c
Normal file
34
io/dup.c
Normal file
@ -0,0 +1,34 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* Duplicate FD, returning a new file descriptor open on the same file. */
|
||||
int
|
||||
__dup (fd)
|
||||
int fd;
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
stub_warning (dup)
|
||||
|
||||
weak_alias (__dup, dup)
|
||||
#include <stub-tag.h>
|
48
io/dup2.c
Normal file
48
io/dup2.c
Normal file
@ -0,0 +1,48 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997, 2002 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
/* Duplicate FD to FD2, closing the old FD2 and making FD2 be
|
||||
open the same file as FD is. Return FD2 or -1. */
|
||||
int
|
||||
__dup2 (fd, fd2)
|
||||
int fd;
|
||||
int fd2;
|
||||
{
|
||||
if (fd < 0 || fd2 < 0)
|
||||
{
|
||||
__set_errno (EBADF);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (fd == fd2)
|
||||
/* No way to check that they are valid. */
|
||||
return fd2;
|
||||
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
libc_hidden_def (__dup2)
|
||||
stub_warning (dup2)
|
||||
|
||||
weak_alias (__dup2, dup2)
|
||||
#include <stub-tag.h>
|
@ -1,27 +1,56 @@
|
||||
/* ANSI-C code produced by gperf version 2.7.2 */
|
||||
/* ANSI-C code produced by gperf version 3.0.1 */
|
||||
/* Command-line: gperf -acCgopt -k'1,2,5,9,$' -L ANSI-C -N charmap_hash programs/charmap-kw.gperf */
|
||||
/* Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
|
||||
|
||||
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
|
||||
&& ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
|
||||
&& (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
|
||||
&& ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
|
||||
&& ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
|
||||
&& ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
|
||||
&& ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
|
||||
&& ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
|
||||
&& ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
|
||||
&& ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
|
||||
&& ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
|
||||
&& ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
|
||||
&& ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
|
||||
&& ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
|
||||
&& ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
|
||||
&& ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
|
||||
&& ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
|
||||
&& ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
|
||||
&& ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
|
||||
&& ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
|
||||
&& ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
|
||||
&& ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
|
||||
&& ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
|
||||
/* The character set is not based on ISO-646. */
|
||||
#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
|
||||
#endif
|
||||
|
||||
#line 1 "programs/charmap-kw.gperf"
|
||||
|
||||
/* Copyright (C) 1995,1996,1997,1998,1999,2005 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper, <drepper@gnu.org>.
|
||||
|
||||
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.
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 2 as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
This program 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.
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "locfile-token.h"
|
||||
#line 23 "programs/charmap-kw.gperf"
|
||||
struct keyword_t ;
|
||||
|
||||
#define TOTAL_KEYWORDS 17
|
||||
@ -47,15 +76,15 @@ hash (register const char *str, register unsigned int len)
|
||||
36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
|
||||
36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
|
||||
36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
|
||||
36, 36, 36, 36, 36, 36, 36, 36, 25, 10,
|
||||
15, 20, 36, 36, 36, 36, 36, 36, 36, 36,
|
||||
36, 36, 36, 36, 36, 36, 36, 10, 0, 0,
|
||||
5, 36, 0, 0, 36, 36, 36, 0, 0, 36,
|
||||
36, 36, 36, 36, 36, 36, 36, 36, 25, 20,
|
||||
15, 10, 36, 36, 36, 36, 36, 36, 36, 36,
|
||||
36, 36, 36, 36, 36, 36, 36, 5, 0, 0,
|
||||
5, 36, 0, 0, 36, 36, 36, 5, 0, 36,
|
||||
0, 36, 0, 36, 0, 36, 36, 0, 36, 36,
|
||||
36, 36, 36, 36, 36, 0, 36, 0, 0, 0,
|
||||
10, 0, 36, 0, 0, 0, 36, 36, 36, 0,
|
||||
36, 36, 36, 36, 36, 0, 36, 5, 0, 0,
|
||||
5, 0, 36, 5, 0, 0, 36, 36, 36, 0,
|
||||
0, 0, 0, 0, 0, 0, 0, 0, 36, 36,
|
||||
25, 36, 36, 36, 36, 36, 36, 36, 36, 36,
|
||||
0, 36, 36, 36, 36, 36, 36, 36, 36, 36,
|
||||
36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
|
||||
36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
|
||||
36, 36, 36, 36, 36, 36, 36, 36, 36, 36,
|
||||
@ -75,17 +104,19 @@ hash (register const char *str, register unsigned int len)
|
||||
switch (hval)
|
||||
{
|
||||
default:
|
||||
case 9:
|
||||
hval += asso_values[(unsigned char)str[8]];
|
||||
/*FALLTHROUGH*/
|
||||
case 8:
|
||||
case 7:
|
||||
case 6:
|
||||
case 5:
|
||||
hval += asso_values[(unsigned char)str[4]];
|
||||
/*FALLTHROUGH*/
|
||||
case 4:
|
||||
case 3:
|
||||
case 2:
|
||||
hval += asso_values[(unsigned char)str[1]];
|
||||
/*FALLTHROUGH*/
|
||||
case 1:
|
||||
hval += asso_values[(unsigned char)str[0]];
|
||||
break;
|
||||
@ -102,29 +133,46 @@ charmap_hash (register const char *str, register unsigned int len)
|
||||
static const struct keyword_t wordlist[] =
|
||||
{
|
||||
{""}, {""}, {""},
|
||||
#line 38 "programs/charmap-kw.gperf"
|
||||
{"END", tok_end, 0},
|
||||
{""},
|
||||
#line 39 "programs/charmap-kw.gperf"
|
||||
{"WIDTH", tok_width, 0},
|
||||
#line 34 "programs/charmap-kw.gperf"
|
||||
{"escseq", tok_escseq, 1},
|
||||
#line 36 "programs/charmap-kw.gperf"
|
||||
{"include", tok_include, 1},
|
||||
{""}, {""},
|
||||
#line 27 "programs/charmap-kw.gperf"
|
||||
{"mb_cur_min", tok_mb_cur_min, 1},
|
||||
#line 28 "programs/charmap-kw.gperf"
|
||||
{"escape_char", tok_escape_char, 1},
|
||||
#line 29 "programs/charmap-kw.gperf"
|
||||
{"comment_char", tok_comment_char, 1},
|
||||
#line 25 "programs/charmap-kw.gperf"
|
||||
{"code_set_name", tok_code_set_name, 1},
|
||||
#line 40 "programs/charmap-kw.gperf"
|
||||
{"WIDTH_VARIABLE", tok_width_variable, 0},
|
||||
{"g1esc", tok_g1esc, 1},
|
||||
#line 26 "programs/charmap-kw.gperf"
|
||||
{"mb_cur_max", tok_mb_cur_max, 1},
|
||||
#line 35 "programs/charmap-kw.gperf"
|
||||
{"addset", tok_addset, 1},
|
||||
#line 37 "programs/charmap-kw.gperf"
|
||||
{"CHARMAP", tok_charmap, 0},
|
||||
#line 41 "programs/charmap-kw.gperf"
|
||||
{"WIDTH_DEFAULT", tok_width_default, 0},
|
||||
{""},
|
||||
{"g2esc", tok_g2esc, 1},
|
||||
{""}, {""}, {""}, {""},
|
||||
#line 33 "programs/charmap-kw.gperf"
|
||||
{"g3esc", tok_g3esc, 1},
|
||||
{""}, {""}, {""}, {""},
|
||||
{"g0esc", tok_g0esc, 1},
|
||||
#line 32 "programs/charmap-kw.gperf"
|
||||
{"g2esc", tok_g2esc, 1},
|
||||
{""}, {""}, {""}, {""},
|
||||
{"mb_cur_max", tok_mb_cur_max, 1}
|
||||
#line 31 "programs/charmap-kw.gperf"
|
||||
{"g1esc", tok_g1esc, 1},
|
||||
{""}, {""}, {""}, {""},
|
||||
#line 30 "programs/charmap-kw.gperf"
|
||||
{"g0esc", tok_g0esc, 1}
|
||||
};
|
||||
|
||||
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
|
||||
|
@ -1,35 +1,64 @@
|
||||
/* ANSI-C code produced by gperf version 2.7.2 */
|
||||
/* ANSI-C code produced by gperf version 3.0.1 */
|
||||
/* Command-line: gperf -acCgopt -k'1,2,5,9,$' -L ANSI-C -N locfile_hash programs/locfile-kw.gperf */
|
||||
/* Copyright (C) 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
|
||||
|
||||
#if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
|
||||
&& ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \
|
||||
&& (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \
|
||||
&& ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \
|
||||
&& ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \
|
||||
&& ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \
|
||||
&& ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \
|
||||
&& ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \
|
||||
&& ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \
|
||||
&& ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \
|
||||
&& ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \
|
||||
&& ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \
|
||||
&& ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \
|
||||
&& ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \
|
||||
&& ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \
|
||||
&& ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \
|
||||
&& ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \
|
||||
&& ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \
|
||||
&& ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \
|
||||
&& ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \
|
||||
&& ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \
|
||||
&& ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \
|
||||
&& ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126))
|
||||
/* The character set is not based on ISO-646. */
|
||||
#error "gperf generated tables don't work with this execution character set. Please report a bug to <bug-gnu-gperf@gnu.org>."
|
||||
#endif
|
||||
|
||||
#line 1 "programs/locfile-kw.gperf"
|
||||
|
||||
/* Copyright (C) 1996,1997,1998,1999,2000,2005 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@gnu.org>, 1996.
|
||||
|
||||
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.
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License version 2 as
|
||||
published by the Free Software Foundation.
|
||||
|
||||
The GNU C Library is distributed in the hope that it will be useful,
|
||||
This program 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.
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software Foundation,
|
||||
Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "locfile-token.h"
|
||||
#line 23 "programs/locfile-kw.gperf"
|
||||
struct keyword_t ;
|
||||
|
||||
#define TOTAL_KEYWORDS 175
|
||||
#define MIN_WORD_LENGTH 3
|
||||
#define MAX_WORD_LENGTH 22
|
||||
#define MIN_HASH_VALUE 3
|
||||
#define MAX_HASH_VALUE 687
|
||||
/* maximum key range = 685, duplicates = 0 */
|
||||
#define MAX_HASH_VALUE 610
|
||||
/* maximum key range = 608, duplicates = 0 */
|
||||
|
||||
#ifdef __GNUC__
|
||||
__inline
|
||||
@ -43,49 +72,51 @@ hash (register const char *str, register unsigned int len)
|
||||
{
|
||||
static const unsigned short asso_values[] =
|
||||
{
|
||||
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
|
||||
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
|
||||
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
|
||||
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
|
||||
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
|
||||
5, 0, 688, 688, 688, 688, 688, 688, 688, 688,
|
||||
688, 688, 688, 688, 688, 15, 688, 0, 0, 0,
|
||||
5, 0, 0, 0, 688, 688, 0, 688, 0, 5,
|
||||
688, 688, 15, 0, 5, 15, 688, 688, 688, 0,
|
||||
688, 688, 688, 688, 688, 75, 688, 0, 0, 65,
|
||||
5, 0, 85, 40, 5, 155, 688, 10, 105, 120,
|
||||
125, 35, 5, 20, 5, 190, 0, 125, 35, 10,
|
||||
30, 35, 0, 688, 688, 688, 688, 688, 688, 688,
|
||||
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
|
||||
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
|
||||
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
|
||||
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
|
||||
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
|
||||
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
|
||||
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
|
||||
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
|
||||
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
|
||||
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
|
||||
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
|
||||
688, 688, 688, 688, 688, 688, 688, 688, 688, 688,
|
||||
688, 688, 688, 688, 688, 688
|
||||
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
|
||||
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
|
||||
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
|
||||
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
|
||||
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
|
||||
5, 0, 611, 611, 611, 611, 611, 611, 611, 611,
|
||||
611, 611, 611, 611, 611, 5, 611, 0, 0, 0,
|
||||
0, 0, 10, 0, 611, 611, 0, 611, 0, 5,
|
||||
611, 611, 0, 0, 0, 10, 611, 611, 611, 0,
|
||||
611, 611, 611, 611, 611, 0, 611, 145, 105, 25,
|
||||
15, 0, 190, 110, 10, 35, 611, 0, 80, 65,
|
||||
5, 130, 40, 50, 5, 0, 10, 35, 50, 20,
|
||||
5, 10, 0, 611, 611, 611, 611, 611, 611, 611,
|
||||
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
|
||||
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
|
||||
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
|
||||
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
|
||||
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
|
||||
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
|
||||
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
|
||||
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
|
||||
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
|
||||
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
|
||||
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
|
||||
611, 611, 611, 611, 611, 611, 611, 611, 611, 611,
|
||||
611, 611, 611, 611, 611, 611
|
||||
};
|
||||
register int hval = len;
|
||||
|
||||
switch (hval)
|
||||
{
|
||||
default:
|
||||
case 9:
|
||||
hval += asso_values[(unsigned char)str[8]];
|
||||
/*FALLTHROUGH*/
|
||||
case 8:
|
||||
case 7:
|
||||
case 6:
|
||||
case 5:
|
||||
hval += asso_values[(unsigned char)str[4]];
|
||||
/*FALLTHROUGH*/
|
||||
case 4:
|
||||
case 3:
|
||||
case 2:
|
||||
hval += asso_values[(unsigned char)str[1]];
|
||||
/*FALLTHROUGH*/
|
||||
case 1:
|
||||
hval += asso_values[(unsigned char)str[0]];
|
||||
break;
|
||||
@ -102,314 +133,470 @@ locfile_hash (register const char *str, register unsigned int len)
|
||||
static const struct keyword_t wordlist[] =
|
||||
{
|
||||
{""}, {""}, {""},
|
||||
#line 30 "programs/locfile-kw.gperf"
|
||||
{"END", tok_end, 0},
|
||||
{""}, {""}, {""},
|
||||
{"LC_TIME", tok_lc_time, 0},
|
||||
{"era", tok_era, 0},
|
||||
{"date", tok_date, 0},
|
||||
{"LC_ADDRESS", tok_lc_address, 0},
|
||||
{"LC_MESSAGES", tok_lc_messages, 0},
|
||||
{"LC_TELEPHONE", tok_lc_telephone, 0},
|
||||
{"LC_CTYPE", tok_lc_ctype, 0},
|
||||
{"era_t_fmt", tok_era_t_fmt, 0},
|
||||
{"print", tok_print, 0},
|
||||
{"height", tok_height, 0},
|
||||
{"LC_IDENTIFICATION", tok_lc_identification, 0},
|
||||
{""},
|
||||
{"era_d_fmt", tok_era_d_fmt, 0},
|
||||
{"LC_COLLATE", tok_lc_collate, 0},
|
||||
{""}, {""},
|
||||
#line 69 "programs/locfile-kw.gperf"
|
||||
{"IGNORE", tok_ignore, 0},
|
||||
#line 127 "programs/locfile-kw.gperf"
|
||||
{"LC_TIME", tok_lc_time, 0},
|
||||
#line 29 "programs/locfile-kw.gperf"
|
||||
{"LC_CTYPE", tok_lc_ctype, 0},
|
||||
{""},
|
||||
#line 164 "programs/locfile-kw.gperf"
|
||||
{"LC_ADDRESS", tok_lc_address, 0},
|
||||
#line 149 "programs/locfile-kw.gperf"
|
||||
{"LC_MESSAGES", tok_lc_messages, 0},
|
||||
#line 157 "programs/locfile-kw.gperf"
|
||||
{"LC_NAME", tok_lc_name, 0},
|
||||
{"backward", tok_backward, 0},
|
||||
{"week", tok_week, 0},
|
||||
{"LC_NUMERIC", tok_lc_numeric, 0},
|
||||
{"reorder-end", tok_reorder_end, 0},
|
||||
{""},
|
||||
{"reorder-after", tok_reorder_after, 0},
|
||||
{"UNDEFINED", tok_undefined, 0},
|
||||
{""},
|
||||
{"LC_MONETARY", tok_lc_monetary, 0},
|
||||
{""},
|
||||
{"repertoiremap", tok_repertoiremap, 0},
|
||||
{"LC_MEASUREMENT", tok_lc_measurement, 0},
|
||||
{""}, {""}, {""},
|
||||
#line 154 "programs/locfile-kw.gperf"
|
||||
{"LC_PAPER", tok_lc_paper, 0},
|
||||
{""}, {""}, {""}, {""},
|
||||
{"day", tok_day, 0},
|
||||
{""}, {""},
|
||||
{"yesstr", tok_yesstr, 0},
|
||||
{""}, {""}, {""}, {""}, {""},
|
||||
{"toupper", tok_toupper, 0},
|
||||
{"era_year", tok_era_year, 0},
|
||||
{""}, {""},
|
||||
{"order_start", tok_order_start, 0},
|
||||
{"tolower", tok_tolower, 0},
|
||||
{""}, {""},
|
||||
{"graph", tok_graph, 0},
|
||||
{""}, {""}, {""},
|
||||
{"order_end", tok_order_end, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
#line 182 "programs/locfile-kw.gperf"
|
||||
{"LC_MEASUREMENT", tok_lc_measurement, 0},
|
||||
#line 55 "programs/locfile-kw.gperf"
|
||||
{"LC_COLLATE", tok_lc_collate, 0},
|
||||
{""},
|
||||
{"abday", tok_abday, 0},
|
||||
#line 184 "programs/locfile-kw.gperf"
|
||||
{"LC_IDENTIFICATION", tok_lc_identification, 0},
|
||||
#line 197 "programs/locfile-kw.gperf"
|
||||
{"revision", tok_revision, 0},
|
||||
#line 68 "programs/locfile-kw.gperf"
|
||||
{"UNDEFINED", tok_undefined, 0},
|
||||
#line 123 "programs/locfile-kw.gperf"
|
||||
{"LC_NUMERIC", tok_lc_numeric, 0},
|
||||
#line 80 "programs/locfile-kw.gperf"
|
||||
{"LC_MONETARY", tok_lc_monetary, 0},
|
||||
#line 177 "programs/locfile-kw.gperf"
|
||||
{"LC_TELEPHONE", tok_lc_telephone, 0},
|
||||
{""},
|
||||
{"yesexpr", tok_yesexpr, 0},
|
||||
{""}, {""},
|
||||
{"t_fmt", tok_t_fmt, 0},
|
||||
{""}, {""}, {""}, {""},
|
||||
{"d_fmt", tok_d_fmt, 0},
|
||||
{""}, {""},
|
||||
{"date_fmt", tok_date_fmt, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{"grouping", tok_grouping, 0},
|
||||
{""}, {""},
|
||||
{"tel_dom_fmt", tok_tel_dom_fmt, 0},
|
||||
{""}, {""}, {""}, {""},
|
||||
{"era_d_t_fmt", tok_era_d_t_fmt, 0},
|
||||
{"contact", tok_contact, 0},
|
||||
{"tel", tok_tel, 0},
|
||||
{"else", tok_else, 0},
|
||||
{"alpha", tok_alpha, 0},
|
||||
{"country_ab3", tok_country_ab3, 0},
|
||||
{""}, {""}, {""}, {""},
|
||||
{"country_ab2", tok_country_ab2, 0},
|
||||
{"country_post", tok_country_post, 0},
|
||||
{"fax", tok_fax, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{"map", tok_map, 0},
|
||||
#line 130 "programs/locfile-kw.gperf"
|
||||
{"week", tok_week, 0},
|
||||
{""},
|
||||
{"blank", tok_blank, 0},
|
||||
{""},
|
||||
{"forward", tok_forward, 0},
|
||||
{"audience", tok_audience, 0},
|
||||
{""},
|
||||
{"punct", tok_punct, 0},
|
||||
#line 74 "programs/locfile-kw.gperf"
|
||||
{"define", tok_define, 0},
|
||||
{"abbreviation", tok_abbreviation, 0},
|
||||
#line 150 "programs/locfile-kw.gperf"
|
||||
{"yesexpr", tok_yesexpr, 0},
|
||||
#line 139 "programs/locfile-kw.gperf"
|
||||
{"era_year", tok_era_year, 0},
|
||||
{""},
|
||||
{"copy", tok_copy, 0},
|
||||
{""}, {""}, {""},
|
||||
{"decimal_point", tok_decimal_point, 0},
|
||||
#line 53 "programs/locfile-kw.gperf"
|
||||
{"translit_ignore", tok_translit_ignore, 0},
|
||||
#line 152 "programs/locfile-kw.gperf"
|
||||
{"yesstr", tok_yesstr, 0},
|
||||
{""},
|
||||
{"upper", tok_upper, 0},
|
||||
#line 87 "programs/locfile-kw.gperf"
|
||||
{"negative_sign", tok_negative_sign, 0},
|
||||
{""},
|
||||
#line 135 "programs/locfile-kw.gperf"
|
||||
{"t_fmt", tok_t_fmt, 0},
|
||||
#line 155 "programs/locfile-kw.gperf"
|
||||
{"height", tok_height, 0},
|
||||
{""}, {""},
|
||||
{"category", tok_category, 0},
|
||||
#line 51 "programs/locfile-kw.gperf"
|
||||
{"translit_start", tok_translit_start, 0},
|
||||
#line 134 "programs/locfile-kw.gperf"
|
||||
{"d_fmt", tok_d_fmt, 0},
|
||||
{""},
|
||||
{"conversion_rate", tok_conversion_rate, 0},
|
||||
{""}, {""}, {""}, {""},
|
||||
{"lower", tok_lower, 0},
|
||||
{""},
|
||||
{"collating-element", tok_collating_element, 0},
|
||||
{"duo_p_sep_by_space", tok_duo_p_sep_by_space, 0},
|
||||
#line 52 "programs/locfile-kw.gperf"
|
||||
{"translit_end", tok_translit_end, 0},
|
||||
#line 92 "programs/locfile-kw.gperf"
|
||||
{"n_cs_precedes", tok_n_cs_precedes, 0},
|
||||
#line 142 "programs/locfile-kw.gperf"
|
||||
{"era_t_fmt", tok_era_t_fmt, 0},
|
||||
#line 38 "programs/locfile-kw.gperf"
|
||||
{"space", tok_space, 0},
|
||||
#line 71 "programs/locfile-kw.gperf"
|
||||
{"reorder-end", tok_reorder_end, 0},
|
||||
#line 72 "programs/locfile-kw.gperf"
|
||||
{"reorder-sections-after", tok_reorder_sections_after, 0},
|
||||
{""},
|
||||
#line 140 "programs/locfile-kw.gperf"
|
||||
{"era_d_fmt", tok_era_d_fmt, 0},
|
||||
#line 185 "programs/locfile-kw.gperf"
|
||||
{"title", tok_title, 0},
|
||||
{""}, {""},
|
||||
#line 147 "programs/locfile-kw.gperf"
|
||||
{"timezone", tok_timezone, 0},
|
||||
{""},
|
||||
{"digit", tok_digit, 0},
|
||||
{""}, {""}, {""}, {""},
|
||||
{"postal_fmt", tok_postal_fmt, 0},
|
||||
{""},
|
||||
{"d_t_fmt", tok_d_t_fmt, 0},
|
||||
{"position", tok_position, 0},
|
||||
{"p_sep_by_space", tok_p_sep_by_space, 0},
|
||||
{"nostr", tok_nostr, 0},
|
||||
{"noexpr", tok_noexpr, 0},
|
||||
{""},
|
||||
{"charconv", tok_charconv, 0},
|
||||
{""},
|
||||
{"width", tok_width, 0},
|
||||
{"country_car", tok_country_car, 0},
|
||||
{"comment_char", tok_comment_char, 0},
|
||||
{""}, {""}, {""}, {""},
|
||||
{"lang_ab", tok_lang_ab, 0},
|
||||
{"lang_lib", tok_lang_lib, 0},
|
||||
{"lang_name", tok_lang_name, 0},
|
||||
{""}, {""}, {""}, {""},
|
||||
{"elif", tok_elif, 0},
|
||||
{""},
|
||||
{"xdigit", tok_xdigit, 0},
|
||||
{""}, {""}, {""},
|
||||
{"space", tok_space, 0},
|
||||
{""},
|
||||
{"address", tok_address, 0},
|
||||
{""}, {""}, {""}, {""}, {""},
|
||||
{"name_fmt", tok_name_fmt, 0},
|
||||
{""},
|
||||
{"t_fmt_ampm", tok_t_fmt_ampm, 0},
|
||||
{""},
|
||||
{"name_mr", tok_name_mr, 0},
|
||||
{""},
|
||||
{"from", tok_from, 0},
|
||||
{""},
|
||||
{"escape_char", tok_escape_char, 0},
|
||||
{"duo_valid_to", tok_duo_valid_to, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
#line 73 "programs/locfile-kw.gperf"
|
||||
{"reorder-sections-end", tok_reorder_sections_end, 0},
|
||||
{""},
|
||||
{"reorder-sections-after", tok_reorder_sections_after, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""},
|
||||
{"territory", tok_territory, 0},
|
||||
{""}, {""},
|
||||
{"country_name", tok_country_name, 0},
|
||||
{"language", tok_language, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""},
|
||||
{"tel_int_fmt", tok_tel_int_fmt, 0},
|
||||
{"mon_grouping", tok_mon_grouping, 0},
|
||||
{"positive_sign", tok_positive_sign, 0},
|
||||
{""},
|
||||
{"abmon", tok_abmon, 0},
|
||||
{"measurement", tok_measurement, 0},
|
||||
{""}, {""}, {""},
|
||||
{"coll_weight_max", tok_coll_weight_max, 0},
|
||||
{"collating-symbol", tok_collating_symbol, 0},
|
||||
{""}, {""}, {""}, {""},
|
||||
{"script", tok_script, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""},
|
||||
{"cal_direction", tok_cal_direction, 0},
|
||||
{""}, {""}, {""}, {""},
|
||||
{"duo_n_sep_by_space", tok_duo_n_sep_by_space, 0},
|
||||
{""}, {""}, {""}, {""},
|
||||
{"mon", tok_mon, 0},
|
||||
{"translit_start", tok_translit_start, 0},
|
||||
{"translit_ignore", tok_translit_ignore, 0},
|
||||
{""},
|
||||
{"translit_end", tok_translit_end, 0},
|
||||
{"first_weekday", tok_first_weekday, 0},
|
||||
{""}, {""},
|
||||
{"p_sign_posn", tok_p_sign_posn, 0},
|
||||
{""},
|
||||
{"first_workday", tok_first_workday, 0},
|
||||
#line 93 "programs/locfile-kw.gperf"
|
||||
{"n_sep_by_space", tok_n_sep_by_space, 0},
|
||||
{""},
|
||||
{"source", tok_source, 0},
|
||||
{"mon_decimal_point", tok_mon_decimal_point, 0},
|
||||
{"symbol-equivalence", tok_symbol_equivalence, 0},
|
||||
{""},
|
||||
{"endif", tok_endif, 0},
|
||||
{""}, {""}, {""},
|
||||
{"duo_valid_from", tok_duo_valid_from, 0},
|
||||
{"default_missing", tok_default_missing, 0},
|
||||
{""}, {""},
|
||||
#line 98 "programs/locfile-kw.gperf"
|
||||
{"int_n_cs_precedes", tok_int_n_cs_precedes, 0},
|
||||
{""}, {""}, {""},
|
||||
#line 25 "programs/locfile-kw.gperf"
|
||||
{"escape_char", tok_escape_char, 0},
|
||||
{""},
|
||||
#line 27 "programs/locfile-kw.gperf"
|
||||
{"repertoiremap", tok_repertoiremap, 0},
|
||||
#line 45 "programs/locfile-kw.gperf"
|
||||
{"charclass", tok_charclass, 0},
|
||||
#line 42 "programs/locfile-kw.gperf"
|
||||
{"print", tok_print, 0},
|
||||
#line 43 "programs/locfile-kw.gperf"
|
||||
{"xdigit", tok_xdigit, 0},
|
||||
#line 108 "programs/locfile-kw.gperf"
|
||||
{"duo_n_cs_precedes", tok_duo_n_cs_precedes, 0},
|
||||
#line 125 "programs/locfile-kw.gperf"
|
||||
{"thousands_sep", tok_thousands_sep, 0},
|
||||
#line 193 "programs/locfile-kw.gperf"
|
||||
{"territory", tok_territory, 0},
|
||||
#line 35 "programs/locfile-kw.gperf"
|
||||
{"digit", tok_digit, 0},
|
||||
{""}, {""},
|
||||
#line 90 "programs/locfile-kw.gperf"
|
||||
{"p_cs_precedes", tok_p_cs_precedes, 0},
|
||||
{""},
|
||||
#line 156 "programs/locfile-kw.gperf"
|
||||
{"width", tok_width, 0},
|
||||
#line 61 "programs/locfile-kw.gperf"
|
||||
{"script", tok_script, 0},
|
||||
#line 28 "programs/locfile-kw.gperf"
|
||||
{"include", tok_include, 0},
|
||||
{""},
|
||||
#line 77 "programs/locfile-kw.gperf"
|
||||
{"else", tok_else, 0},
|
||||
#line 180 "programs/locfile-kw.gperf"
|
||||
{"int_select", tok_int_select, 0},
|
||||
{""}, {""}, {""}, {""},
|
||||
#line 32 "programs/locfile-kw.gperf"
|
||||
{"upper", tok_upper, 0},
|
||||
{""}, {""},
|
||||
#line 190 "programs/locfile-kw.gperf"
|
||||
{"tel", tok_tel, 0},
|
||||
#line 91 "programs/locfile-kw.gperf"
|
||||
{"p_sep_by_space", tok_p_sep_by_space, 0},
|
||||
{""}, {""},
|
||||
#line 96 "programs/locfile-kw.gperf"
|
||||
{"int_p_cs_precedes", tok_int_p_cs_precedes, 0},
|
||||
{""}, {""},
|
||||
#line 40 "programs/locfile-kw.gperf"
|
||||
{"punct", tok_punct, 0},
|
||||
{""}, {""},
|
||||
#line 99 "programs/locfile-kw.gperf"
|
||||
{"int_n_sep_by_space", tok_int_n_sep_by_space, 0},
|
||||
{""}, {""}, {""},
|
||||
#line 106 "programs/locfile-kw.gperf"
|
||||
{"duo_p_cs_precedes", tok_duo_p_cs_precedes, 0},
|
||||
{""}, {""},
|
||||
#line 46 "programs/locfile-kw.gperf"
|
||||
{"class", tok_class, 0},
|
||||
#line 112 "programs/locfile-kw.gperf"
|
||||
{"duo_int_n_cs_precedes", tok_duo_int_n_cs_precedes, 0},
|
||||
#line 113 "programs/locfile-kw.gperf"
|
||||
{"duo_int_n_sep_by_space", tok_duo_int_n_sep_by_space, 0},
|
||||
#line 109 "programs/locfile-kw.gperf"
|
||||
{"duo_n_sep_by_space", tok_duo_n_sep_by_space, 0},
|
||||
#line 117 "programs/locfile-kw.gperf"
|
||||
{"duo_int_n_sign_posn", tok_duo_int_n_sign_posn, 0},
|
||||
{""}, {""}, {""},
|
||||
#line 47 "programs/locfile-kw.gperf"
|
||||
{"charconv", tok_charconv, 0},
|
||||
{""}, {""},
|
||||
#line 183 "programs/locfile-kw.gperf"
|
||||
{"measurement", tok_measurement, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
#line 57 "programs/locfile-kw.gperf"
|
||||
{"section-symbol", tok_section_symbol, 0},
|
||||
#line 181 "programs/locfile-kw.gperf"
|
||||
{"int_prefix", tok_int_prefix, 0},
|
||||
{""}, {""}, {""}, {""},
|
||||
#line 137 "programs/locfile-kw.gperf"
|
||||
{"t_fmt_ampm", tok_t_fmt_ampm, 0},
|
||||
{""}, {""},
|
||||
#line 97 "programs/locfile-kw.gperf"
|
||||
{"int_p_sep_by_space", tok_int_p_sep_by_space, 0},
|
||||
{""},
|
||||
{"alt_digits", tok_alt_digits, 0},
|
||||
{""},
|
||||
{"duo_int_p_sep_by_space", tok_duo_int_p_sep_by_space, 0},
|
||||
#line 41 "programs/locfile-kw.gperf"
|
||||
{"graph", tok_graph, 0},
|
||||
{""}, {""},
|
||||
{"duo_p_sign_posn", tok_duo_p_sign_posn, 0},
|
||||
{""}, {""}, {""},
|
||||
{"duo_currency_symbol", tok_duo_currency_symbol, 0},
|
||||
{""}, {""}, {""},
|
||||
{"outdigit", tok_outdigit, 0},
|
||||
{""}, {""}, {""}, {""},
|
||||
{"revision", tok_revision, 0},
|
||||
{""}, {""}, {""}, {""},
|
||||
{"name_gen", tok_name_gen, 0},
|
||||
{""},
|
||||
{"email", tok_email, 0},
|
||||
{""},
|
||||
{"uno_valid_to", tok_uno_valid_to, 0},
|
||||
{"negative_sign", tok_negative_sign, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
#line 124 "programs/locfile-kw.gperf"
|
||||
{"decimal_point", tok_decimal_point, 0},
|
||||
{""}, {""},
|
||||
{"alnum", tok_alnum, 0},
|
||||
{""}, {""}, {""}, {""}, {""},
|
||||
{"country_num", tok_country_num, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{"am_pm", tok_am_pm, 0},
|
||||
{""},
|
||||
{"mon_thousands_sep", tok_mon_thousands_sep, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{"currency_symbol", tok_currency_symbol, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""},
|
||||
{"country_isbn", tok_country_isbn, 0},
|
||||
{""}, {""}, {""}, {""},
|
||||
{"name_ms", tok_name_ms, 0},
|
||||
{"name_mrs", tok_name_mrs, 0},
|
||||
{""}, {""}, {""}, {""},
|
||||
{"thousands_sep", tok_thousands_sep, 0},
|
||||
{""},
|
||||
{"cntrl", tok_cntrl, 0},
|
||||
{""}, {""}, {""}, {""}, {""},
|
||||
{"n_sign_posn", tok_n_sign_posn, 0},
|
||||
{"include", tok_include, 0},
|
||||
{""}, {""},
|
||||
{"ifdef", tok_ifdef, 0},
|
||||
{""},
|
||||
{"duo_p_cs_precedes", tok_duo_p_cs_precedes, 0},
|
||||
{""}, {""}, {""}, {""}, {""},
|
||||
{"p_cs_precedes", tok_p_cs_precedes, 0},
|
||||
{"uno_valid_from", tok_uno_valid_from, 0},
|
||||
{"undef", tok_undef, 0},
|
||||
{""}, {""},
|
||||
{"int_n_sep_by_space", tok_int_n_sep_by_space, 0},
|
||||
{"lang_term", tok_lang_term, 0},
|
||||
{""}, {""},
|
||||
{"duo_int_n_sep_by_space", tok_duo_int_n_sep_by_space, 0},
|
||||
{""},
|
||||
{"duo_int_p_sign_posn", tok_duo_int_p_sign_posn, 0},
|
||||
{"duo_n_sign_posn", tok_duo_n_sign_posn, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""},
|
||||
{"application", tok_application, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""},
|
||||
{"int_p_sign_posn", tok_int_p_sign_posn, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{"duo_int_curr_symbol", tok_duo_int_curr_symbol, 0},
|
||||
{""}, {""}, {""}, {""}, {""},
|
||||
{"int_prefix", tok_int_prefix, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""},
|
||||
{"duo_frac_digits", tok_duo_frac_digits, 0},
|
||||
{""}, {""}, {""}, {""}, {""},
|
||||
#line 110 "programs/locfile-kw.gperf"
|
||||
{"duo_int_p_cs_precedes", tok_duo_int_p_cs_precedes, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
#line 111 "programs/locfile-kw.gperf"
|
||||
{"duo_int_p_sep_by_space", tok_duo_int_p_sep_by_space, 0},
|
||||
#line 107 "programs/locfile-kw.gperf"
|
||||
{"duo_p_sep_by_space", tok_duo_p_sep_by_space, 0},
|
||||
#line 116 "programs/locfile-kw.gperf"
|
||||
{"duo_int_p_sign_posn", tok_duo_int_p_sign_posn, 0},
|
||||
#line 153 "programs/locfile-kw.gperf"
|
||||
{"nostr", tok_nostr, 0},
|
||||
{""}, {""},
|
||||
#line 138 "programs/locfile-kw.gperf"
|
||||
{"era", tok_era, 0},
|
||||
{""},
|
||||
{"frac_digits", tok_frac_digits, 0},
|
||||
{""}, {""},
|
||||
{"charclass", tok_charclass, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""},
|
||||
{"duo_n_cs_precedes", tok_duo_n_cs_precedes, 0},
|
||||
{""}, {""},
|
||||
{"int_curr_symbol", tok_int_curr_symbol, 0},
|
||||
{""}, {""},
|
||||
{"n_cs_precedes", tok_n_cs_precedes, 0},
|
||||
#line 82 "programs/locfile-kw.gperf"
|
||||
{"currency_symbol", tok_currency_symbol, 0},
|
||||
{""},
|
||||
{"int_select", tok_int_select, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{"duo_int_n_sign_posn", tok_duo_int_n_sign_posn, 0},
|
||||
{"class", tok_class, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""},
|
||||
{"int_p_cs_precedes", tok_int_p_cs_precedes, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""},
|
||||
{"duo_int_frac_digits", tok_duo_int_frac_digits, 0},
|
||||
{""}, {""}, {""}, {""}, {""},
|
||||
{"int_n_sign_posn", tok_int_n_sign_posn, 0},
|
||||
{""}, {""}, {""},
|
||||
#line 163 "programs/locfile-kw.gperf"
|
||||
{"name_ms", tok_name_ms, 0},
|
||||
#line 161 "programs/locfile-kw.gperf"
|
||||
{"name_mrs", tok_name_mrs, 0},
|
||||
#line 162 "programs/locfile-kw.gperf"
|
||||
{"name_miss", tok_name_miss, 0},
|
||||
#line 81 "programs/locfile-kw.gperf"
|
||||
{"int_curr_symbol", tok_int_curr_symbol, 0},
|
||||
#line 186 "programs/locfile-kw.gperf"
|
||||
{"source", tok_source, 0},
|
||||
#line 160 "programs/locfile-kw.gperf"
|
||||
{"name_mr", tok_name_mr, 0},
|
||||
#line 159 "programs/locfile-kw.gperf"
|
||||
{"name_gen", tok_name_gen, 0},
|
||||
#line 198 "programs/locfile-kw.gperf"
|
||||
{"date", tok_date, 0},
|
||||
{""}, {""},
|
||||
#line 187 "programs/locfile-kw.gperf"
|
||||
{"address", tok_address, 0},
|
||||
#line 158 "programs/locfile-kw.gperf"
|
||||
{"name_fmt", tok_name_fmt, 0},
|
||||
#line 31 "programs/locfile-kw.gperf"
|
||||
{"copy", tok_copy, 0},
|
||||
{""}, {""},
|
||||
#line 49 "programs/locfile-kw.gperf"
|
||||
{"tolower", tok_tolower, 0},
|
||||
#line 129 "programs/locfile-kw.gperf"
|
||||
{"day", tok_day, 0},
|
||||
#line 103 "programs/locfile-kw.gperf"
|
||||
{"duo_currency_symbol", tok_duo_currency_symbol, 0},
|
||||
#line 101 "programs/locfile-kw.gperf"
|
||||
{"int_n_sign_posn", tok_int_n_sign_posn, 0},
|
||||
{""}, {""},
|
||||
#line 148 "programs/locfile-kw.gperf"
|
||||
{"date_fmt", tok_date_fmt, 0},
|
||||
#line 63 "programs/locfile-kw.gperf"
|
||||
{"order_end", tok_order_end, 0},
|
||||
{""}, {""},
|
||||
#line 166 "programs/locfile-kw.gperf"
|
||||
{"country_name", tok_country_name, 0},
|
||||
#line 70 "programs/locfile-kw.gperf"
|
||||
{"reorder-after", tok_reorder_after, 0},
|
||||
#line 118 "programs/locfile-kw.gperf"
|
||||
{"uno_valid_from", tok_uno_valid_from, 0},
|
||||
#line 115 "programs/locfile-kw.gperf"
|
||||
{"duo_n_sign_posn", tok_duo_n_sign_posn, 0},
|
||||
#line 151 "programs/locfile-kw.gperf"
|
||||
{"noexpr", tok_noexpr, 0},
|
||||
{""},
|
||||
#line 194 "programs/locfile-kw.gperf"
|
||||
{"audience", tok_audience, 0},
|
||||
{""},
|
||||
#line 44 "programs/locfile-kw.gperf"
|
||||
{"blank", tok_blank, 0},
|
||||
{""},
|
||||
#line 48 "programs/locfile-kw.gperf"
|
||||
{"toupper", tok_toupper, 0},
|
||||
#line 67 "programs/locfile-kw.gperf"
|
||||
{"position", tok_position, 0},
|
||||
#line 120 "programs/locfile-kw.gperf"
|
||||
{"duo_valid_from", tok_duo_valid_from, 0},
|
||||
#line 39 "programs/locfile-kw.gperf"
|
||||
{"cntrl", tok_cntrl, 0},
|
||||
{""},
|
||||
#line 26 "programs/locfile-kw.gperf"
|
||||
{"comment_char", tok_comment_char, 0},
|
||||
#line 86 "programs/locfile-kw.gperf"
|
||||
{"positive_sign", tok_positive_sign, 0},
|
||||
{""}, {""}, {""}, {""},
|
||||
#line 132 "programs/locfile-kw.gperf"
|
||||
{"mon", tok_mon, 0},
|
||||
{""}, {""},
|
||||
#line 171 "programs/locfile-kw.gperf"
|
||||
{"country_car", tok_country_car, 0},
|
||||
{""},
|
||||
#line 60 "programs/locfile-kw.gperf"
|
||||
{"symbol-equivalence", tok_symbol_equivalence, 0},
|
||||
#line 102 "programs/locfile-kw.gperf"
|
||||
{"duo_int_curr_symbol", tok_duo_int_curr_symbol, 0},
|
||||
#line 100 "programs/locfile-kw.gperf"
|
||||
{"int_p_sign_posn", tok_int_p_sign_posn, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""},
|
||||
#line 172 "programs/locfile-kw.gperf"
|
||||
{"country_isbn", tok_country_isbn, 0},
|
||||
#line 36 "programs/locfile-kw.gperf"
|
||||
{"outdigit", tok_outdigit, 0},
|
||||
{""},
|
||||
#line 114 "programs/locfile-kw.gperf"
|
||||
{"duo_p_sign_posn", tok_duo_p_sign_posn, 0},
|
||||
{""},
|
||||
#line 133 "programs/locfile-kw.gperf"
|
||||
{"d_t_fmt", tok_d_t_fmt, 0},
|
||||
{""}, {""},
|
||||
#line 33 "programs/locfile-kw.gperf"
|
||||
{"lower", tok_lower, 0},
|
||||
{""},
|
||||
#line 167 "programs/locfile-kw.gperf"
|
||||
{"country_post", tok_country_post, 0},
|
||||
#line 146 "programs/locfile-kw.gperf"
|
||||
{"cal_direction", tok_cal_direction, 0},
|
||||
{""},
|
||||
#line 189 "programs/locfile-kw.gperf"
|
||||
{"email", tok_email, 0},
|
||||
#line 141 "programs/locfile-kw.gperf"
|
||||
{"era_d_t_fmt", tok_era_d_t_fmt, 0},
|
||||
{""}, {""},
|
||||
#line 173 "programs/locfile-kw.gperf"
|
||||
{"lang_name", tok_lang_name, 0},
|
||||
{""},
|
||||
#line 179 "programs/locfile-kw.gperf"
|
||||
{"tel_dom_fmt", tok_tel_dom_fmt, 0},
|
||||
{""}, {""}, {""},
|
||||
#line 54 "programs/locfile-kw.gperf"
|
||||
{"default_missing", tok_default_missing, 0},
|
||||
#line 89 "programs/locfile-kw.gperf"
|
||||
{"frac_digits", tok_frac_digits, 0},
|
||||
{""}, {""}, {""},
|
||||
#line 88 "programs/locfile-kw.gperf"
|
||||
{"int_frac_digits", tok_int_frac_digits, 0},
|
||||
#line 170 "programs/locfile-kw.gperf"
|
||||
{"country_num", tok_country_num, 0},
|
||||
#line 119 "programs/locfile-kw.gperf"
|
||||
{"uno_valid_to", tok_uno_valid_to, 0},
|
||||
{""}, {""}, {""}, {""}, {""},
|
||||
#line 50 "programs/locfile-kw.gperf"
|
||||
{"map", tok_map, 0},
|
||||
{""},
|
||||
#line 105 "programs/locfile-kw.gperf"
|
||||
{"duo_frac_digits", tok_duo_frac_digits, 0},
|
||||
#line 178 "programs/locfile-kw.gperf"
|
||||
{"tel_int_fmt", tok_tel_int_fmt, 0},
|
||||
#line 121 "programs/locfile-kw.gperf"
|
||||
{"duo_valid_to", tok_duo_valid_to, 0},
|
||||
#line 144 "programs/locfile-kw.gperf"
|
||||
{"first_weekday", tok_first_weekday, 0},
|
||||
{""},
|
||||
#line 143 "programs/locfile-kw.gperf"
|
||||
{"alt_digits", tok_alt_digits, 0},
|
||||
#line 95 "programs/locfile-kw.gperf"
|
||||
{"n_sign_posn", tok_n_sign_posn, 0},
|
||||
#line 84 "programs/locfile-kw.gperf"
|
||||
{"mon_thousands_sep", tok_mon_thousands_sep, 0},
|
||||
#line 145 "programs/locfile-kw.gperf"
|
||||
{"first_workday", tok_first_workday, 0},
|
||||
#line 64 "programs/locfile-kw.gperf"
|
||||
{"from", tok_from, 0},
|
||||
#line 131 "programs/locfile-kw.gperf"
|
||||
{"abmon", tok_abmon, 0},
|
||||
{""}, {""},
|
||||
#line 192 "programs/locfile-kw.gperf"
|
||||
{"language", tok_language, 0},
|
||||
{""}, {""},
|
||||
#line 195 "programs/locfile-kw.gperf"
|
||||
{"application", tok_application, 0},
|
||||
{""},
|
||||
#line 126 "programs/locfile-kw.gperf"
|
||||
{"grouping", tok_grouping, 0},
|
||||
#line 78 "programs/locfile-kw.gperf"
|
||||
{"elif", tok_elif, 0},
|
||||
#line 128 "programs/locfile-kw.gperf"
|
||||
{"abday", tok_abday, 0},
|
||||
{""},
|
||||
#line 196 "programs/locfile-kw.gperf"
|
||||
{"abbreviation", tok_abbreviation, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
#line 56 "programs/locfile-kw.gperf"
|
||||
{"coll_weight_max", tok_coll_weight_max, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
#line 66 "programs/locfile-kw.gperf"
|
||||
{"backward", tok_backward, 0},
|
||||
#line 104 "programs/locfile-kw.gperf"
|
||||
{"duo_int_frac_digits", tok_duo_int_frac_digits, 0},
|
||||
{""},
|
||||
#line 94 "programs/locfile-kw.gperf"
|
||||
{"p_sign_posn", tok_p_sign_posn, 0},
|
||||
{""},
|
||||
#line 199 "programs/locfile-kw.gperf"
|
||||
{"category", tok_category, 0},
|
||||
{""},
|
||||
#line 122 "programs/locfile-kw.gperf"
|
||||
{"conversion_rate", tok_conversion_rate, 0},
|
||||
{""},
|
||||
#line 83 "programs/locfile-kw.gperf"
|
||||
{"mon_decimal_point", tok_mon_decimal_point, 0},
|
||||
{""}, {""}, {""},
|
||||
#line 62 "programs/locfile-kw.gperf"
|
||||
{"order_start", tok_order_start, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""},
|
||||
#line 188 "programs/locfile-kw.gperf"
|
||||
{"contact", tok_contact, 0},
|
||||
{""}, {""}, {""},
|
||||
#line 169 "programs/locfile-kw.gperf"
|
||||
{"country_ab3", tok_country_ab3, 0},
|
||||
{""}, {""}, {""}, {""},
|
||||
#line 168 "programs/locfile-kw.gperf"
|
||||
{"country_ab2", tok_country_ab2, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""},
|
||||
#line 174 "programs/locfile-kw.gperf"
|
||||
{"lang_ab", tok_lang_ab, 0},
|
||||
#line 176 "programs/locfile-kw.gperf"
|
||||
{"lang_lib", tok_lang_lib, 0},
|
||||
{""}, {""}, {""}, {""},
|
||||
#line 191 "programs/locfile-kw.gperf"
|
||||
{"fax", tok_fax, 0},
|
||||
{""},
|
||||
#line 136 "programs/locfile-kw.gperf"
|
||||
{"am_pm", tok_am_pm, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""},
|
||||
#line 37 "programs/locfile-kw.gperf"
|
||||
{"alnum", tok_alnum, 0},
|
||||
{""}, {""}, {""},
|
||||
#line 175 "programs/locfile-kw.gperf"
|
||||
{"lang_term", tok_lang_term, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
#line 79 "programs/locfile-kw.gperf"
|
||||
{"endif", tok_endif, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
#line 165 "programs/locfile-kw.gperf"
|
||||
{"postal_fmt", tok_postal_fmt, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""},
|
||||
#line 75 "programs/locfile-kw.gperf"
|
||||
{"undef", tok_undef, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""},
|
||||
#line 58 "programs/locfile-kw.gperf"
|
||||
{"collating-element", tok_collating_element, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""},
|
||||
#line 85 "programs/locfile-kw.gperf"
|
||||
{"mon_grouping", tok_mon_grouping, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""},
|
||||
#line 65 "programs/locfile-kw.gperf"
|
||||
{"forward", tok_forward, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
#line 59 "programs/locfile-kw.gperf"
|
||||
{"collating-symbol", tok_collating_symbol, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""},
|
||||
{"duo_int_n_cs_precedes", tok_duo_int_n_cs_precedes, 0},
|
||||
#line 34 "programs/locfile-kw.gperf"
|
||||
{"alpha", tok_alpha, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""},
|
||||
{"int_frac_digits", tok_int_frac_digits, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{"section-symbol", tok_section_symbol, 0},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""}, {""}, {""}, {""}, {""},
|
||||
{""}, {""}, {""}, {""}, {""},
|
||||
{"int_n_cs_precedes", tok_int_n_cs_precedes, 0}
|
||||
#line 76 "programs/locfile-kw.gperf"
|
||||
{"ifdef", tok_ifdef, 0}
|
||||
};
|
||||
|
||||
if (len <= MAX_WORD_LENGTH && len >= MIN_WORD_LENGTH)
|
||||
|
29
math/cabsf.c
Normal file
29
math/cabsf.c
Normal file
@ -0,0 +1,29 @@
|
||||
/* Return the complex absolute value of float complex value.
|
||||
Copyright (C) 1997, 1998 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <complex.h>
|
||||
#include <math.h>
|
||||
|
||||
float
|
||||
__cabsf (float _Complex z)
|
||||
{
|
||||
return __hypotf (__real__ z, __imag__ z);
|
||||
}
|
||||
weak_alias (__cabsf, cabsf)
|
29
math/cargf.c
Normal file
29
math/cargf.c
Normal file
@ -0,0 +1,29 @@
|
||||
/* Compute argument of complex float value.
|
||||
Copyright (C) 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <complex.h>
|
||||
#include <math.h>
|
||||
|
||||
float
|
||||
__cargf (__complex__ float x)
|
||||
{
|
||||
return __atan2f (__imag__ x, __real__ x);
|
||||
}
|
||||
weak_alias (__cargf, cargf)
|
28
math/cimagf.c
Normal file
28
math/cimagf.c
Normal file
@ -0,0 +1,28 @@
|
||||
/* Return imaginary part of complex float value.
|
||||
Copyright (C) 1997, 1998 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <complex.h>
|
||||
|
||||
float
|
||||
__cimagf (float _Complex z)
|
||||
{
|
||||
return __imag__ z;
|
||||
}
|
||||
weak_alias (__cimagf, cimagf)
|
28
math/conjf.c
Normal file
28
math/conjf.c
Normal file
@ -0,0 +1,28 @@
|
||||
/* Return complex conjugate of complex float value.
|
||||
Copyright (C) 1997, 1998 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <complex.h>
|
||||
|
||||
float _Complex
|
||||
__conjf (float _Complex z)
|
||||
{
|
||||
return ~z;
|
||||
}
|
||||
weak_alias (__conjf, conjf)
|
28
math/crealf.c
Normal file
28
math/crealf.c
Normal file
@ -0,0 +1,28 @@
|
||||
/* Return real part of complex float value.
|
||||
Copyright (C) 1997, 1998 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <complex.h>
|
||||
|
||||
float
|
||||
__crealf (float _Complex z)
|
||||
{
|
||||
return __real__ z;
|
||||
}
|
||||
weak_alias (__crealf, crealf)
|
14
math/e_acoshl.c
Normal file
14
math/e_acoshl.c
Normal file
@ -0,0 +1,14 @@
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
long double
|
||||
__ieee754_acoshl (long double x)
|
||||
{
|
||||
fputs ("__ieee754_acoshl not implemented\n", stderr);
|
||||
__set_errno (ENOSYS);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (acoshl)
|
||||
#include <stub-tag.h>
|
14
math/e_acosl.c
Normal file
14
math/e_acosl.c
Normal file
@ -0,0 +1,14 @@
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
long double
|
||||
__ieee754_acosl (long double x)
|
||||
{
|
||||
fputs ("__ieee754_acosl not implemented\n", stderr);
|
||||
__set_errno (ENOSYS);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (acosl)
|
||||
#include <stub-tag.h>
|
14
math/e_asinl.c
Normal file
14
math/e_asinl.c
Normal file
@ -0,0 +1,14 @@
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
long double
|
||||
__ieee754_asinl (long double x)
|
||||
{
|
||||
fputs ("__ieee754_asinl not implemented\n", stderr);
|
||||
__set_errno (ENOSYS);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (asinl)
|
||||
#include <stub-tag.h>
|
14
math/e_atan2l.c
Normal file
14
math/e_atan2l.c
Normal file
@ -0,0 +1,14 @@
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
long double
|
||||
__ieee754_atan2l (long double x, long double y)
|
||||
{
|
||||
fputs ("__ieee754_atan2l not implemented\n", stderr);
|
||||
__set_errno (ENOSYS);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (atan2l)
|
||||
#include <stub-tag.h>
|
14
math/e_atanhl.c
Normal file
14
math/e_atanhl.c
Normal file
@ -0,0 +1,14 @@
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
long double
|
||||
__ieee754_atanhl (long double x)
|
||||
{
|
||||
fputs ("__ieee754_atanhl not implemented\n", stderr);
|
||||
__set_errno (ENOSYS);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_atanhl)
|
||||
#include <stub-tag.h>
|
14
math/e_coshl.c
Normal file
14
math/e_coshl.c
Normal file
@ -0,0 +1,14 @@
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
long double
|
||||
__ieee754_coshl (long double x)
|
||||
{
|
||||
fputs ("__ieee754_coshl not implemented\n", stderr);
|
||||
__set_errno (ENOSYS);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_coshl)
|
||||
#include <stub-tag.h>
|
30
math/e_exp10.c
Normal file
30
math/e_exp10.c
Normal file
@ -0,0 +1,30 @@
|
||||
/* Copyright (C) 1998 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
|
||||
|
||||
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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <math.h>
|
||||
#include "math_private.h"
|
||||
|
||||
|
||||
double
|
||||
__ieee754_exp10 (double arg)
|
||||
{
|
||||
/* This is a very stupid and inprecise implementation. It'll get
|
||||
replaced sometime (soon?). */
|
||||
return __ieee754_exp (M_LN10 * arg);
|
||||
}
|
30
math/e_exp10f.c
Normal file
30
math/e_exp10f.c
Normal file
@ -0,0 +1,30 @@
|
||||
/* Copyright (C) 1998 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
|
||||
|
||||
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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <math.h>
|
||||
#include "math_private.h"
|
||||
|
||||
|
||||
float
|
||||
__ieee754_exp10f (float arg)
|
||||
{
|
||||
/* This is a very stupid and inprecise implementation. It'll get
|
||||
replaced sometime (soon?). */
|
||||
return __ieee754_expf (M_LN10 * arg);
|
||||
}
|
30
math/e_exp10l.c
Normal file
30
math/e_exp10l.c
Normal file
@ -0,0 +1,30 @@
|
||||
/* Copyright (C) 1998 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998.
|
||||
|
||||
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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <math.h>
|
||||
#include "math_private.h"
|
||||
|
||||
|
||||
long double
|
||||
__ieee754_exp10l (long double arg)
|
||||
{
|
||||
/* This is a very stupid and inprecise implementation. It'll get
|
||||
replaced sometime (soon?). */
|
||||
return __ieee754_expl (M_LN10l * arg);
|
||||
}
|
14
math/e_exp2l.c
Normal file
14
math/e_exp2l.c
Normal file
@ -0,0 +1,14 @@
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
long double
|
||||
__ieee754_exp2l (long double x)
|
||||
{
|
||||
fputs ("__ieee754_exp2l not implemented\n", stderr);
|
||||
__set_errno (ENOSYS);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (exp2l)
|
||||
#include <stub-tag.h>
|
14
math/e_expl.c
Normal file
14
math/e_expl.c
Normal file
@ -0,0 +1,14 @@
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
long double
|
||||
__ieee754_expl (long double x)
|
||||
{
|
||||
fputs ("__ieee754_expl not implemented\n", stderr);
|
||||
__set_errno (ENOSYS);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (expl)
|
||||
#include <stub-tag.h>
|
14
math/e_fmodl.c
Normal file
14
math/e_fmodl.c
Normal file
@ -0,0 +1,14 @@
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
long double
|
||||
__ieee754_fmodl (long double x, long double y)
|
||||
{
|
||||
fputs ("__ieee754_fmodl not implemented\n", stderr);
|
||||
__set_errno (ENOSYS);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (fmodl)
|
||||
#include <stub-tag.h>
|
15
math/e_gammal_r.c
Normal file
15
math/e_gammal_r.c
Normal file
@ -0,0 +1,15 @@
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
long double
|
||||
__ieee754_gammal_r (long double x, int *signgamp)
|
||||
{
|
||||
*signgamp = 0;
|
||||
fputs ("__ieee754_gammal_r not implemented\n", stderr);
|
||||
__set_errno (ENOSYS);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_gammal_r)
|
||||
#include <stub-tag.h>
|
14
math/e_hypotl.c
Normal file
14
math/e_hypotl.c
Normal file
@ -0,0 +1,14 @@
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
long double
|
||||
__ieee754_hypotl (long double x, long double y)
|
||||
{
|
||||
fputs ("__ieee754_hypotl not implemented\n", stderr);
|
||||
__set_errno (ENOSYS);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (__ieee754_hypotl)
|
||||
#include <stub-tag.h>
|
25
math/e_j0l.c
Normal file
25
math/e_j0l.c
Normal file
@ -0,0 +1,25 @@
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include "math_private.h"
|
||||
|
||||
long double
|
||||
__ieee754_j0l (long double x)
|
||||
{
|
||||
fputs ("__ieee754_j0l not implemented\n", stderr);
|
||||
__set_errno (ENOSYS);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (j0l)
|
||||
|
||||
long double
|
||||
__ieee754_y0l (long double x)
|
||||
{
|
||||
fputs ("__ieee754_y0l not implemented\n", stderr);
|
||||
__set_errno (ENOSYS);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (y0l)
|
||||
#include <stub-tag.h>
|
25
math/e_j1l.c
Normal file
25
math/e_j1l.c
Normal file
@ -0,0 +1,25 @@
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include "math_private.h"
|
||||
|
||||
long double
|
||||
__ieee754_j1l (long double x)
|
||||
{
|
||||
fputs ("__ieee754_j1l not implemented\n", stderr);
|
||||
__set_errno (ENOSYS);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (j1l)
|
||||
|
||||
long double
|
||||
__ieee754_y1l (long double x)
|
||||
{
|
||||
fputs ("__ieee754_y1l not implemented\n", stderr);
|
||||
__set_errno (ENOSYS);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (y1l)
|
||||
#include <stub-tag.h>
|
25
math/e_jnl.c
Normal file
25
math/e_jnl.c
Normal file
@ -0,0 +1,25 @@
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include "math_private.h"
|
||||
|
||||
long double
|
||||
__ieee754_jnl (int n, long double x)
|
||||
{
|
||||
fputs ("__ieee754_jnl not implemented\n", stderr);
|
||||
__set_errno (ENOSYS);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (jnl)
|
||||
|
||||
long double
|
||||
__ieee754_ynl (int n, long double x)
|
||||
{
|
||||
fputs ("__ieee754_ynl not implemented\n", stderr);
|
||||
__set_errno (ENOSYS);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (ynl)
|
||||
#include <stub-tag.h>
|
17
math/e_lgammal_r.c
Normal file
17
math/e_lgammal_r.c
Normal file
@ -0,0 +1,17 @@
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include "math_private.h"
|
||||
|
||||
long double
|
||||
__ieee754_lgammal_r (long double x, int *signgamp)
|
||||
{
|
||||
*signgamp = 0;
|
||||
fputs ("__ieee754_lgammal_r not implemented\n", stderr);
|
||||
__set_errno (ENOSYS);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (lgammal)
|
||||
stub_warning (lgammal_r)
|
||||
#include <stub-tag.h>
|
14
math/e_log10l.c
Normal file
14
math/e_log10l.c
Normal file
@ -0,0 +1,14 @@
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
long double
|
||||
__ieee754_log10l (long double x)
|
||||
{
|
||||
fputs ("__ieee754_log10l not implemented\n", stderr);
|
||||
__set_errno (ENOSYS);
|
||||
return 0.0;
|
||||
}
|
||||
|
||||
stub_warning (log10l)
|
||||
#include <stub-tag.h>
|
34
misc/acct.c
Normal file
34
misc/acct.c
Normal file
@ -0,0 +1,34 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* Turn accounting on if NAME is an existing file. The system will then write
|
||||
a record for each process as it terminates, to this file. If NAME is NULL,
|
||||
turn accounting off. This call is restricted to the super-user. */
|
||||
int
|
||||
acct (name)
|
||||
const char *name;
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
|
||||
stub_warning (acct)
|
||||
#include <stub-tag.h>
|
37
misc/brk.c
Normal file
37
misc/brk.c
Normal file
@ -0,0 +1,37 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997, 2002 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* sbrk.c expects this. */
|
||||
void *__curbrk;
|
||||
|
||||
/* Set the end of the process's data space to ADDR.
|
||||
Return 0 if successful, -1 if not. */
|
||||
int
|
||||
__brk (addr)
|
||||
void *addr;
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
stub_warning (brk)
|
||||
|
||||
weak_alias (__brk, brk)
|
||||
#include <stub-tag.h>
|
43
misc/chflags.c
Normal file
43
misc/chflags.c
Normal file
@ -0,0 +1,43 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997, 2004 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stddef.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
/* Change the flags of FILE to FLAGS. */
|
||||
|
||||
int chflags (const char *file, int flags) __THROW;
|
||||
|
||||
int
|
||||
chflags (file, flags)
|
||||
const char *file;
|
||||
int flags;
|
||||
{
|
||||
if (file == NULL)
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
|
||||
stub_warning (chflags)
|
||||
#include <stub-tag.h>
|
34
misc/chroot.c
Normal file
34
misc/chroot.c
Normal file
@ -0,0 +1,34 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* Make PATH be the root directory (the starting point for absolute paths).
|
||||
This call is restricted to the super-user. */
|
||||
int
|
||||
chroot (path)
|
||||
const char *path;
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
stub_warning (chroot)
|
||||
#include <stub-tag.h>
|
@ -1,3 +1,9 @@
|
||||
2005-12-13 Ulrich Drepper <drepper@redhat.com>
|
||||
|
||||
* sysdeps/pthread/sigfillset.c: Adjust for files moved out of
|
||||
sysdeps/generic.
|
||||
* errno-loc.c: New file.
|
||||
|
||||
2005-12-12 Roland McGrath <roland@redhat.com>
|
||||
|
||||
* init.c (__pthread_initialize_minimal_internal): Do __static_tls_size
|
||||
|
1
nptl/errno-loc.c
Normal file
1
nptl/errno-loc.c
Normal file
@ -0,0 +1 @@
|
||||
#include "../csu/errno-loc.c"
|
@ -1,4 +1,4 @@
|
||||
/* Copyright (C) 2003 Free Software Foundation, Inc.
|
||||
/* Copyright (C) 2003, 2005 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
|
||||
@ -18,4 +18,4 @@
|
||||
|
||||
#include <nptl/pthreadP.h>
|
||||
|
||||
#include <sysdeps/generic/sigfillset.c>
|
||||
#include <signal/sigfillset.c>
|
||||
|
39
posix/alarm.c
Normal file
39
posix/alarm.c
Normal file
@ -0,0 +1,39 @@
|
||||
/* Copyright (C) 1991,95,96,97,2002 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* Schedule an alarm. In SECONDS seconds, the process will get a SIGALRM.
|
||||
If SECONDS is zero, any currently scheduled alarm will be cancelled.
|
||||
The function returns the number of seconds remaining until the last
|
||||
alarm scheduled would have signaled, or zero if there wasn't one.
|
||||
There is no return value to indicate an error, but you can set `errno'
|
||||
to 0 and check its value after calling `alarm', and this might tell you.
|
||||
The signal may come late due to processor scheduling. */
|
||||
unsigned int
|
||||
alarm (seconds)
|
||||
unsigned int seconds;
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return 0;
|
||||
}
|
||||
libc_hidden_def (alarm)
|
||||
|
||||
stub_warning (alarm)
|
||||
#include <stub-tag.h>
|
44
rt/aio_cancel.c
Normal file
44
rt/aio_cancel.c
Normal file
@ -0,0 +1,44 @@
|
||||
/* Cancel requests associated with given file descriptor. Stub version.
|
||||
Copyright (C) 2001 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
|
||||
/* We use an UGLY hack to prevent gcc from finding us cheating. The
|
||||
implementation of aio_cancel and aio_cancel64 are identical and so
|
||||
we want to avoid code duplication by using aliases. But gcc sees
|
||||
the different parameter lists and prints a warning. We define here
|
||||
a function so that aio_cancel64 has no prototype. */
|
||||
#define aio_cancel64 XXX
|
||||
#include <aio.h>
|
||||
/* And undo the hack. */
|
||||
#undef aio_cancel64
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
int
|
||||
aio_cancel (int fildes, struct aiocb *aiocbp)
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
|
||||
weak_alias (aio_cancel, aio_cancel64)
|
||||
|
||||
stub_warning (aio_cancel)
|
||||
stub_warning (aio_cancel64)
|
||||
#include <stub-tag.h>
|
51
rt/aio_fsync.c
Normal file
51
rt/aio_fsync.c
Normal file
@ -0,0 +1,51 @@
|
||||
/* Synchronize I/O in given file descriptor. Stub version.
|
||||
Copyright (C) 2001 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
|
||||
/* We use an UGLY hack to prevent gcc from finding us cheating. The
|
||||
implementation of aio_fsync and aio_fsync64 are identical and so
|
||||
we want to avoid code duplication by using aliases. But gcc sees
|
||||
the different parameter lists and prints a warning. We define here
|
||||
a function so that aio_fsync64 has no prototype. */
|
||||
#define aio_fsync64 XXX
|
||||
#include <aio.h>
|
||||
/* And undo the hack. */
|
||||
#undef aio_fsync64
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
|
||||
int
|
||||
aio_fsync (int op, struct aiocb *aiocbp)
|
||||
{
|
||||
if (op != O_SYNC && op != O_DSYNC)
|
||||
{
|
||||
__set_errno (EINVAL);
|
||||
return -1;
|
||||
}
|
||||
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
|
||||
weak_alias (aio_fsync, aio_fsync64)
|
||||
|
||||
stub_warning (aio_fsync)
|
||||
stub_warning (aio_fsync64)
|
||||
#include <stub-tag.h>
|
29
rt/aio_misc.c
Normal file
29
rt/aio_misc.c
Normal file
@ -0,0 +1,29 @@
|
||||
/* Handle general operations. Stub version.
|
||||
Copyright (C) 2001 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <aio.h>
|
||||
#include <aio_misc.h>
|
||||
|
||||
/* This file is for internal code needed by the aio_* implementation. */
|
||||
|
||||
void
|
||||
__aio_init (const struct aioinit *init)
|
||||
{
|
||||
}
|
||||
weak_alias (__aio_init, aio_init)
|
24
rt/aio_notify.c
Normal file
24
rt/aio_notify.c
Normal file
@ -0,0 +1,24 @@
|
||||
/* Notify initiator of AIO request. Stub version.
|
||||
Copyright (C) 2001 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <aio.h>
|
||||
#include <aio_misc.h>
|
||||
|
||||
/* This file contains only internal functions used by
|
||||
the particular aio_* implementation code. */
|
36
rt/aio_read.c
Normal file
36
rt/aio_read.c
Normal file
@ -0,0 +1,36 @@
|
||||
/* Asynchronous read. Stub version.
|
||||
Copyright (C) 2001 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <aio.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef BE_AIO64
|
||||
#define aiocb aiocb64
|
||||
#define aio_read aio_read64
|
||||
#endif
|
||||
|
||||
int
|
||||
aio_read (struct aiocb *aiocbp)
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
|
||||
stub_warning (aio_read)
|
||||
#include <stub-tag.h>
|
2
rt/aio_read64.c
Normal file
2
rt/aio_read64.c
Normal file
@ -0,0 +1,2 @@
|
||||
#define BE_AIO64
|
||||
#include "aio_read.c"
|
36
rt/aio_sigqueue.c
Normal file
36
rt/aio_sigqueue.c
Normal file
@ -0,0 +1,36 @@
|
||||
/* Copyright (C) 1997, 1999 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <aio.h>
|
||||
#include <errno.h>
|
||||
#include <signal.h>
|
||||
|
||||
#include "aio_misc.h"
|
||||
|
||||
int
|
||||
__aio_sigqueue (sig, val, caller_pid)
|
||||
int sig;
|
||||
const union sigval val;
|
||||
pid_t caller_pid;
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
|
||||
stub_warning (__aio_sigqueue)
|
||||
#include <stub-tag.h>
|
46
rt/aio_suspend.c
Normal file
46
rt/aio_suspend.c
Normal file
@ -0,0 +1,46 @@
|
||||
/* Suspend until termination of a requests. Stub version.
|
||||
Copyright (C) 2001 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
|
||||
/* We use an UGLY hack to prevent gcc from finding us cheating. The
|
||||
implementations of aio_suspend and aio_suspend64 are identical and so
|
||||
we want to avoid code duplication by using aliases. But gcc sees
|
||||
the different parameter lists and prints a warning. We define here
|
||||
a function so that aio_suspend64 has no prototype. */
|
||||
#define aio_suspend64 XXX
|
||||
#include <aio.h>
|
||||
/* And undo the hack. */
|
||||
#undef aio_suspend64
|
||||
|
||||
#include <errno.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
|
||||
int
|
||||
aio_suspend (const struct aiocb *const list[], int nent,
|
||||
const struct timespec *timeout)
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
weak_alias (aio_suspend, aio_suspend64)
|
||||
|
||||
stub_warning (aio_suspend)
|
||||
stub_warning (aio_suspend64)
|
||||
#include <stub-tag.h>
|
36
rt/aio_write.c
Normal file
36
rt/aio_write.c
Normal file
@ -0,0 +1,36 @@
|
||||
/* Asynchronous write. Stub version.
|
||||
Copyright (C) 2001 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <aio.h>
|
||||
#include <errno.h>
|
||||
|
||||
#ifdef BE_AIO64
|
||||
#define aiocb aiocb64
|
||||
#define aio_write aio_write64
|
||||
#endif
|
||||
|
||||
int
|
||||
aio_write (struct aiocb *aiocbp)
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
|
||||
stub_warning (aio_write)
|
||||
#include <stub-tag.h>
|
2
rt/aio_write64.c
Normal file
2
rt/aio_write64.c
Normal file
@ -0,0 +1,2 @@
|
||||
#define BE_AIO64
|
||||
#include "aio_write.c"
|
39
rt/clock_getcpuclockid.c
Normal file
39
rt/clock_getcpuclockid.c
Normal file
@ -0,0 +1,39 @@
|
||||
/* Copyright (C) 2000, 2001 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int
|
||||
clock_getcpuclockid (pid_t pid, clockid_t *clock_id)
|
||||
{
|
||||
/* We don't allow any process ID but our own. */
|
||||
if (pid != 0 && pid != getpid ())
|
||||
return EPERM;
|
||||
|
||||
#ifdef CLOCK_PROCESS_CPUTIME_ID
|
||||
/* Store the number. */
|
||||
*clock_id = CLOCK_PROCESS_CPUTIME_ID;
|
||||
|
||||
return 0;
|
||||
#else
|
||||
/* We don't have a timer for that. */
|
||||
return ENOENT;
|
||||
#endif
|
||||
}
|
30
rt/clock_getres.c
Normal file
30
rt/clock_getres.c
Normal file
@ -0,0 +1,30 @@
|
||||
/* Copyright (C) 1999 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
|
||||
/* Get resolution of clock. */
|
||||
int
|
||||
clock_getres (clockid_t clock_id, struct timespec *res)
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
stub_warning (clock_getres)
|
||||
#include <stub-tag.h>
|
31
rt/clock_gettime.c
Normal file
31
rt/clock_gettime.c
Normal file
@ -0,0 +1,31 @@
|
||||
/* Copyright (C) 1999, 2005 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
|
||||
/* Get current value of CLOCK and store it in TP. */
|
||||
int
|
||||
clock_gettime (clockid_t clock_id, struct timespec *tp)
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
librt_hidden_def (clock_gettime)
|
||||
stub_warning (clock_gettime)
|
||||
#include <stub-tag.h>
|
39
rt/clock_nanosleep.c
Normal file
39
rt/clock_nanosleep.c
Normal file
@ -0,0 +1,39 @@
|
||||
/* High-resolution sleep with the specified clock. Stub version.
|
||||
Copyright (C) 2000 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
|
||||
int
|
||||
clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req,
|
||||
struct timespec *rem)
|
||||
{
|
||||
if (__builtin_expect (req->tv_nsec, 0) < 0
|
||||
|| __builtin_expect (req->tv_nsec, 0) >= 1000000000)
|
||||
return EINVAL;
|
||||
|
||||
if (flags != TIMER_ABSTIME && flags != 0)
|
||||
return EINVAL;
|
||||
|
||||
/* Not implemented. */
|
||||
return ENOSYS;
|
||||
}
|
||||
stub_warning (clock_nanosleep)
|
||||
#include <stub-tag.h>
|
30
rt/clock_settime.c
Normal file
30
rt/clock_settime.c
Normal file
@ -0,0 +1,30 @@
|
||||
/* Copyright (C) 1999 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
|
||||
/* Set CLOCK to value TP. */
|
||||
int
|
||||
clock_settime (clockid_t clock_id, const struct timespec *tp)
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
stub_warning (clock_settime)
|
||||
#include <stub-tag.h>
|
35
setjmp/bsd-_setjmp.c
Normal file
35
setjmp/bsd-_setjmp.c
Normal file
@ -0,0 +1,35 @@
|
||||
/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. Stub version.
|
||||
Copyright (C) 1994, 1997, 1999, 2000, 2002 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <setjmp.h>
|
||||
|
||||
#undef _setjmp
|
||||
|
||||
/* This implementation in C will not usually work, because the call
|
||||
really needs to be a tail-call so __sigsetjmp saves the state of
|
||||
the caller, not the state of this `setjmp' frame which then
|
||||
immediate unwinds. */
|
||||
|
||||
int
|
||||
_setjmp (jmp_buf env)
|
||||
{
|
||||
return __sigsetjmp (env, 0);
|
||||
}
|
||||
libc_hidden_def (_setjmp)
|
34
setjmp/bsd-setjmp.c
Normal file
34
setjmp/bsd-setjmp.c
Normal file
@ -0,0 +1,34 @@
|
||||
/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. Stub version.
|
||||
Copyright (C) 1994, 1997, 1999 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <sysdep.h>
|
||||
#include <setjmp.h>
|
||||
|
||||
#undef setjmp
|
||||
|
||||
/* This implementation in C will not usually work, because the call
|
||||
really needs to be a tail-call so __sigsetjmp saves the state of
|
||||
the caller, not the state of this `setjmp' frame which then
|
||||
immediate unwinds. */
|
||||
|
||||
int
|
||||
setjmp (jmp_buf env)
|
||||
{
|
||||
return __sigsetjmp (env, 1);
|
||||
}
|
96
signal/allocrtsig.c
Normal file
96
signal/allocrtsig.c
Normal file
@ -0,0 +1,96 @@
|
||||
/* Handle real-time signal allocation.
|
||||
Copyright (C) 1997,98,99,2002 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
|
||||
|
||||
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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <signal.h>
|
||||
|
||||
/* In these variables we keep track of the used variables. If the
|
||||
platform does not support any real-time signals we will define the
|
||||
values to some unreasonable value which will signal failing of all
|
||||
the functions below. */
|
||||
#ifndef __SIGRTMIN
|
||||
static int current_rtmin = -1;
|
||||
static int current_rtmax = -1;
|
||||
#else
|
||||
static int current_rtmin;
|
||||
static int current_rtmax;
|
||||
|
||||
static int initialized;
|
||||
|
||||
#include <testrtsig.h>
|
||||
|
||||
static void
|
||||
init (void)
|
||||
{
|
||||
if (!kernel_has_rtsig ())
|
||||
{
|
||||
current_rtmin = -1;
|
||||
current_rtmax = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
current_rtmin = __SIGRTMIN;
|
||||
current_rtmax = __SIGRTMAX;
|
||||
}
|
||||
initialized = 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Return number of available real-time signal with highest priority. */
|
||||
int
|
||||
__libc_current_sigrtmin (void)
|
||||
{
|
||||
#ifdef __SIGRTMIN
|
||||
if (!initialized)
|
||||
init ();
|
||||
#endif
|
||||
return current_rtmin;
|
||||
}
|
||||
libc_hidden_def (__libc_current_sigrtmin)
|
||||
|
||||
/* Return number of available real-time signal with lowest priority. */
|
||||
int
|
||||
__libc_current_sigrtmax (void)
|
||||
{
|
||||
#ifdef __SIGRTMIN
|
||||
if (!initialized)
|
||||
init ();
|
||||
#endif
|
||||
return current_rtmax;
|
||||
}
|
||||
libc_hidden_def (__libc_current_sigrtmax)
|
||||
|
||||
/* Allocate real-time signal with highest/lowest available
|
||||
priority. Please note that we don't use a lock since we assume
|
||||
this function to be called at program start. */
|
||||
int
|
||||
__libc_allocate_rtsig (int high)
|
||||
{
|
||||
#ifndef __SIGRTMIN
|
||||
return -1;
|
||||
#else
|
||||
if (!initialized)
|
||||
init ();
|
||||
if (current_rtmin == -1 || current_rtmin > current_rtmax)
|
||||
/* We don't have anymore signal available. */
|
||||
return -1;
|
||||
|
||||
return high ? current_rtmin++ : current_rtmax--;
|
||||
#endif
|
||||
}
|
40
socket/accept.c
Normal file
40
socket/accept.c
Normal file
@ -0,0 +1,40 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997, 2002 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
/* Await a connection on socket FD.
|
||||
When a connection arrives, open a new socket to communicate with it,
|
||||
set *ADDR (which is *ADDR_LEN bytes long) to the address of the connecting
|
||||
peer and *ADDR_LEN to the address's actual length, and return the
|
||||
new socket's descriptor, or -1 for errors. */
|
||||
int
|
||||
accept (fd, addr, addr_len)
|
||||
int fd;
|
||||
__SOCKADDR_ARG addr;
|
||||
socklen_t *addr_len;
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
libc_hidden_def (accept)
|
||||
|
||||
|
||||
stub_warning (accept)
|
||||
#include <stub-tag.h>
|
36
socket/bind.c
Normal file
36
socket/bind.c
Normal file
@ -0,0 +1,36 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997, 2002 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
/* Give the socket FD the local address ADDR (which is LEN bytes long). */
|
||||
int
|
||||
__bind (fd, addr, len)
|
||||
int fd;
|
||||
__CONST_SOCKADDR_ARG addr;
|
||||
socklen_t len;
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
|
||||
weak_alias (__bind, bind)
|
||||
|
||||
stub_warning (bind)
|
||||
#include <stub-tag.h>
|
38
socket/connect.c
Normal file
38
socket/connect.c
Normal file
@ -0,0 +1,38 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
/* Open a connection on socket FD to peer at ADDR (which LEN bytes long).
|
||||
For connectionless socket types, just set the default address to send to
|
||||
and the only address from which to accept transmissions.
|
||||
Return 0 on success, -1 for errors. */
|
||||
int
|
||||
__connect (fd, addr, len)
|
||||
int fd;
|
||||
__CONST_SOCKADDR_ARG addr;
|
||||
socklen_t len;
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return -1;
|
||||
}
|
||||
weak_alias (__connect, connect)
|
||||
|
||||
stub_warning (connect)
|
||||
#include <stub-tag.h>
|
36
stdio-common/ctermid.c
Normal file
36
stdio-common/ctermid.c
Normal file
@ -0,0 +1,36 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
|
||||
|
||||
/* Return the name of the controlling terminal.
|
||||
If S is not NULL, the name is copied into it (it should be at
|
||||
least L_ctermid bytes long), otherwise a static buffer is used. */
|
||||
char *
|
||||
ctermid (s)
|
||||
char *s;
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
stub_warning (ctermid)
|
||||
#include <stub-tag.h>
|
35
stdio-common/cuserid.c
Normal file
35
stdio-common/cuserid.c
Normal file
@ -0,0 +1,35 @@
|
||||
/* Copyright (C) 1991, 1995, 1996, 1997 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
|
||||
/* Return the username of the caller.
|
||||
If S is not NULL, it points to a buffer of at least L_cuserid bytes
|
||||
into which the name is copied; otherwise, a static buffer is used. */
|
||||
char *
|
||||
cuserid (s)
|
||||
char *s;
|
||||
{
|
||||
__set_errno (ENOSYS);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
stub_warning (cuserid)
|
||||
#include <stub-tag.h>
|
140
stdlib/abort.c
Normal file
140
stdlib/abort.c
Normal file
@ -0,0 +1,140 @@
|
||||
/* Copyright (C) 1991,93,95,96,97,98,2001,02 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <bits/libc-lock.h>
|
||||
#include <signal.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/* Try to get a machine dependent instruction which will make the
|
||||
program crash. This is used in case everything else fails. */
|
||||
#include <abort-instr.h>
|
||||
#ifndef ABORT_INSTRUCTION
|
||||
/* No such instruction is available. */
|
||||
# define ABORT_INSTRUCTION
|
||||
#endif
|
||||
|
||||
#ifdef USE_IN_LIBIO
|
||||
# include <libio/libioP.h>
|
||||
# define fflush(s) _IO_flush_all_lockp (0)
|
||||
#endif
|
||||
|
||||
/* We must avoid to run in circles. Therefore we remember how far we
|
||||
already got. */
|
||||
static int stage;
|
||||
|
||||
/* We should be prepared for multiple threads trying to run abort. */
|
||||
__libc_lock_define_initialized_recursive (static, lock);
|
||||
|
||||
|
||||
/* Cause an abnormal program termination with core-dump. */
|
||||
void
|
||||
abort (void)
|
||||
{
|
||||
struct sigaction act;
|
||||
sigset_t sigs;
|
||||
|
||||
/* First acquire the lock. */
|
||||
__libc_lock_lock_recursive (lock);
|
||||
|
||||
/* Now it's for sure we are alone. But recursive calls are possible. */
|
||||
|
||||
/* Unlock SIGABRT. */
|
||||
if (stage == 0)
|
||||
{
|
||||
++stage;
|
||||
if (__sigemptyset (&sigs) == 0 &&
|
||||
__sigaddset (&sigs, SIGABRT) == 0)
|
||||
__sigprocmask (SIG_UNBLOCK, &sigs, (sigset_t *) NULL);
|
||||
}
|
||||
|
||||
/* Flush all streams. We cannot close them now because the user
|
||||
might have registered a handler for SIGABRT. */
|
||||
if (stage == 1)
|
||||
{
|
||||
++stage;
|
||||
fflush (NULL);
|
||||
}
|
||||
|
||||
/* Send signal which possibly calls a user handler. */
|
||||
if (stage == 2)
|
||||
{
|
||||
/* This stage is special: we must allow repeated calls of
|
||||
`abort' when a user defined handler for SIGABRT is installed.
|
||||
This is risky since the `raise' implementation might also
|
||||
fail but I don't see another possibility. */
|
||||
int save_stage = stage;
|
||||
|
||||
stage = 0;
|
||||
__libc_lock_unlock_recursive (lock);
|
||||
|
||||
raise (SIGABRT);
|
||||
|
||||
__libc_lock_lock_recursive (lock);
|
||||
stage = save_stage + 1;
|
||||
}
|
||||
|
||||
/* There was a handler installed. Now remove it. */
|
||||
if (stage == 3)
|
||||
{
|
||||
++stage;
|
||||
memset (&act, '\0', sizeof (struct sigaction));
|
||||
act.sa_handler = SIG_DFL;
|
||||
__sigfillset (&act.sa_mask);
|
||||
act.sa_flags = 0;
|
||||
__sigaction (SIGABRT, &act, NULL);
|
||||
}
|
||||
|
||||
/* Now close the streams which also flushes the output the user
|
||||
defined handler might has produced. */
|
||||
if (stage == 4)
|
||||
{
|
||||
++stage;
|
||||
__fcloseall ();
|
||||
}
|
||||
|
||||
/* Try again. */
|
||||
if (stage == 5)
|
||||
{
|
||||
++stage;
|
||||
raise (SIGABRT);
|
||||
}
|
||||
|
||||
/* Now try to abort using the system specific command. */
|
||||
if (stage == 6)
|
||||
{
|
||||
++stage;
|
||||
ABORT_INSTRUCTION;
|
||||
}
|
||||
|
||||
/* If we can't signal ourselves and the abort instruction failed, exit. */
|
||||
if (stage == 7)
|
||||
{
|
||||
++stage;
|
||||
_exit (127);
|
||||
}
|
||||
|
||||
/* If even this fails try to use the provided instruction to crash
|
||||
or otherwise make sure we never return. */
|
||||
while (1)
|
||||
/* Try for ever and ever. */
|
||||
ABORT_INSTRUCTION;
|
||||
}
|
||||
libc_hidden_def (abort)
|
62
stdlib/add_n.c
Normal file
62
stdlib/add_n.c
Normal file
@ -0,0 +1,62 @@
|
||||
/* mpn_add_n -- Add two limb vectors of equal, non-zero length.
|
||||
|
||||
Copyright (C) 1992, 1993, 1994, 1996 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of the GNU MP Library.
|
||||
|
||||
The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
|
||||
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
MA 02111-1307, USA. */
|
||||
|
||||
#include <gmp.h>
|
||||
#include "gmp-impl.h"
|
||||
|
||||
mp_limb_t
|
||||
#if __STDC__
|
||||
mpn_add_n (mp_ptr res_ptr, mp_srcptr s1_ptr, mp_srcptr s2_ptr, mp_size_t size)
|
||||
#else
|
||||
mpn_add_n (res_ptr, s1_ptr, s2_ptr, size)
|
||||
register mp_ptr res_ptr;
|
||||
register mp_srcptr s1_ptr;
|
||||
register mp_srcptr s2_ptr;
|
||||
mp_size_t size;
|
||||
#endif
|
||||
{
|
||||
register mp_limb_t x, y, cy;
|
||||
register mp_size_t j;
|
||||
|
||||
/* The loop counter and index J goes from -SIZE to -1. This way
|
||||
the loop becomes faster. */
|
||||
j = -size;
|
||||
|
||||
/* Offset the base pointers to compensate for the negative indices. */
|
||||
s1_ptr -= j;
|
||||
s2_ptr -= j;
|
||||
res_ptr -= j;
|
||||
|
||||
cy = 0;
|
||||
do
|
||||
{
|
||||
y = s2_ptr[j];
|
||||
x = s1_ptr[j];
|
||||
y += cy; /* add previous carry to one addend */
|
||||
cy = (y < cy); /* get out carry from that addition */
|
||||
y = x + y; /* add other addend */
|
||||
cy = (y < x) + cy; /* get out carry from that add, combine */
|
||||
res_ptr[j] = y;
|
||||
}
|
||||
while (++j != 0);
|
||||
|
||||
return cy;
|
||||
}
|
65
stdlib/addmul_1.c
Normal file
65
stdlib/addmul_1.c
Normal file
@ -0,0 +1,65 @@
|
||||
/* mpn_addmul_1 -- multiply the S1_SIZE long limb vector pointed to by S1_PTR
|
||||
by S2_LIMB, add the S1_SIZE least significant limbs of the product to the
|
||||
limb vector pointed to by RES_PTR. Return the most significant limb of
|
||||
the product, adjusted for carry-out from the addition.
|
||||
|
||||
Copyright (C) 1992, 1993, 1994, 1996 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of the GNU MP Library.
|
||||
|
||||
The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
|
||||
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
MA 02111-1307, USA. */
|
||||
|
||||
#include <gmp.h>
|
||||
#include "gmp-impl.h"
|
||||
#include "longlong.h"
|
||||
|
||||
mp_limb_t
|
||||
mpn_addmul_1 (res_ptr, s1_ptr, s1_size, s2_limb)
|
||||
register mp_ptr res_ptr;
|
||||
register mp_srcptr s1_ptr;
|
||||
mp_size_t s1_size;
|
||||
register mp_limb_t s2_limb;
|
||||
{
|
||||
register mp_limb_t cy_limb;
|
||||
register mp_size_t j;
|
||||
register mp_limb_t prod_high, prod_low;
|
||||
register mp_limb_t x;
|
||||
|
||||
/* The loop counter and index J goes from -SIZE to -1. This way
|
||||
the loop becomes faster. */
|
||||
j = -s1_size;
|
||||
|
||||
/* Offset the base pointers to compensate for the negative indices. */
|
||||
res_ptr -= j;
|
||||
s1_ptr -= j;
|
||||
|
||||
cy_limb = 0;
|
||||
do
|
||||
{
|
||||
umul_ppmm (prod_high, prod_low, s1_ptr[j], s2_limb);
|
||||
|
||||
prod_low += cy_limb;
|
||||
cy_limb = (prod_low < cy_limb) + prod_high;
|
||||
|
||||
x = res_ptr[j];
|
||||
prod_low = x + prod_low;
|
||||
cy_limb += (prod_low < x);
|
||||
res_ptr[j] = prod_low;
|
||||
}
|
||||
while (++j != 0);
|
||||
|
||||
return cy_limb;
|
||||
}
|
56
stdlib/cmp.c
Normal file
56
stdlib/cmp.c
Normal file
@ -0,0 +1,56 @@
|
||||
/* mpn_cmp -- Compare two low-level natural-number integers.
|
||||
|
||||
Copyright (C) 1991, 1993, 1994, 1996 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of the GNU MP Library.
|
||||
|
||||
The GNU MP 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 MP 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 MP Library; see the file COPYING.LIB. If not, write to
|
||||
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
|
||||
MA 02111-1307, USA. */
|
||||
|
||||
#include <gmp.h>
|
||||
#include "gmp-impl.h"
|
||||
|
||||
/* Compare OP1_PTR/OP1_SIZE with OP2_PTR/OP2_SIZE.
|
||||
There are no restrictions on the relative sizes of
|
||||
the two arguments.
|
||||
Return 1 if OP1 > OP2, 0 if they are equal, and -1 if OP1 < OP2. */
|
||||
|
||||
int
|
||||
#if __STDC__
|
||||
mpn_cmp (mp_srcptr op1_ptr, mp_srcptr op2_ptr, mp_size_t size)
|
||||
#else
|
||||
mpn_cmp (op1_ptr, op2_ptr, size)
|
||||
mp_srcptr op1_ptr;
|
||||
mp_srcptr op2_ptr;
|
||||
mp_size_t size;
|
||||
#endif
|
||||
{
|
||||
mp_size_t i;
|
||||
mp_limb_t op1_word, op2_word;
|
||||
|
||||
for (i = size - 1; i >= 0; i--)
|
||||
{
|
||||
op1_word = op1_ptr[i];
|
||||
op2_word = op2_ptr[i];
|
||||
if (op1_word != op2_word)
|
||||
goto diff;
|
||||
}
|
||||
return 0;
|
||||
diff:
|
||||
/* This can *not* be simplified to
|
||||
op2_word - op2_word
|
||||
since that expression might give signed overflow. */
|
||||
return (op1_word > op2_word) ? 1 : -1;
|
||||
}
|
32
stdlib/dbl2mpn.c
Normal file
32
stdlib/dbl2mpn.c
Normal file
@ -0,0 +1,32 @@
|
||||
/* Copyright (C) 1993, 1997 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
#include <gmp.h>
|
||||
#include "gmp-impl.h"
|
||||
|
||||
/* Convert a `double' to a multi-precision integer representing the
|
||||
significand scaled up by the highest possible number of significant bits
|
||||
of fraction (DBL_MANT_DIG), and an integral power of two (MPN frexp). */
|
||||
|
||||
mp_size_t
|
||||
__mpn_extract_double (mp_ptr res_ptr, mp_size_t size,
|
||||
int *expt, int *is_neg,
|
||||
double value)
|
||||
{
|
||||
#error "__mpn_extract_double is not implemented for this floating point format"
|
||||
}
|
86
stdlib/div.c
Normal file
86
stdlib/div.c
Normal file
@ -0,0 +1,86 @@
|
||||
/* Copyright (C) 1992, 1997, 1999 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, write to the Free
|
||||
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
02111-1307 USA. */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1990 Regents of the University of California.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This code is derived from software contributed to Berkeley by
|
||||
* Chris Torek.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
/* Return the `div_t' representation of NUMER over DENOM. */
|
||||
div_t
|
||||
div (numer, denom)
|
||||
int numer, denom;
|
||||
{
|
||||
div_t result;
|
||||
|
||||
result.quot = numer / denom;
|
||||
result.rem = numer % denom;
|
||||
|
||||
/* The ANSI standard says that |QUOT| <= |NUMER / DENOM|, where
|
||||
NUMER / DENOM is to be computed in infinite precision. In
|
||||
other words, we should always truncate the quotient towards
|
||||
zero, never -infinity. Machine division and remainer may
|
||||
work either way when one or both of NUMER or DENOM is
|
||||
negative. If only one is negative and QUOT has been
|
||||
truncated towards -infinity, REM will have the same sign as
|
||||
DENOM and the opposite sign of NUMER; if both are negative
|
||||
and QUOT has been truncated towards -infinity, REM will be
|
||||
positive (will have the opposite sign of NUMER). These are
|
||||
considered `wrong'. If both are NUM and DENOM are positive,
|
||||
RESULT will always be positive. This all boils down to: if
|
||||
NUMER >= 0, but REM < 0, we got the wrong answer. In that
|
||||
case, to get the right answer, add 1 to QUOT and subtract
|
||||
DENOM from REM. */
|
||||
|
||||
if (numer >= 0 && result.rem < 0)
|
||||
{
|
||||
++result.quot;
|
||||
result.rem -= denom;
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user