mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-29 11:41:21 +03:00
update from main archive 970226
1997-02-27 05:12 Ulrich Drepper <drepper@cygnus.com> * manual/Makefile: Add rules to run and distribute xtract-typefun. * manual/xtract-typefun.awk: New file. Script to extract function, variable, macro anchor to put into the `dir' file. * manual/signal.texi: Document difference between SysV and BSD signal(3) function and add documentation for sysv_signal. * sysdeps/libm-i387/e_acoshl.c: Clear upper half of word containing exponent before comparing. 1997-02-27 01:13 Ulrich Drepper <drepper@cygnus.com> * sysdeps/generic/netinet/in.h (htonl, htons, ntohl, ntohs): Change prototypes to use types with explicit width. `unsigned long' is different on 64 bit systems. * sysdeps/unix/sysv/linux/netinet/in.h: Likewise. * sysdeps/generic/htonl.c: Likewise. * sysdeps/generic/htons.c: Likewise. * sysdeps/generic/ntohl.c: Likewise. * sysdeps/generic/ntohs.c: Likewise. Suggested by a sun <asun@zoology.washington.edu>. 1997-02-26 08:30 Andreas Jaeger <aj@arthur.pfalz.de> * math/math.h: Include <__math.h> if __NO_MATH_INLINES is not defined and we want optimization. 1997-02-27 01:13 Ulrich Drepper <drepper@cygnus.com> * sysdeps/generic/netinet/in.h (htonl, htons, ntohl, ntohs): Change prototypes to use types with explicit width. `unsigned long' is different on 64 bit systems. Suggested by a sun <asun@zoology.washington.edu>. 1997-02-02 19:53 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * misc/getpass.c: Don't disable canonical input. Reverted patch of Mon Jan 6 01:35:29 1997. 1996-12-14 22:07 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * libio/libioP.h (_IO_finish_t): Take additional parameter, to match the hidden __in_chrg parameter of the destructor. (_IO_FINISH): Pass zero for it. * libio/genops.c (_IO_default_finish): Add second parameter, which is ignored. * libio/memstream.c (_IO_mem_finish): Likewise. * libio/fileops.c (_IO_mem_finish): Likewise. * libio/strops.c (_IO_str_finish): Likewise. All callers changed. 1997-02-27 00:23 H.J. Lu <hjl@lucon.org> * time/Makefile: Avoid using patterns in dependencies. 1997-02-26 00:56 Miguel de Icaza <miguel@nuclecu.unam.mx> * elf/rtld.c: Make _dl_start static. Otherwise the linker on the SPARC will convert the call _dl_start into a call into the PLT. * elf/rtld.c (_dl_start): On the SPARC we need to adjust the value of arg to make it point to the actual values. * sysdeps/sparc/elf/DEFS.h: New ELF specific version. * sysdeps/sparc/Dist: Mention sysdeps/sparc/elf/DEFS.h. * sysdeps/sparc/bsd-_setjmp.S, sysdeps/sparc/bsd-setjmp.S: Make them PIC aware. * sysdeps/sparc/dl-machine.h (elf_machine_load_address): Implemented. (elf_machine_rela): Make it compile; fix existing relocation types; add unhandled relocation types. (ELF_ADJUST_ARG): Get pointer to arguments at program startup. (RTLD_START): Initial implementation, not yet finished. * sysdeps/sparc/elf/start.S: Fix. * sysdeps/sparc/fpu_control.h: Remove duplicate declaration of __setfpucw. * sysdeps/sparc/divrem.m4: Make compilable under Linux. * sysdeps/sparc/rem.S, sysdeps/sparc/sdiv.S, sysdeps/sparc/udiv.S, sysdeps/sparc/urem.S : Regenerated. * sysdeps/sparc/setjmp.S: Make it PIC aware. * sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S: Define __ASSEMBLY__ before using kernel header. * sysdeps/unix/sysv/linux/sparc/Makefile: Use -mv8 flag to compile rtld.c. * sysdeps/unix/sysv/linux/sparc/brk.c: Implement. * sysdeps/unix/sysv/linux/sparc/profil-counter.h: Remove code to handle old signals. * sysdeps/unix/sysv/linux/sparc/sigaction.c: Implements sigaction for all Linux/SPARC kernels. * sysdeps/unix/sysv/linux/sparc/syscall.S: Add code to store errno using __errno_location. * sysdeps/unix/sysv/linux/sparc/sysdep.h: Add various handler macros for assembler sources. * sysdeps/unix/sysv/linux/sparc/errno.c: Define errno. 1997-02-25 16:02 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * elf/rtld.c (dl_main): Remove dead code that is never executed. Rename local variable l to main_map where it is used to point to the load_map for the executable. 1997-02-25 15:03 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * elf/dl-version.c (_dl_check_all_versions): Ignore libraries that could not be found. 1997-02-24 23:18 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de> * Makerules: Generate implicit object suffix rules automagically. (o-iterator): Move before first use. * Makeconfig (all-object-suffixes): Add .bo suffix. 1997-02-25 15:11 Ulrich Drepper <drepper@cygnus.com> * sysdeps/libm-i387/e_acoshf.S (__ieee754_acoshf): Test correct word on stack for overflow. C++. Use __exception instead.
This commit is contained in:
129
ChangeLog
129
ChangeLog
@ -1,3 +1,130 @@
|
|||||||
|
1997-02-27 05:12 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* manual/Makefile: Add rules to run and distribute xtract-typefun.
|
||||||
|
* manual/xtract-typefun.awk: New file. Script to extract function,
|
||||||
|
variable, macro anchor to put into the `dir' file.
|
||||||
|
* manual/signal.texi: Document difference between SysV and BSD
|
||||||
|
signal(3) function and add documentation for sysv_signal.
|
||||||
|
|
||||||
|
* sysdeps/libm-i387/e_acoshl.c: Clear upper half of word containing
|
||||||
|
exponent before comparing.
|
||||||
|
|
||||||
|
1997-02-27 01:13 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* sysdeps/generic/netinet/in.h (htonl, htons, ntohl, ntohs): Change
|
||||||
|
prototypes to use types with explicit width. `unsigned long' is
|
||||||
|
different on 64 bit systems.
|
||||||
|
* sysdeps/unix/sysv/linux/netinet/in.h: Likewise.
|
||||||
|
* sysdeps/generic/htonl.c: Likewise.
|
||||||
|
* sysdeps/generic/htons.c: Likewise.
|
||||||
|
* sysdeps/generic/ntohl.c: Likewise.
|
||||||
|
* sysdeps/generic/ntohs.c: Likewise.
|
||||||
|
Suggested by a sun <asun@zoology.washington.edu>.
|
||||||
|
|
||||||
|
1997-02-26 08:30 Andreas Jaeger <aj@arthur.pfalz.de>
|
||||||
|
|
||||||
|
* math/math.h: Include <__math.h> if __NO_MATH_INLINES is not
|
||||||
|
defined and we want optimization.
|
||||||
|
|
||||||
|
1997-02-27 01:13 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* sysdeps/generic/netinet/in.h (htonl, htons, ntohl, ntohs): Change
|
||||||
|
prototypes to use types with explicit width. `unsigned long' is
|
||||||
|
different on 64 bit systems.
|
||||||
|
Suggested by a sun <asun@zoology.washington.edu>.
|
||||||
|
|
||||||
|
1997-02-02 19:53 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* misc/getpass.c: Don't disable canonical input.
|
||||||
|
Reverted patch of Mon Jan 6 01:35:29 1997.
|
||||||
|
|
||||||
|
1996-12-14 22:07 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* libio/libioP.h (_IO_finish_t): Take additional parameter, to
|
||||||
|
match the hidden __in_chrg parameter of the destructor.
|
||||||
|
(_IO_FINISH): Pass zero for it.
|
||||||
|
* libio/genops.c (_IO_default_finish): Add second parameter, which
|
||||||
|
is ignored.
|
||||||
|
* libio/memstream.c (_IO_mem_finish): Likewise.
|
||||||
|
* libio/fileops.c (_IO_mem_finish): Likewise.
|
||||||
|
* libio/strops.c (_IO_str_finish): Likewise. All callers changed.
|
||||||
|
|
||||||
|
1997-02-27 00:23 H.J. Lu <hjl@lucon.org>
|
||||||
|
|
||||||
|
* time/Makefile: Avoid using patterns in dependencies.
|
||||||
|
|
||||||
|
1997-02-26 00:56 Miguel de Icaza <miguel@nuclecu.unam.mx>
|
||||||
|
|
||||||
|
* elf/rtld.c: Make _dl_start static. Otherwise the linker on the
|
||||||
|
SPARC will convert the call _dl_start into a call into the PLT.
|
||||||
|
|
||||||
|
* elf/rtld.c (_dl_start): On the SPARC we need to adjust the value
|
||||||
|
of arg to make it point to the actual values.
|
||||||
|
|
||||||
|
* sysdeps/sparc/elf/DEFS.h: New ELF specific version.
|
||||||
|
* sysdeps/sparc/Dist: Mention sysdeps/sparc/elf/DEFS.h.
|
||||||
|
|
||||||
|
* sysdeps/sparc/bsd-_setjmp.S, sysdeps/sparc/bsd-setjmp.S: Make
|
||||||
|
them PIC aware.
|
||||||
|
|
||||||
|
* sysdeps/sparc/dl-machine.h (elf_machine_load_address):
|
||||||
|
Implemented.
|
||||||
|
(elf_machine_rela): Make it compile; fix existing relocation
|
||||||
|
types; add unhandled relocation types.
|
||||||
|
(ELF_ADJUST_ARG): Get pointer to arguments at program startup.
|
||||||
|
(RTLD_START): Initial implementation, not yet finished.
|
||||||
|
|
||||||
|
* sysdeps/sparc/elf/start.S: Fix.
|
||||||
|
|
||||||
|
* sysdeps/sparc/fpu_control.h: Remove duplicate declaration of
|
||||||
|
__setfpucw.
|
||||||
|
|
||||||
|
* sysdeps/sparc/divrem.m4: Make compilable under Linux.
|
||||||
|
* sysdeps/sparc/rem.S, sysdeps/sparc/sdiv.S, sysdeps/sparc/udiv.S,
|
||||||
|
sysdeps/sparc/urem.S : Regenerated.
|
||||||
|
|
||||||
|
* sysdeps/sparc/setjmp.S: Make it PIC aware.
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S: Define
|
||||||
|
__ASSEMBLY__ before using kernel header.
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/Makefile: Use -mv8 flag to compile
|
||||||
|
rtld.c.
|
||||||
|
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/brk.c: Implement.
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/profil-counter.h: Remove code
|
||||||
|
to handle old signals.
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/sigaction.c: Implements sigaction
|
||||||
|
for all Linux/SPARC kernels.
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/syscall.S: Add code to store
|
||||||
|
errno using __errno_location.
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/sysdep.h: Add various handler
|
||||||
|
macros for assembler sources.
|
||||||
|
* sysdeps/unix/sysv/linux/sparc/errno.c: Define errno.
|
||||||
|
|
||||||
|
1997-02-25 16:02 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* elf/rtld.c (dl_main): Remove dead code that is never executed.
|
||||||
|
Rename local variable l to main_map where it is used to point to
|
||||||
|
the load_map for the executable.
|
||||||
|
|
||||||
|
1997-02-25 15:03 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* elf/dl-version.c (_dl_check_all_versions): Ignore libraries that
|
||||||
|
could not be found.
|
||||||
|
|
||||||
|
1997-02-24 23:18 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
|
||||||
|
|
||||||
|
* Makerules: Generate implicit object suffix rules automagically.
|
||||||
|
(o-iterator): Move before first use.
|
||||||
|
|
||||||
|
* Makeconfig (all-object-suffixes): Add .bo suffix.
|
||||||
|
|
||||||
|
1997-02-25 15:11 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
* sysdeps/libm-i387/e_acoshf.S (__ieee754_acoshf): Test correct
|
||||||
|
word on stack for overflow.
|
||||||
|
|
||||||
1997-02-24 23:05 Wolfram Gloger <wmglo@dent.med.uni-muenchen.de>
|
1997-02-24 23:05 Wolfram Gloger <wmglo@dent.med.uni-muenchen.de>
|
||||||
|
|
||||||
* malloc/malloc.c (malloc_get_state): New function.
|
* malloc/malloc.c (malloc_get_state): New function.
|
||||||
@ -155,7 +282,7 @@
|
|||||||
__STRICT_ANSI__.
|
__STRICT_ANSI__.
|
||||||
|
|
||||||
* math/math.h: Prevent definition of struct exception when using
|
* math/math.h: Prevent definition of struct exception when using
|
||||||
C++.
|
C++. Use __exception instead.
|
||||||
|
|
||||||
1997-02-22 01:45 Ulrich Drepper <drepper@cygnus.com>
|
1997-02-22 01:45 Ulrich Drepper <drepper@cygnus.com>
|
||||||
|
|
||||||
|
@ -481,7 +481,7 @@ endif
|
|||||||
# to pass different flags for each flavor.
|
# to pass different flags for each flavor.
|
||||||
libtypes = $(foreach o,$(object-suffixes),$(libtype$o))
|
libtypes = $(foreach o,$(object-suffixes),$(libtype$o))
|
||||||
object-suffixes := .o
|
object-suffixes := .o
|
||||||
all-object-suffixes := .o .so .po .go
|
all-object-suffixes := .o .so .po .go .bo
|
||||||
libtype.o := lib%.a
|
libtype.o := lib%.a
|
||||||
ifeq (yes,$(build-shared))
|
ifeq (yes,$(build-shared))
|
||||||
# Under --enable-shared, we will build a shared library of PIC objects.
|
# Under --enable-shared, we will build a shared library of PIC objects.
|
||||||
|
76
Makerules
76
Makerules
@ -80,6 +80,12 @@ ar-symtab-name = __.SYMDEF
|
|||||||
else
|
else
|
||||||
ar-symtab-name = # The null name is used in ELF archives.
|
ar-symtab-name = # The null name is used in ELF archives.
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# This variable is used in ``include $(o-iterator)'' after defining
|
||||||
|
# $(o-iterator-doit) to produce some desired rule using $o for the object
|
||||||
|
# suffix, and setting $(object-suffixes-left) to $(object-suffixes); a copy
|
||||||
|
# is produced for each object suffix in use.
|
||||||
|
o-iterator = $(patsubst %,$(..)o-iterator.mk,$(object-suffixes-left))
|
||||||
|
|
||||||
# Include any system-specific makefiles.
|
# Include any system-specific makefiles.
|
||||||
|
|
||||||
@ -167,23 +173,25 @@ $(common-objpfx)dummy.d:
|
|||||||
# generated sysdep rules in included from sysd-rules below. When
|
# generated sysdep rules in included from sysd-rules below. When
|
||||||
# compiling in the source tree, generated sources go into the current
|
# compiling in the source tree, generated sources go into the current
|
||||||
# directory, and those should be chosen before any sources in sysdeps.
|
# directory, and those should be chosen before any sources in sysdeps.
|
||||||
$(objpfx)%.o: %.S $(before-compile); $(compile-command.S)
|
define o-iterator-doit
|
||||||
$(objpfx)%.so: %.S $(before-compile); $(compile-command.S)
|
$(objpfx)%$o: %.S $(before-compile); $$(compile-command.S)
|
||||||
$(objpfx)%.po: %.S $(before-compile); $(compile-command.S)
|
endef
|
||||||
$(objpfx)%.go: %.S $(before-compile); $(compile-command.S)
|
object-suffixes-left := $(object-suffixes)
|
||||||
$(objpfx)%.bo: %.S $(before-compile); $(compile-command.S)
|
include $(o-iterator)
|
||||||
$(objpfx)%.d: %.S $(before-compile); $(+make-deps)
|
$(objpfx)%.d: %.S $(before-compile); $(+make-deps)
|
||||||
$(objpfx)%.o: %.s $(before-compile); $(compile-command.s)
|
|
||||||
$(objpfx)%.so: %.s $(before-compile); $(compile-command.s)
|
define o-iterator-doit
|
||||||
$(objpfx)%.po: %.s $(before-compile); $(compile-command.s)
|
$(objpfx)%$o: %.s $(before-compile); $$(compile-command.s)
|
||||||
$(objpfx)%.go: %.s $(before-compile); $(compile-command.s)
|
endef
|
||||||
$(objpfx)%.bo: %.s $(before-compile); $(compile-command.s)
|
object-suffixes-left := $(object-suffixes)
|
||||||
|
include $(o-iterator)
|
||||||
$(objpfx)%.d: %.s $(common-objpfx)dummy.d; $(make-dummy-dep)
|
$(objpfx)%.d: %.s $(common-objpfx)dummy.d; $(make-dummy-dep)
|
||||||
$(objpfx)%.o: %.c $(before-compile); $(compile-command.c)
|
|
||||||
$(objpfx)%.so: %.c $(before-compile); $(compile-command.c)
|
define o-iterator-doit
|
||||||
$(objpfx)%.po: %.c $(before-compile); $(compile-command.c)
|
$(objpfx)%$o: %.c $(before-compile); $$(compile-command.c)
|
||||||
$(objpfx)%.go: %.c $(before-compile); $(compile-command.c)
|
endef
|
||||||
$(objpfx)%.bo: %.c $(before-compile); $(compile-command.c)
|
object-suffixes-left := $(object-suffixes)
|
||||||
|
include $(o-iterator)
|
||||||
$(objpfx)%.d: %.c $(before-compile); $(+make-deps)
|
$(objpfx)%.d: %.c $(before-compile); $(+make-deps)
|
||||||
|
|
||||||
# Omit the objpfx rules when building in the source tree, because
|
# Omit the objpfx rules when building in the source tree, because
|
||||||
@ -191,23 +199,25 @@ $(objpfx)%.d: %.c $(before-compile); $(+make-deps)
|
|||||||
ifdef objpfx
|
ifdef objpfx
|
||||||
# Define first rules to find the source files in $(objpfx).
|
# Define first rules to find the source files in $(objpfx).
|
||||||
# Generated source files will end up there.
|
# Generated source files will end up there.
|
||||||
$(objpfx)%.o: $(objpfx)%.S $(before-compile); $(compile-command.S)
|
define o-iterator-doit
|
||||||
$(objpfx)%.so: $(objpfx)%.S $(before-compile); $(compile-command.S)
|
$(objpfx)%$o: $(objpfx)%.S $(before-compile); $$(compile-command.S)
|
||||||
$(objpfx)%.po: $(objpfx)%.S $(before-compile); $(compile-command.S)
|
endef
|
||||||
$(objpfx)%.go: $(objpfx)%.S $(before-compile); $(compile-command.S)
|
object-suffixes-left := $(object-suffixes)
|
||||||
$(objpfx)%.bo: $(objpfx)%.S $(before-compile); $(compile-command.S)
|
include $(o-iterator)
|
||||||
$(objpfx)%.d: $(objpfx)%.S $(before-compile); $(+make-deps)
|
$(objpfx)%.d: $(objpfx)%.S $(before-compile); $(+make-deps)
|
||||||
$(objpfx)%.o: $(objpfx)%.s $(before-compile); $(compile-command.s)
|
|
||||||
$(objpfx)%.so: $(objpfx)%.s $(before-compile); $(compile-command.s)
|
define o-iterator-doit
|
||||||
$(objpfx)%.po: $(objpfx)%.s $(before-compile); $(compile-command.s)
|
$(objpfx)%$o: $(objpfx)%.s $(before-compile); $$(compile-command.s)
|
||||||
$(objpfx)%.go: $(objpfx)%.s $(before-compile); $(compile-command.s)
|
endef
|
||||||
$(objpfx)%.bo: $(objpfx)%.s $(before-compile); $(compile-command.s)
|
object-suffixes-left := $(object-suffixes)
|
||||||
|
include $(o-iterator)
|
||||||
$(objpfx)%.d: $(objpfx)%.s $(common-objpfx)dummy.d; $(make-dummy-dep)
|
$(objpfx)%.d: $(objpfx)%.s $(common-objpfx)dummy.d; $(make-dummy-dep)
|
||||||
$(objpfx)%.o: $(objpfx)%.c $(before-compile); $(compile-command.c)
|
|
||||||
$(objpfx)%.so: $(objpfx)%.c $(before-compile); $(compile-command.c)
|
define o-iterator-doit
|
||||||
$(objpfx)%.po: $(objpfx)%.c $(before-compile); $(compile-command.c)
|
$(objpfx)%$o: $(objpfx)%.c $(before-compile); $$(compile-command.c)
|
||||||
$(objpfx)%.go: $(objpfx)%.c $(before-compile); $(compile-command.c)
|
endef
|
||||||
$(objpfx)%.bo: $(objpfx)%.c $(before-compile); $(compile-command.c)
|
object-suffixes-left := $(object-suffixes)
|
||||||
|
include $(o-iterator)
|
||||||
$(objpfx)%.d: $(objpfx)%.c $(before-compile); $(+make-deps)
|
$(objpfx)%.d: $(objpfx)%.c $(before-compile); $(+make-deps)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@ -391,12 +401,6 @@ headers := $(headers) $(sysdep_headers)
|
|||||||
override objects := $(addprefix $(objpfx),$(sources:.c=.o))
|
override objects := $(addprefix $(objpfx),$(sources:.c=.o))
|
||||||
|
|
||||||
|
|
||||||
# This variable is used in ``include $(o-iterator)'' after defining
|
|
||||||
# $(o-iterator-doit) to produce some desired rule using $o for the object
|
|
||||||
# suffix, and setting $(object-suffixes-left) to $(object-suffixes); a copy
|
|
||||||
# is produced for each object suffix in use.
|
|
||||||
o-iterator = $(patsubst %,$(..)o-iterator.mk,$(object-suffixes-left))
|
|
||||||
|
|
||||||
# The makefile may define $(extra-libs) with `libfoo libbar'
|
# The makefile may define $(extra-libs) with `libfoo libbar'
|
||||||
# to build libfoo.a et al from the modules listed in $(libfoo-routines).
|
# to build libfoo.a et al from the modules listed in $(libfoo-routines).
|
||||||
ifdef extra-libs
|
ifdef extra-libs
|
||||||
|
@ -334,7 +334,7 @@ _dl_check_all_versions (struct link_map *map, int verbose)
|
|||||||
int result = 0;
|
int result = 0;
|
||||||
|
|
||||||
for (l = map; l != NULL; l = l->l_next)
|
for (l = map; l != NULL; l = l->l_next)
|
||||||
result |= _dl_check_map_versions (l, verbose);
|
result |= l->l_opencount != 0 && _dl_check_map_versions (l, verbose);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
88
elf/rtld.c
88
elf/rtld.c
@ -79,7 +79,7 @@ RTLD_START
|
|||||||
#error "sysdeps/MACHINE/dl-machine.h fails to define RTLD_START"
|
#error "sysdeps/MACHINE/dl-machine.h fails to define RTLD_START"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ElfW(Addr)
|
static ElfW(Addr)
|
||||||
_dl_start (void *arg)
|
_dl_start (void *arg)
|
||||||
{
|
{
|
||||||
struct link_map bootstrap_map;
|
struct link_map bootstrap_map;
|
||||||
@ -126,6 +126,10 @@ _dl_start (void *arg)
|
|||||||
_dl_rtld_map.l_info[DT_STRTAB]->d_un.d_ptr +
|
_dl_rtld_map.l_info[DT_STRTAB]->d_un.d_ptr +
|
||||||
_dl_rtld_map.l_info[DT_RPATH]->d_un.d_val);
|
_dl_rtld_map.l_info[DT_RPATH]->d_un.d_val);
|
||||||
|
|
||||||
|
#ifdef ELF_ADJUST_ARG
|
||||||
|
ELF_ADJUST_ARG(arg);
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Call the OS-dependent function to set up life so we can do things like
|
/* Call the OS-dependent function to set up life so we can do things like
|
||||||
file access. It will call `dl_main' (below) to do all the real work
|
file access. It will call `dl_main' (below) to do all the real work
|
||||||
of the dynamic linker, and then unwind our frame and run the user
|
of the dynamic linker, and then unwind our frame and run the user
|
||||||
@ -147,7 +151,7 @@ dl_main (const ElfW(Phdr) *phdr,
|
|||||||
ElfW(Addr) *user_entry)
|
ElfW(Addr) *user_entry)
|
||||||
{
|
{
|
||||||
const ElfW(Phdr) *ph;
|
const ElfW(Phdr) *ph;
|
||||||
struct link_map *l;
|
struct link_map *main_map;
|
||||||
int lazy;
|
int lazy;
|
||||||
enum { normal, list, verify, trace } mode;
|
enum { normal, list, verify, trace } mode;
|
||||||
struct link_map **preloads;
|
struct link_map **preloads;
|
||||||
@ -235,7 +239,7 @@ of this helper program; chances are you did not intend to run this program.\n",
|
|||||||
{
|
{
|
||||||
void doit (void)
|
void doit (void)
|
||||||
{
|
{
|
||||||
l = _dl_map_object (NULL, _dl_argv[0], lt_library, 0);
|
main_map = _dl_map_object (NULL, _dl_argv[0], lt_library, 0);
|
||||||
}
|
}
|
||||||
char *err_str = NULL;
|
char *err_str = NULL;
|
||||||
const char *obj_name __attribute__ ((unused));
|
const char *obj_name __attribute__ ((unused));
|
||||||
@ -248,37 +252,23 @@ of this helper program; chances are you did not intend to run this program.\n",
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
l = _dl_map_object (NULL, _dl_argv[0], lt_library, 0);
|
main_map = _dl_map_object (NULL, _dl_argv[0], lt_library, 0);
|
||||||
|
|
||||||
phdr = l->l_phdr;
|
phdr = main_map->l_phdr;
|
||||||
phent = l->l_phnum;
|
phent = main_map->l_phnum;
|
||||||
l->l_name = (char *) "";
|
main_map->l_name = (char *) "";
|
||||||
*user_entry = l->l_entry;
|
*user_entry = main_map->l_entry;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Create a link_map for the executable itself.
|
/* Create a link_map for the executable itself.
|
||||||
This will be what dlopen on "" returns. */
|
This will be what dlopen on "" returns. */
|
||||||
l = _dl_new_object ((char *) "", "", lt_executable);
|
main_map = _dl_new_object ((char *) "", "", lt_executable);
|
||||||
if (l == NULL)
|
if (main_map == NULL)
|
||||||
_dl_sysdep_fatal ("cannot allocate memory for link map", NULL);
|
_dl_sysdep_fatal ("cannot allocate memory for link map", NULL);
|
||||||
l->l_phdr = phdr;
|
main_map->l_phdr = phdr;
|
||||||
l->l_phnum = phent;
|
main_map->l_phnum = phent;
|
||||||
l->l_entry = *user_entry;
|
main_map->l_entry = *user_entry;
|
||||||
}
|
|
||||||
|
|
||||||
if (l != _dl_loaded)
|
|
||||||
{
|
|
||||||
/* GDB assumes that the first element on the chain is the
|
|
||||||
link_map for the executable itself, and always skips it.
|
|
||||||
Make sure the first one is indeed that one. */
|
|
||||||
l->l_prev->l_next = l->l_next;
|
|
||||||
if (l->l_next)
|
|
||||||
l->l_next->l_prev = l->l_prev;
|
|
||||||
l->l_prev = NULL;
|
|
||||||
l->l_next = _dl_loaded;
|
|
||||||
_dl_loaded->l_prev = l;
|
|
||||||
_dl_loaded = l;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Scan the program header table for the dynamic section. */
|
/* Scan the program header table for the dynamic section. */
|
||||||
@ -288,7 +278,7 @@ of this helper program; chances are you did not intend to run this program.\n",
|
|||||||
case PT_DYNAMIC:
|
case PT_DYNAMIC:
|
||||||
/* This tells us where to find the dynamic section,
|
/* This tells us where to find the dynamic section,
|
||||||
which tells us everything we need to do. */
|
which tells us everything we need to do. */
|
||||||
l->l_ld = (void *) l->l_addr + ph->p_vaddr;
|
main_map->l_ld = (void *) main_map->l_addr + ph->p_vaddr;
|
||||||
break;
|
break;
|
||||||
case PT_INTERP:
|
case PT_INTERP:
|
||||||
/* This "interpreter segment" was used by the program loader to
|
/* This "interpreter segment" was used by the program loader to
|
||||||
@ -297,7 +287,7 @@ of this helper program; chances are you did not intend to run this program.\n",
|
|||||||
dlopen call or DT_NEEDED entry, for something that wants to link
|
dlopen call or DT_NEEDED entry, for something that wants to link
|
||||||
against the dynamic linker as a shared library, will know that
|
against the dynamic linker as a shared library, will know that
|
||||||
the shared object is already loaded. */
|
the shared object is already loaded. */
|
||||||
_dl_rtld_libname.name = (const char *) l->l_addr + ph->p_vaddr;
|
_dl_rtld_libname.name = (const char *) main_map->l_addr + ph->p_vaddr;
|
||||||
_dl_rtld_libname.next = NULL;
|
_dl_rtld_libname.next = NULL;
|
||||||
_dl_rtld_map.l_libname = &_dl_rtld_libname;
|
_dl_rtld_map.l_libname = &_dl_rtld_libname;
|
||||||
has_interp = 1;
|
has_interp = 1;
|
||||||
@ -317,25 +307,24 @@ of this helper program; chances are you did not intend to run this program.\n",
|
|||||||
if (mode == verify)
|
if (mode == verify)
|
||||||
/* We were called just to verify that this is a dynamic executable
|
/* We were called just to verify that this is a dynamic executable
|
||||||
using us as the program interpreter. */
|
using us as the program interpreter. */
|
||||||
_exit (l->l_ld == NULL ? 1 : has_interp ? 0 : 2);
|
_exit (main_map->l_ld == NULL ? 1 : has_interp ? 0 : 2);
|
||||||
|
|
||||||
/* Extract the contents of the dynamic section for easy access. */
|
/* Extract the contents of the dynamic section for easy access. */
|
||||||
elf_get_dynamic_info (l->l_ld, l->l_info);
|
elf_get_dynamic_info (main_map->l_ld, main_map->l_info);
|
||||||
if (l->l_info[DT_HASH])
|
if (main_map->l_info[DT_HASH])
|
||||||
/* Set up our cache of pointers into the hash table. */
|
/* Set up our cache of pointers into the hash table. */
|
||||||
_dl_setup_hash (l);
|
_dl_setup_hash (main_map);
|
||||||
|
|
||||||
/* Put the link_map for ourselves on the chain so it can be found by
|
/* Put the link_map for ourselves on the chain so it can be found by
|
||||||
name. */
|
name. Note that at this point the global chain of link maps contains
|
||||||
|
exactly one element, which is pointed to by main_map. */
|
||||||
if (! _dl_rtld_map.l_name)
|
if (! _dl_rtld_map.l_name)
|
||||||
/* If not invoked directly, the dynamic linker shared object file was
|
/* If not invoked directly, the dynamic linker shared object file was
|
||||||
found by the PT_INTERP name. */
|
found by the PT_INTERP name. */
|
||||||
_dl_rtld_map.l_name = (char *) _dl_rtld_map.l_libname->name;
|
_dl_rtld_map.l_name = (char *) _dl_rtld_map.l_libname->name;
|
||||||
_dl_rtld_map.l_type = lt_library;
|
_dl_rtld_map.l_type = lt_library;
|
||||||
while (l->l_next)
|
main_map->l_next = &_dl_rtld_map;
|
||||||
l = l->l_next;
|
_dl_rtld_map.l_prev = main_map;
|
||||||
l->l_next = &_dl_rtld_map;
|
|
||||||
_dl_rtld_map.l_prev = l;
|
|
||||||
|
|
||||||
/* We have two ways to specify objects to preload: via environment
|
/* We have two ways to specify objects to preload: via environment
|
||||||
variable and via the file /etc/ld.so.preload. The later can also
|
variable and via the file /etc/ld.so.preload. The later can also
|
||||||
@ -445,7 +434,7 @@ of this helper program; chances are you did not intend to run this program.\n",
|
|||||||
/* Load all the libraries specified by DT_NEEDED entries. If LD_PRELOAD
|
/* Load all the libraries specified by DT_NEEDED entries. If LD_PRELOAD
|
||||||
specified some libraries to load, these are inserted before the actual
|
specified some libraries to load, these are inserted before the actual
|
||||||
dependencies in the executable's searchlist for symbol resolution. */
|
dependencies in the executable's searchlist for symbol resolution. */
|
||||||
_dl_map_object_deps (l, preloads, npreloads, mode == trace);
|
_dl_map_object_deps (main_map, preloads, npreloads, mode == trace);
|
||||||
|
|
||||||
#ifndef MAP_ANON
|
#ifndef MAP_ANON
|
||||||
/* We are done mapping things, so close the zero-fill descriptor. */
|
/* We are done mapping things, so close the zero-fill descriptor. */
|
||||||
@ -465,11 +454,11 @@ of this helper program; chances are you did not intend to run this program.\n",
|
|||||||
chain in symbol search order because gdb uses the chain's order as
|
chain in symbol search order because gdb uses the chain's order as
|
||||||
its symbol search order. */
|
its symbol search order. */
|
||||||
unsigned int i = 1;
|
unsigned int i = 1;
|
||||||
while (l->l_searchlist[i] != &_dl_rtld_map)
|
while (main_map->l_searchlist[i] != &_dl_rtld_map)
|
||||||
++i;
|
++i;
|
||||||
_dl_rtld_map.l_prev = l->l_searchlist[i - 1];
|
_dl_rtld_map.l_prev = main_map->l_searchlist[i - 1];
|
||||||
_dl_rtld_map.l_next = (i + 1 < l->l_nsearchlist ?
|
_dl_rtld_map.l_next = (i + 1 < main_map->l_nsearchlist ?
|
||||||
l->l_searchlist[i + 1] : NULL);
|
main_map->l_searchlist[i + 1] : NULL);
|
||||||
assert (_dl_rtld_map.l_prev->l_next == _dl_rtld_map.l_next);
|
assert (_dl_rtld_map.l_prev->l_next == _dl_rtld_map.l_next);
|
||||||
_dl_rtld_map.l_prev->l_next = &_dl_rtld_map;
|
_dl_rtld_map.l_prev->l_next = &_dl_rtld_map;
|
||||||
if (_dl_rtld_map.l_next)
|
if (_dl_rtld_map.l_next)
|
||||||
@ -484,7 +473,7 @@ of this helper program; chances are you did not intend to run this program.\n",
|
|||||||
{
|
{
|
||||||
void doit (void)
|
void doit (void)
|
||||||
{
|
{
|
||||||
if (_dl_check_all_versions (l, 1) && mode == normal)
|
if (_dl_check_all_versions (main_map, 1) && mode == normal)
|
||||||
/* We cannot start the application. Abort now. */
|
/* We cannot start the application. Abort now. */
|
||||||
_exit (1);
|
_exit (1);
|
||||||
}
|
}
|
||||||
@ -504,6 +493,9 @@ of this helper program; chances are you did not intend to run this program.\n",
|
|||||||
if (! _dl_loaded->l_info[DT_NEEDED])
|
if (! _dl_loaded->l_info[DT_NEEDED])
|
||||||
_dl_sysdep_message ("\t", "statically linked\n", NULL);
|
_dl_sysdep_message ("\t", "statically linked\n", NULL);
|
||||||
else
|
else
|
||||||
|
{
|
||||||
|
struct link_map *l;
|
||||||
|
|
||||||
for (l = _dl_loaded->l_next; l; l = l->l_next)
|
for (l = _dl_loaded->l_next; l; l = l->l_next)
|
||||||
if (l->l_opencount == 0)
|
if (l->l_opencount == 0)
|
||||||
/* The library was not found. */
|
/* The library was not found. */
|
||||||
@ -517,8 +509,9 @@ of this helper program; chances are you did not intend to run this program.\n",
|
|||||||
while ((size_t) (&buf[sizeof buf - 1] - bp)
|
while ((size_t) (&buf[sizeof buf - 1] - bp)
|
||||||
< sizeof l->l_addr * 2)
|
< sizeof l->l_addr * 2)
|
||||||
*--bp = '0';
|
*--bp = '0';
|
||||||
_dl_sysdep_message ("\t", l->l_libname->name, " => ", l->l_name,
|
_dl_sysdep_message ("\t", l->l_libname->name, " => ",
|
||||||
" (0x", bp, ")\n", NULL);
|
l->l_name, " (0x", bp, ")\n", NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mode != trace)
|
if (mode != trace)
|
||||||
@ -544,6 +537,7 @@ of this helper program; chances are you did not intend to run this program.\n",
|
|||||||
else if (lazy >= 0)
|
else if (lazy >= 0)
|
||||||
{
|
{
|
||||||
/* We have to do symbol dependency testing. */
|
/* We have to do symbol dependency testing. */
|
||||||
|
struct link_map *l;
|
||||||
void doit (void)
|
void doit (void)
|
||||||
{
|
{
|
||||||
_dl_relocate_object (l, _dl_object_relocation_scope (l), lazy);
|
_dl_relocate_object (l, _dl_object_relocation_scope (l), lazy);
|
||||||
@ -576,6 +570,7 @@ of this helper program; chances are you did not intend to run this program.\n",
|
|||||||
the dynamic linker out of order because it has no copy relocs (we
|
the dynamic linker out of order because it has no copy relocs (we
|
||||||
know that because it is self-contained). */
|
know that because it is self-contained). */
|
||||||
|
|
||||||
|
struct link_map *l;
|
||||||
l = _dl_loaded;
|
l = _dl_loaded;
|
||||||
while (l->l_next)
|
while (l->l_next)
|
||||||
l = l->l_next;
|
l = l->l_next;
|
||||||
@ -605,6 +600,7 @@ of this helper program; chances are you did not intend to run this program.\n",
|
|||||||
{
|
{
|
||||||
/* Initialize _r_debug. */
|
/* Initialize _r_debug. */
|
||||||
struct r_debug *r = _dl_debug_initialize (_dl_rtld_map.l_addr);
|
struct r_debug *r = _dl_debug_initialize (_dl_rtld_map.l_addr);
|
||||||
|
struct link_map *l;
|
||||||
|
|
||||||
l = _dl_loaded;
|
l = _dl_loaded;
|
||||||
|
|
||||||
|
@ -138,8 +138,8 @@ DEFUN(_IO_file_close_it, (fp),
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
DEFUN(_IO_file_finish, (fp),
|
DEFUN(_IO_file_finish, (fp, dummy),
|
||||||
register _IO_FILE* fp)
|
register _IO_FILE* fp AND int dummy)
|
||||||
{
|
{
|
||||||
if (_IO_file_is_open(fp))
|
if (_IO_file_is_open(fp))
|
||||||
{
|
{
|
||||||
@ -147,7 +147,7 @@ DEFUN(_IO_file_finish, (fp),
|
|||||||
if (!(fp->_flags & _IO_DELETE_DONT_CLOSE))
|
if (!(fp->_flags & _IO_DELETE_DONT_CLOSE))
|
||||||
_IO_SYSCLOSE (fp);
|
_IO_SYSCLOSE (fp);
|
||||||
}
|
}
|
||||||
_IO_default_finish(fp);
|
_IO_default_finish(fp, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
_IO_FILE *
|
_IO_FILE *
|
||||||
|
@ -481,8 +481,8 @@ DEFUN(_IO_default_sync, (fp),
|
|||||||
current implementation, this function can get called twice! */
|
current implementation, this function can get called twice! */
|
||||||
|
|
||||||
void
|
void
|
||||||
DEFUN(_IO_default_finish, (fp),
|
DEFUN(_IO_default_finish, (fp, dummy),
|
||||||
_IO_FILE *fp)
|
_IO_FILE *fp AND int dummy)
|
||||||
{
|
{
|
||||||
struct _IO_marker *mark;
|
struct _IO_marker *mark;
|
||||||
if (fp->_IO_buf_base && !(fp->_flags & _IO_USER_BUF))
|
if (fp->_IO_buf_base && !(fp->_flags & _IO_USER_BUF))
|
||||||
|
@ -101,8 +101,8 @@ extern "C" {
|
|||||||
/* The 'finish' function does any final cleaning up of an _IO_FILE object.
|
/* The 'finish' function does any final cleaning up of an _IO_FILE object.
|
||||||
It does not delete (free) it, but does everything else to finalize it/
|
It does not delete (free) it, but does everything else to finalize it/
|
||||||
It matches the streambuf::~streambuf virtual destructor. */
|
It matches the streambuf::~streambuf virtual destructor. */
|
||||||
typedef void (*_IO_finish_t) __P((_IO_FILE*)); /* finalize */
|
typedef void (*_IO_finish_t) __P((_IO_FILE*, int)); /* finalize */
|
||||||
#define _IO_FINISH(FP) JUMP0(__finish, FP)
|
#define _IO_FINISH(FP) JUMP1(__finish, FP, 0)
|
||||||
|
|
||||||
/* The 'overflow' hook flushes the buffer.
|
/* The 'overflow' hook flushes the buffer.
|
||||||
The second argument is a character, or EOF.
|
The second argument is a character, or EOF.
|
||||||
@ -295,7 +295,7 @@ extern int _IO_seekmark __P((_IO_FILE *, struct _IO_marker *, int));
|
|||||||
extern int _IO_default_underflow __P((_IO_FILE*));
|
extern int _IO_default_underflow __P((_IO_FILE*));
|
||||||
extern int _IO_default_uflow __P((_IO_FILE*));
|
extern int _IO_default_uflow __P((_IO_FILE*));
|
||||||
extern int _IO_default_doallocate __P((_IO_FILE*));
|
extern int _IO_default_doallocate __P((_IO_FILE*));
|
||||||
extern void _IO_default_finish __P((_IO_FILE *));
|
extern void _IO_default_finish __P((_IO_FILE *, int));
|
||||||
extern int _IO_default_pbackfail __P((_IO_FILE*, int));
|
extern int _IO_default_pbackfail __P((_IO_FILE*, int));
|
||||||
extern _IO_FILE* _IO_default_setbuf __P((_IO_FILE *, char*, _IO_ssize_t));
|
extern _IO_FILE* _IO_default_setbuf __P((_IO_FILE *, char*, _IO_ssize_t));
|
||||||
extern _IO_size_t _IO_default_xsputn __P((_IO_FILE *, const void*, _IO_size_t));
|
extern _IO_size_t _IO_default_xsputn __P((_IO_FILE *, const void*, _IO_size_t));
|
||||||
@ -352,7 +352,7 @@ extern _IO_ssize_t _IO_file_read __P((_IO_FILE*, void*, _IO_ssize_t));
|
|||||||
extern int _IO_file_sync __P((_IO_FILE*));
|
extern int _IO_file_sync __P((_IO_FILE*));
|
||||||
extern int _IO_file_close_it __P((_IO_FILE*));
|
extern int _IO_file_close_it __P((_IO_FILE*));
|
||||||
extern _IO_fpos_t _IO_file_seek __P((_IO_FILE *, _IO_off_t, int));
|
extern _IO_fpos_t _IO_file_seek __P((_IO_FILE *, _IO_off_t, int));
|
||||||
extern void _IO_file_finish __P((_IO_FILE*));
|
extern void _IO_file_finish __P((_IO_FILE*, int));
|
||||||
|
|
||||||
/* Other file functions. */
|
/* Other file functions. */
|
||||||
extern _IO_FILE* _IO_file_attach __P((_IO_FILE *, int));
|
extern _IO_FILE* _IO_file_attach __P((_IO_FILE *, int));
|
||||||
@ -366,7 +366,7 @@ extern int _IO_str_underflow __P((_IO_FILE*));
|
|||||||
extern int _IO_str_overflow __P((_IO_FILE *, int));
|
extern int _IO_str_overflow __P((_IO_FILE *, int));
|
||||||
extern int _IO_str_pbackfail __P((_IO_FILE*, int));
|
extern int _IO_str_pbackfail __P((_IO_FILE*, int));
|
||||||
extern _IO_fpos_t _IO_str_seekoff __P((_IO_FILE*,_IO_off_t,int,int));
|
extern _IO_fpos_t _IO_str_seekoff __P((_IO_FILE*,_IO_off_t,int,int));
|
||||||
extern void _IO_str_finish __P ((_IO_FILE*));
|
extern void _IO_str_finish __P ((_IO_FILE*, int));
|
||||||
|
|
||||||
/* Other strfile functions */
|
/* Other strfile functions */
|
||||||
extern void _IO_str_init_static __P((_IO_FILE *, char*, int, char*));
|
extern void _IO_str_init_static __P((_IO_FILE *, char*, int, char*));
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
/* Copyright (C) 1995, 1996 Free Software Foundation, Inc.
|
/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -31,7 +31,7 @@ struct _IO_FILE_memstream
|
|||||||
|
|
||||||
|
|
||||||
static int _IO_mem_sync __P ((_IO_FILE* fp));
|
static int _IO_mem_sync __P ((_IO_FILE* fp));
|
||||||
static void _IO_mem_finish __P ((_IO_FILE* fp));
|
static void _IO_mem_finish __P ((_IO_FILE* fp, int));
|
||||||
|
|
||||||
|
|
||||||
static const struct _IO_jump_t _IO_mem_jumps =
|
static const struct _IO_jump_t _IO_mem_jumps =
|
||||||
@ -124,8 +124,9 @@ _IO_mem_sync (fp)
|
|||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_IO_mem_finish (fp)
|
_IO_mem_finish (fp, dummy)
|
||||||
_IO_FILE* fp;
|
_IO_FILE* fp;
|
||||||
|
int dummy;
|
||||||
{
|
{
|
||||||
struct _IO_FILE_memstream *mp = (struct _IO_FILE_memstream *) fp;
|
struct _IO_FILE_memstream *mp = (struct _IO_FILE_memstream *) fp;
|
||||||
|
|
||||||
@ -139,5 +140,5 @@ _IO_mem_finish (fp)
|
|||||||
|
|
||||||
fp->_IO_buf_base = NULL;
|
fp->_IO_buf_base = NULL;
|
||||||
|
|
||||||
_IO_default_finish (fp);
|
_IO_default_finish (fp, 0);
|
||||||
}
|
}
|
||||||
|
@ -258,14 +258,14 @@ DEFUN(_IO_str_pbackfail, (fp, c),
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
DEFUN (_IO_str_finish, (fp),
|
DEFUN (_IO_str_finish, (fp, dummy),
|
||||||
register _IO_FILE* fp)
|
register _IO_FILE* fp AND int dummy)
|
||||||
{
|
{
|
||||||
if (fp->_IO_buf_base && !(fp->_flags & _IO_USER_BUF))
|
if (fp->_IO_buf_base && !(fp->_flags & _IO_USER_BUF))
|
||||||
(((_IO_strfile*)fp)->_s._free_buffer)(fp->_IO_buf_base);
|
(((_IO_strfile*)fp)->_s._free_buffer)(fp->_IO_buf_base);
|
||||||
fp->_IO_buf_base = NULL;
|
fp->_IO_buf_base = NULL;
|
||||||
|
|
||||||
_IO_default_finish(fp);
|
_IO_default_finish(fp, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct _IO_jump_t _IO_str_jumps = {
|
struct _IO_jump_t _IO_str_jumps = {
|
||||||
|
@ -21,6 +21,9 @@
|
|||||||
subdir := manual
|
subdir := manual
|
||||||
export subdir := $(subdir)
|
export subdir := $(subdir)
|
||||||
|
|
||||||
|
# We need GNU awk for the xtract-typefun script.
|
||||||
|
GAWK = gawk
|
||||||
|
|
||||||
.PHONY: all dvi info
|
.PHONY: all dvi info
|
||||||
all: dvi info
|
all: dvi info
|
||||||
dvi: libc.dvi
|
dvi: libc.dvi
|
||||||
@ -60,6 +63,17 @@ stamp-summary: summary.awk $(chapters) $(chapters-incl)
|
|||||||
# touch is broken on our machines. Sigh.
|
# touch is broken on our machines. Sigh.
|
||||||
date > $@
|
date > $@
|
||||||
|
|
||||||
|
# Generate a file which can be added to the `dir' content to provide direct
|
||||||
|
# access to the documentation of the function, variables, and other
|
||||||
|
# definitions.
|
||||||
|
dir-add.texi: manual/xtract-typefun.awk $(chapters-incl)
|
||||||
|
if test -n "$(chapters-incl)"; then \
|
||||||
|
(for i in $(chapters-incl); do \
|
||||||
|
$(GAWK) -f $< < $i; \
|
||||||
|
done) | sort > $@.new; \
|
||||||
|
./move-if-change $@.new $@; \
|
||||||
|
fi
|
||||||
|
|
||||||
# Generate Texinfo files from the C source for the example programs.
|
# Generate Texinfo files from the C source for the example programs.
|
||||||
%.c.texi: examples/%.c
|
%.c.texi: examples/%.c
|
||||||
sed -e 's,[{}],@&,g' \
|
sed -e 's,[{}],@&,g' \
|
||||||
@ -78,7 +92,8 @@ distribute = $(minimal-dist) \
|
|||||||
$(patsubst examples/%.c,%.c.texi,$(filter examples/%.c, \
|
$(patsubst examples/%.c,%.c.texi,$(filter examples/%.c, \
|
||||||
$(minimal-dist))) \
|
$(minimal-dist))) \
|
||||||
libc.info* libc.?? libc.??s texinfo.tex summary.texi \
|
libc.info* libc.?? libc.??s texinfo.tex summary.texi \
|
||||||
stamp-summary chapters chapters-incl
|
stamp-summary chapters chapters-incl \
|
||||||
|
xtract-typefun.awk
|
||||||
export distribute := $(distribute)
|
export distribute := $(distribute)
|
||||||
|
|
||||||
tar-it = tar chovf $@ $^
|
tar-it = tar chovf $@ $^
|
||||||
|
@ -1040,6 +1040,18 @@ a handler for @code{SIGKILL} or @code{SIGSTOP}.
|
|||||||
@end table
|
@end table
|
||||||
@end deftypefun
|
@end deftypefun
|
||||||
|
|
||||||
|
@strong{Compatibility Note:} A problem when working with the
|
||||||
|
@code{signal} function is that it has a different semantic on BSD and
|
||||||
|
SVID system. The difference is that on SVID systems the signal handler
|
||||||
|
is deinstalled after an signal was delivered. On BSD systems the
|
||||||
|
handler must be explicitly deinstalled. In the GNU C Library we use the
|
||||||
|
BSD version by default. To use the SVID version you can either use the
|
||||||
|
function @code{sysv_signal} (see below) or use the @code{_XOPEN_SOURCE}
|
||||||
|
feature select macro (@pxref{Feature Test Macros}) Generally it should
|
||||||
|
be avoided to use this functions due to the compatibility problems. It
|
||||||
|
is better to use @code{sigaction} if it is available since the results
|
||||||
|
are much more reliable.
|
||||||
|
|
||||||
Here is a simple example of setting up a handler to delete temporary
|
Here is a simple example of setting up a handler to delete temporary
|
||||||
files when certain fatal signals happen:
|
files when certain fatal signals happen:
|
||||||
|
|
||||||
@ -1079,6 +1091,18 @@ We do not handle @code{SIGQUIT} or the program error signals in this
|
|||||||
example because these are designed to provide information for debugging
|
example because these are designed to provide information for debugging
|
||||||
(a core dump), and the temporary files may give useful information.
|
(a core dump), and the temporary files may give useful information.
|
||||||
|
|
||||||
|
@comment signal.h
|
||||||
|
@comment GNU
|
||||||
|
@deftypefun sighandler_t sysv_signal (int @var{signum}, sighandler_t @var{action})
|
||||||
|
The @code{sysv_signal} implements the behaviour of the standard
|
||||||
|
@code{signal} function as found on SVID systems. The difference to BSD
|
||||||
|
systems is that the handler is deinstalled after a delivery of a signal.
|
||||||
|
|
||||||
|
@strong{Compatibility Note:} As said above for @code{signal}, this
|
||||||
|
function should be avoided when possible. @code{sigaction} is the
|
||||||
|
preferred method.
|
||||||
|
@end deftypefun
|
||||||
|
|
||||||
@comment signal.h
|
@comment signal.h
|
||||||
@comment SVID
|
@comment SVID
|
||||||
@deftypefun sighandler_t ssignal (int @var{signum}, sighandler_t @var{action})
|
@deftypefun sighandler_t ssignal (int @var{signum}, sighandler_t @var{action})
|
||||||
|
26
manual/xtract-typefun.awk
Normal file
26
manual/xtract-typefun.awk
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
#! /usr/local/bin/gawk -f
|
||||||
|
BEGIN {
|
||||||
|
last_node="";
|
||||||
|
}
|
||||||
|
|
||||||
|
/^@node/ {
|
||||||
|
last_node = gensub (/@node +([^@,]+).*/, "\\1", 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/^@deftypefun/ {
|
||||||
|
printf ("* %s: (libc)%s.\n",
|
||||||
|
gensub (/@deftypefun +([^{ ]+|\{[^}]+\}) +([[:alpha:]_][[:alnum:]_]+).*/, "\\2", 1),
|
||||||
|
last_node);
|
||||||
|
}
|
||||||
|
|
||||||
|
/^@deftypevr/ {
|
||||||
|
printf ("* %s: (libc)%s.\n",
|
||||||
|
gensub (/@deftypevr +([^{ ]+|\{[^}]+\}) +([^{ ]+|\{[^}]+\}) +([[:alpha:]_][[:alnum:]_]+).*/, "\\3", 1),
|
||||||
|
last_node);
|
||||||
|
}
|
||||||
|
|
||||||
|
/^@deftypefn/ {
|
||||||
|
printf ("* %s: (libc)%s.\n",
|
||||||
|
gensub (/@deftypefn +([^{ ]+|\{[^}]+\}) +[^{ ]*(\{[^}]+\})? +([[:alpha:]_][[:alnum:]_]+).*/, "\\3", 1),
|
||||||
|
last_node);
|
||||||
|
}
|
15
math/math.h
15
math/math.h
@ -99,13 +99,17 @@ extern _LIB_VERSION_TYPE _LIB_VERSION;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined __USE_SVID && !defined __cplusplus
|
#ifdef __USE_SVID
|
||||||
/* In SVID error handling, `matherr' is called with this description
|
/* In SVID error handling, `matherr' is called with this description
|
||||||
of the exceptional condition.
|
of the exceptional condition.
|
||||||
|
|
||||||
We have a problem when using C++ since `exception' is reserved in
|
We have a problem when using C++ since `exception' is reserved in
|
||||||
C++. */
|
C++. */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
struct __exception
|
||||||
|
#else
|
||||||
struct exception
|
struct exception
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
int type;
|
int type;
|
||||||
char *name;
|
char *name;
|
||||||
@ -114,8 +118,13 @@ struct exception
|
|||||||
double retval;
|
double retval;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern int __matherr __P ((struct __exception *));
|
||||||
|
extern int matherr __P ((struct __exception *));
|
||||||
|
#else
|
||||||
extern int __matherr __P ((struct exception *));
|
extern int __matherr __P ((struct exception *));
|
||||||
extern int matherr __P ((struct exception *));
|
extern int matherr __P ((struct exception *));
|
||||||
|
#endif
|
||||||
|
|
||||||
#define X_TLOSS 1.41484755040568800000e+16
|
#define X_TLOSS 1.41484755040568800000e+16
|
||||||
|
|
||||||
@ -131,7 +140,7 @@ extern int matherr __P ((struct exception *));
|
|||||||
#define HUGE FLT_MAX
|
#define HUGE FLT_MAX
|
||||||
#include <float.h> /* Defines FLT_MAX. */
|
#include <float.h> /* Defines FLT_MAX. */
|
||||||
|
|
||||||
#endif /* SVID && !C++ */
|
#endif /* SVID */
|
||||||
|
|
||||||
|
|
||||||
#ifdef __USE_BSD
|
#ifdef __USE_BSD
|
||||||
@ -164,7 +173,7 @@ extern int matherr __P ((struct exception *));
|
|||||||
|
|
||||||
|
|
||||||
/* Get machine-dependent inline versions (if there are any). */
|
/* Get machine-dependent inline versions (if there are any). */
|
||||||
#if defined (__NO_MATH_INLINES) || defined (__OPTIMIZE__)
|
#if !defined __NO_MATH_INLINES && defined __OPTIMIZE__
|
||||||
#include <__math.h>
|
#include <__math.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -59,9 +59,7 @@ getpass (prompt)
|
|||||||
/* Save the old one. */
|
/* Save the old one. */
|
||||||
s = t;
|
s = t;
|
||||||
/* Tricky, tricky. */
|
/* Tricky, tricky. */
|
||||||
t.c_lflag &= ~(ECHO|ISIG|ICANON);
|
t.c_lflag &= ~(ECHO|ISIG);
|
||||||
t.c_cc[VTIME] = 0;
|
|
||||||
t.c_cc[VMIN] = 1;
|
|
||||||
tty_changed = (tcsetattr (fileno (in), TCSAFLUSH|TCSASOFT, &t) == 0);
|
tty_changed = (tcsetattr (fileno (in), TCSAFLUSH|TCSASOFT, &t) == 0);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1,28 +1,28 @@
|
|||||||
/* Copyright (C) 1993 Free Software Foundation, Inc.
|
/* Copyright (C) 1993, 1997 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public License as
|
modify it under the terms of the GNU Library General Public License as
|
||||||
published by the Free Software Foundation; either version 2 of the
|
published by the Free Software Foundation; either version 2 of the
|
||||||
License, or (at your option) any later version.
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Library General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU Library General Public
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Cambridge, MA 02139, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#include <ansidecl.h>
|
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
|
||||||
#undef htonl
|
#undef htonl
|
||||||
|
|
||||||
unsigned long int
|
u_int32_t
|
||||||
DEFUN(htonl, (x), unsigned long int x)
|
htonl (x)
|
||||||
|
u_int32_t x;
|
||||||
{
|
{
|
||||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
#if BYTE_ORDER == LITTLE_ENDIAN
|
||||||
x = (x << 24) | ((x & 0xff00) << 8) | ((x & 0xff0000) >> 8) | (x >> 24);
|
x = (x << 24) | ((x & 0xff00) << 8) | ((x & 0xff0000) >> 8) | (x >> 24);
|
||||||
|
@ -1,28 +1,28 @@
|
|||||||
/* Copyright (C) 1993 Free Software Foundation, Inc.
|
/* Copyright (C) 1993, 1997 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public License as
|
modify it under the terms of the GNU Library General Public License as
|
||||||
published by the Free Software Foundation; either version 2 of the
|
published by the Free Software Foundation; either version 2 of the
|
||||||
License, or (at your option) any later version.
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Library General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU Library General Public
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Cambridge, MA 02139, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#include <ansidecl.h>
|
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
|
||||||
#undef htons
|
#undef htons
|
||||||
|
|
||||||
unsigned short int
|
u_int16_t
|
||||||
DEFUN(htons, (x), unsigned short int x)
|
htons (x)
|
||||||
|
u_int16_t x;
|
||||||
{
|
{
|
||||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
#if BYTE_ORDER == LITTLE_ENDIAN
|
||||||
x = (x << 8) | (x >> 8);
|
x = (x << 8) | (x >> 8);
|
||||||
|
@ -190,12 +190,17 @@ struct ip_mreq
|
|||||||
struct in_addr imr_interface; /* local IP address of interface */
|
struct in_addr imr_interface; /* local IP address of interface */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Functions to convert between host and network byte order. */
|
/* Functions to convert between host and network byte order.
|
||||||
|
|
||||||
extern unsigned long int ntohl __P ((unsigned long int));
|
Please note that these functions normally take `unsigned long int' or
|
||||||
extern unsigned short int ntohs __P ((unsigned short int));
|
`unsigned short int' values as arguments and also return them. But
|
||||||
extern unsigned long int htonl __P ((unsigned long int));
|
this was a short-sighted decision since on different systems the types
|
||||||
extern unsigned short int htons __P ((unsigned short int));
|
may have different representations but the values are always the same. */
|
||||||
|
|
||||||
|
extern u_int32_t ntohl __P ((u_int32_t __netlong));
|
||||||
|
extern u_int16_t ntohs __P ((u_int16_t __netshort));
|
||||||
|
extern u_int32_t htonl __P ((u_int32_t __hostlong));
|
||||||
|
extern u_int16_t htons __P ((u_int16_t __hostshort));
|
||||||
|
|
||||||
#include <endian.h>
|
#include <endian.h>
|
||||||
|
|
||||||
|
@ -1,28 +1,28 @@
|
|||||||
/* Copyright (C) 1993 Free Software Foundation, Inc.
|
/* Copyright (C) 1993, 1997 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public License as
|
modify it under the terms of the GNU Library General Public License as
|
||||||
published by the Free Software Foundation; either version 2 of the
|
published by the Free Software Foundation; either version 2 of the
|
||||||
License, or (at your option) any later version.
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Library General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU Library General Public
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Cambridge, MA 02139, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#include <ansidecl.h>
|
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
|
||||||
#undef ntohl
|
#undef ntohl
|
||||||
|
|
||||||
unsigned long int
|
u_int32_t
|
||||||
DEFUN(ntohl, (x), unsigned long int x)
|
ntohl (x)
|
||||||
|
u_int32_t x;
|
||||||
{
|
{
|
||||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
#if BYTE_ORDER == LITTLE_ENDIAN
|
||||||
x = (x << 24) | ((x & 0xff00) << 8) | ((x & 0xff0000) >> 8) | (x >> 24);
|
x = (x << 24) | ((x & 0xff00) << 8) | ((x & 0xff0000) >> 8) | (x >> 24);
|
||||||
|
@ -1,28 +1,28 @@
|
|||||||
/* Copyright (C) 1993 Free Software Foundation, Inc.
|
/* Copyright (C) 1993, 1997 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public License as
|
modify it under the terms of the GNU Library General Public License as
|
||||||
published by the Free Software Foundation; either version 2 of the
|
published by the Free Software Foundation; either version 2 of the
|
||||||
License, or (at your option) any later version.
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Library General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU Library General Public
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Cambridge, MA 02139, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#include <ansidecl.h>
|
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
|
|
||||||
#undef ntohs
|
#undef ntohs
|
||||||
|
|
||||||
unsigned short int
|
u_int16_t
|
||||||
DEFUN(ntohs, (x), unsigned short int x)
|
ntohs (x)
|
||||||
|
u_int16_t x;
|
||||||
{
|
{
|
||||||
#if BYTE_ORDER == LITTLE_ENDIAN
|
#if BYTE_ORDER == LITTLE_ENDIAN
|
||||||
x = (x << 8) | (x >> 8);
|
x = (x << 8) | (x >> 8);
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* ix87 specific implementation of arcsinh.
|
/* ix87 specific implementation of arcsinh.
|
||||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||||
|
|
||||||
@ -42,7 +42,7 @@ limit: .double 0.29
|
|||||||
|
|
||||||
.text
|
.text
|
||||||
ENTRY(__ieee754_acoshf)
|
ENTRY(__ieee754_acoshf)
|
||||||
movl 8(%esp), %ecx
|
movl 4(%esp), %ecx
|
||||||
cmpl $0x3f800000, %ecx
|
cmpl $0x3f800000, %ecx
|
||||||
jl 5f // < 1 => invalid
|
jl 5f // < 1 => invalid
|
||||||
fldln2 // log(2)
|
fldln2 // log(2)
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* ix87 specific implementation of arcsinh.
|
/* ix87 specific implementation of arcsinh.
|
||||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
|
||||||
|
|
||||||
@ -49,6 +49,7 @@ limit: .double 0.29
|
|||||||
.text
|
.text
|
||||||
ENTRY(__ieee754_acoshl)
|
ENTRY(__ieee754_acoshl)
|
||||||
movl 12(%esp), %ecx
|
movl 12(%esp), %ecx
|
||||||
|
andl $0xffff, %ecx
|
||||||
cmpl $0x3fff, %ecx
|
cmpl $0x3fff, %ecx
|
||||||
jl 5f // < 1 => invalid
|
jl 5f // < 1 => invalid
|
||||||
fldln2 // log(2)
|
fldln2 // log(2)
|
||||||
|
@ -1,21 +1,21 @@
|
|||||||
/* O_*, F_*, FD_* bit values for GNU.
|
/* O_*, F_*, FD_* bit values for GNU.
|
||||||
Copyright (C) 1993, 1994, 1996, 1997 Free Software Foundation, Inc.
|
Copyright (C) 1993, 1994, 1996, 1997 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public License as
|
modify it under the terms of the GNU Library General Public License as
|
||||||
published by the Free Software Foundation; either version 2 of the
|
published by the Free Software Foundation; either version 2 of the
|
||||||
License, or (at your option) any later version.
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Library General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU Library General Public
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Cambridge, MA 02139, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#ifndef _FCNTLBITS_H
|
#ifndef _FCNTLBITS_H
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
DEFS.h
|
DEFS.h
|
||||||
|
elf/DEFS.h
|
||||||
dotmul.S umul.S
|
dotmul.S umul.S
|
||||||
divrem.m4 sdiv.S udiv.S rem.S urem.S
|
divrem.m4 sdiv.S udiv.S rem.S urem.S
|
||||||
alloca.S
|
alloca.S
|
||||||
|
@ -1,26 +1,43 @@
|
|||||||
/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. Sparc version.
|
/* BSD `_setjmp' entry point to `sigsetjmp (..., 0)'. Sparc version.
|
||||||
Copyright (C) 1994 Free Software Foundation, Inc.
|
Copyright (C) 1994, 1997 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public License as
|
modify it under the terms of the GNU Library General Public License as
|
||||||
published by the Free Software Foundation; either version 2 of the
|
published by the Free Software Foundation; either version 2 of the
|
||||||
License, or (at your option) any later version.
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Library General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU Library General Public
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Cambridge, MA 02139, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
|
|
||||||
ENTRY (setjmp)
|
ENTRY (_setjmp)
|
||||||
|
#ifdef PIC
|
||||||
|
1:
|
||||||
|
jmpl 2f,%o1
|
||||||
|
nop
|
||||||
|
2:
|
||||||
|
sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7
|
||||||
|
or %l7,%lo(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7
|
||||||
|
add %l7,%o1,%l7
|
||||||
|
sethi %hi(C_SYMBOL_NAME (__sigsetjmp)),%g1
|
||||||
|
or %g1,%lo(C_SYMBOL_NAME (__sigsetjmp)),%g1
|
||||||
|
ld [%l7+%g1],%g1
|
||||||
|
ld [%g1],%g1
|
||||||
|
jmpl %g1,%g0
|
||||||
|
mov %g0,%o1 /* Pass second argument of zero */
|
||||||
|
#else
|
||||||
|
|
||||||
sethi %hi(C_SYMBOL_NAME (__sigsetjmp)), %g1
|
sethi %hi(C_SYMBOL_NAME (__sigsetjmp)), %g1
|
||||||
or %lo(C_SYMBOL_NAME (__sigsetjmp)), %g1, %g1
|
or %lo(C_SYMBOL_NAME (__sigsetjmp)), %g1, %g1
|
||||||
jmp %g1
|
jmp %g1
|
||||||
mov %g0, %o1 /* Pass second argument of zero. */
|
mov %g0, %o1 /* Pass second argument of zero. */
|
||||||
|
#endif
|
||||||
|
@ -1,26 +1,42 @@
|
|||||||
/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. Sparc version.
|
/* BSD `setjmp' entry point to `sigsetjmp (..., 1)'. Sparc version.
|
||||||
Copyright (C) 1994 Free Software Foundation, Inc.
|
Copyright (C) 1994, 1997 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public License as
|
modify it under the terms of the GNU Library General Public License as
|
||||||
published by the Free Software Foundation; either version 2 of the
|
published by the Free Software Foundation; either version 2 of the
|
||||||
License, or (at your option) any later version.
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Library General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU Library General Public
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Cambridge, MA 02139, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
|
|
||||||
ENTRY (setjmp)
|
ENTRY (setjmp)
|
||||||
|
#ifdef PIC
|
||||||
|
1:
|
||||||
|
jmpl 2f,%o1
|
||||||
|
nop
|
||||||
|
2:
|
||||||
|
sethi %hi(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7
|
||||||
|
or %l7,%lo(_GLOBAL_OFFSET_TABLE_-(1b-.)),%l7
|
||||||
|
add %l7,%o1,%l7
|
||||||
|
sethi %hi(C_SYMBOL_NAME (__sigsetjmp)),%g1
|
||||||
|
or %g1,%lo(C_SYMBOL_NAME (__sigsetjmp)),%g1
|
||||||
|
ld [%l7+%g1],%g1
|
||||||
|
ld [%g1],%g1
|
||||||
|
jmpl %g1,%g0
|
||||||
|
mov 1,%o1
|
||||||
|
#else
|
||||||
sethi %hi(C_SYMBOL_NAME (__sigsetjmp)), %g1
|
sethi %hi(C_SYMBOL_NAME (__sigsetjmp)), %g1
|
||||||
or %lo(C_SYMBOL_NAME (__sigsetjmp)), %g1, %g1
|
or %lo(C_SYMBOL_NAME (__sigsetjmp)), %g1, %g1
|
||||||
jmp %g1
|
jmp %g1
|
||||||
mov 1, %o1 /* Pass second argument of one. */
|
mov 1, %o1 /* Pass second argument of one. */
|
||||||
|
#endif
|
||||||
|
@ -83,11 +83,15 @@ L.$1.eval(2**N+$2):
|
|||||||
ifelse($1, 1, `9:')')dnl
|
ifelse($1, 1, `9:')')dnl
|
||||||
|
|
||||||
#include "DEFS.h"
|
#include "DEFS.h"
|
||||||
|
#ifdef __linux__
|
||||||
|
#include <asm/traps.h>
|
||||||
|
#else
|
||||||
#ifdef __svr4__
|
#ifdef __svr4__
|
||||||
#include <sys/trap.h>
|
#include <sys/trap.h>
|
||||||
#else
|
#else
|
||||||
#include <machine/trap.h>
|
#include <machine/trap.h>
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
FUNC(NAME)
|
FUNC(NAME)
|
||||||
ifelse(S, `true',
|
ifelse(S, `true',
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/* Machine-dependent ELF dynamic relocation inline functions. SPARC version.
|
/* Machine-dependent ELF dynamic relocation inline functions. SPARC version.
|
||||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
@ -36,13 +36,7 @@
|
|||||||
static inline int
|
static inline int
|
||||||
elf_machine_matches_host (Elf32_Half e_machine)
|
elf_machine_matches_host (Elf32_Half e_machine)
|
||||||
{
|
{
|
||||||
switch (e_machine)
|
return e_machine == EM_SPARC;
|
||||||
{
|
|
||||||
case EM_SPARC:
|
|
||||||
return 1;
|
|
||||||
default:
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -62,28 +56,50 @@ static inline Elf32_Addr
|
|||||||
elf_machine_load_address (void)
|
elf_machine_load_address (void)
|
||||||
{
|
{
|
||||||
Elf32_Addr addr;
|
Elf32_Addr addr;
|
||||||
???
|
|
||||||
|
asm (
|
||||||
|
"add %%fp,0x44,%%o2\n\t" /* o2 = point to argc */
|
||||||
|
"ld [%%o2 - 4],%%o0\n\t" /* o0 = load argc */
|
||||||
|
"sll %%o0, 2, %%o0\n\t" /* o0 = argc * sizeof (int) */
|
||||||
|
"add %%o2,%%o0,%%o2\n\t" /* o2 = skip over argv */
|
||||||
|
"add %%o2,4,%%o2\n\t" /* skip over null after argv */
|
||||||
|
|
||||||
|
/* Now %o2 is pointing to env, skip over that as well. */
|
||||||
|
"1:\n\t"
|
||||||
|
"ld [%%o2],%%o0\n\t"
|
||||||
|
"cmp %%o0,0\n\t"
|
||||||
|
"bnz 1b\n\t"
|
||||||
|
"add %%o2,4,%%o2\n\t"
|
||||||
|
|
||||||
|
/* Note that above, we want to advance the NULL after envp so
|
||||||
|
we always add 4. */
|
||||||
|
|
||||||
|
/* Now, search for the AT_BASE property. */
|
||||||
|
"2:\n\t"
|
||||||
|
"ld [%%o2],%%o0\n\t"
|
||||||
|
"cmp %%o0,0\n\t"
|
||||||
|
"be,a 3f\n\t"
|
||||||
|
"or %%g0,%%g0,%0\n\t"
|
||||||
|
"cmp %%o0,7\n\t" /* AT_BASE = 7 */
|
||||||
|
"be,a 3f\n\t"
|
||||||
|
"ld [%%o2+4],%0\n\t"
|
||||||
|
"b 2b\n\t"
|
||||||
|
"add %%o2,8,%%o2\n\t"
|
||||||
|
/* At this point %0 has the load address for the interpreter */
|
||||||
|
"3:\n\t"
|
||||||
|
: "=r" (addr)
|
||||||
|
: /* no inputs */
|
||||||
|
: "o0", "o2");
|
||||||
return addr;
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The `subl' insn above will contain an R_68K_RELATIVE relocation
|
#ifdef RESOLVE
|
||||||
entry intended to insert the run-time address of the label `here'.
|
|
||||||
This will be the first relocation in the text of the dynamic
|
|
||||||
linker; we skip it to avoid trying to modify read-only text in this
|
|
||||||
early stage. */
|
|
||||||
#define ELF_MACHINE_BEFORE_RTLD_RELOC(dynamic_info) \
|
|
||||||
((dynamic_info)[DT_RELA]->d_un.d_ptr += sizeof (Elf32_Rela), \
|
|
||||||
(dynamic_info)[DT_RELASZ]->d_un.d_val -= sizeof (Elf32_Rela))
|
|
||||||
|
|
||||||
/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
|
/* Perform the relocation specified by RELOC and SYM (which is fully resolved).
|
||||||
MAP is the object containing the reloc. */
|
MAP is the object containing the reloc. */
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
elf_machine_rela (struct link_map *map,
|
elf_machine_rela (struct link_map *map,
|
||||||
const Elf32_Rela *reloc, const Elf32_Sym *sym,
|
const Elf32_Rela *reloc, const Elf32_Sym *sym)
|
||||||
Elf32_Addr (*resolve) (const Elf32_Sym **ref,
|
|
||||||
Elf32_Addr reloc_addr,
|
|
||||||
int noplt))
|
|
||||||
{
|
{
|
||||||
Elf32_Addr *const reloc_addr = (void *) (map->l_addr + reloc->r_offset);
|
Elf32_Addr *const reloc_addr = (void *) (map->l_addr + reloc->r_offset);
|
||||||
Elf32_Addr loadbase;
|
Elf32_Addr loadbase;
|
||||||
@ -91,21 +107,17 @@ elf_machine_rela (struct link_map *map,
|
|||||||
switch (ELF32_R_TYPE (reloc->r_info))
|
switch (ELF32_R_TYPE (reloc->r_info))
|
||||||
{
|
{
|
||||||
case R_SPARC_COPY:
|
case R_SPARC_COPY:
|
||||||
loadbase = (*resolve) (&sym, (Elf32_Addr) reloc_addr, 0);
|
loadbase = RESOLVE (&sym, DL_LOOKUP_NOEXEC);
|
||||||
memcpy (reloc_addr, (void *) (loadbase + sym->st_value), sym->st_size);
|
memcpy (reloc_addr, (void *) (loadbase + sym->st_value), sym->st_size);
|
||||||
break;
|
break;
|
||||||
case R_SPARC_GLOB_DAT:
|
case R_SPARC_GLOB_DAT:
|
||||||
case R_SPARC_32:
|
case R_SPARC_32:
|
||||||
loadbase = (resolve ? (*resolve) (&sym, (Elf32_Addr) reloc_addr, 0) :
|
loadbase = RESOLVE (&sym, 0);
|
||||||
/* RESOLVE is null during bootstrap relocation. */
|
|
||||||
map->l_addr);
|
|
||||||
*reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
*reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
||||||
+ reloc->r_addend);
|
+ reloc->r_addend);
|
||||||
break;
|
break;
|
||||||
case R_SPARC_JMP_SLOT:
|
case R_SPARC_JMP_SLOT:
|
||||||
loadbase = (resolve ? (*resolve) (&sym, (Elf32_Addr) reloc_addr, 1) :
|
loadbase = RESOLVE (&sym, DL_LOOKUP_NOPLT);
|
||||||
/* RESOLVE is null during bootstrap relocation. */
|
|
||||||
map->l_addr);
|
|
||||||
{
|
{
|
||||||
Elf32_Addr value = ((sym ? (loadbase + sym->st_value) : 0)
|
Elf32_Addr value = ((sym ? (loadbase + sym->st_value) : 0)
|
||||||
+ reloc->r_addend);
|
+ reloc->r_addend);
|
||||||
@ -114,25 +126,20 @@ elf_machine_rela (struct link_map *map,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case R_SPARC_8:
|
case R_SPARC_8:
|
||||||
loadbase = (*resolve) (&sym, (Elf32_Addr) reloc_addr, 0);
|
loadbase = RESOLVE (&sym, 0);
|
||||||
*(char *) reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
*(char *) reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
||||||
+ reloc->r_addend);
|
+ reloc->r_addend);
|
||||||
break;
|
break;
|
||||||
case R_SPARC_16:
|
case R_SPARC_16:
|
||||||
loadbase = (*resolve) (&sym, (Elf32_Addr) reloc_addr, 0);
|
loadbase = RESOLVE (&sym, 0);
|
||||||
*(short *) reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
*(short *) reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
||||||
+ reloc->r_addend);
|
+ reloc->r_addend);
|
||||||
break;
|
break;
|
||||||
case R_SPARC_32:
|
|
||||||
loadbase = (resolve ? (*resolve) (&sym, (Elf32_Addr) reloc_addr, 0) :
|
|
||||||
/* RESOLVE is null during bootstrap relocation. */
|
|
||||||
map->l_addr);
|
|
||||||
break;
|
|
||||||
case R_SPARC_RELATIVE:
|
case R_SPARC_RELATIVE:
|
||||||
*reloc_addr = map->l_addr + reloc->r_addend;
|
*reloc_addr += map->l_addr + reloc->r_addend;
|
||||||
break;
|
break;
|
||||||
case R_SPARC_DISP8:
|
case R_SPARC_DISP8:
|
||||||
loadbase = (*resolve) (&sym, (Elf32_Addr) reloc_addr, 0);
|
loadbase = RESOLVE (&sym, 0);
|
||||||
*(char *) reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
*(char *) reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
||||||
+ reloc->r_addend
|
+ reloc->r_addend
|
||||||
- (Elf32_Addr) reloc_addr);
|
- (Elf32_Addr) reloc_addr);
|
||||||
@ -144,11 +151,31 @@ elf_machine_rela (struct link_map *map,
|
|||||||
- (Elf32_Addr) reloc_addr);
|
- (Elf32_Addr) reloc_addr);
|
||||||
break;
|
break;
|
||||||
case R_SPARC_DISP32:
|
case R_SPARC_DISP32:
|
||||||
loadbase = (*resolve) (&sym, (Elf32_Addr) reloc_addr, 0);
|
loadbase = RESOLVE (&sym, 0);
|
||||||
*reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
*reloc_addr = ((sym ? (loadbase + sym->st_value) : 0)
|
||||||
+ reloc->r_addend
|
+ reloc->r_addend
|
||||||
- (Elf32_Addr) reloc_addr);
|
- (Elf32_Addr) reloc_addr);
|
||||||
break;
|
break;
|
||||||
|
case R_SPARC_LO10:
|
||||||
|
{
|
||||||
|
unsigned int saddr;
|
||||||
|
|
||||||
|
loadbase = RESOLVE (&sym, 0);
|
||||||
|
saddr = (loadbase ? loadbase : map->l_addr) + reloc->r_addend;
|
||||||
|
|
||||||
|
*reloc_addr = (*reloc_addr & ~0x3ff) | (saddr & 0x3ff);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case R_SPARC_HI22:
|
||||||
|
{
|
||||||
|
unsigned int saddr;
|
||||||
|
|
||||||
|
loadbase = RESOLVE (&sym, 0);
|
||||||
|
saddr = (loadbase ? loadbase : map->l_addr) + reloc->r_addend;
|
||||||
|
|
||||||
|
*reloc_addr = (*reloc_addr & 0xffc00000)|(saddr >> 10);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case R_SPARC_NONE: /* Alright, Wilbur. */
|
case R_SPARC_NONE: /* Alright, Wilbur. */
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
@ -172,6 +199,10 @@ elf_machine_lazy_rel (struct link_map *map, const Elf32_Rela *reloc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define ELF_ADJUST_ARG(arg) __asm__("\tadd %%fp,64,%0\n" : "=r" (arg))
|
||||||
|
|
||||||
|
#endif /* RESOLV */
|
||||||
|
|
||||||
/* Nonzero iff TYPE describes relocation of a PLT entry, so
|
/* Nonzero iff TYPE describes relocation of a PLT entry, so
|
||||||
PLT entries should not be allowed to define the value. */
|
PLT entries should not be allowed to define the value. */
|
||||||
#define elf_machine_pltrel_p(type) ((type) == R_SPARC_JMP_SLOT)
|
#define elf_machine_pltrel_p(type) ((type) == R_SPARC_JMP_SLOT)
|
||||||
@ -213,26 +244,27 @@ elf_machine_runtime_setup (struct link_map *l, int lazy)
|
|||||||
plt[1] = OPCODE_CALL | (((Elf32_Addr) &_dl_runtime_resolve -
|
plt[1] = OPCODE_CALL | (((Elf32_Addr) &_dl_runtime_resolve -
|
||||||
(Elf32_Addr) &plt[1]) >> 2);
|
(Elf32_Addr) &plt[1]) >> 2);
|
||||||
plt[2] = OPCODE_NOP; /* Fill call delay slot. */
|
plt[2] = OPCODE_NOP; /* Fill call delay slot. */
|
||||||
plt[3] = l;
|
plt[3] = (Elf32_Addr *) l;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This code is used in dl-runtime.c to call the `fixup' function
|
/* This code is used in dl-runtime.c to call the `fixup' function
|
||||||
and then redirect to the address it returns. */
|
and then redirect to the address it returns. */
|
||||||
#define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
|
#define ELF_MACHINE_RUNTIME_TRAMPOLINE asm ("\
|
||||||
| Trampoline for _dl_runtime_resolver
|
# Trampoline for _dl_runtime_resolver
|
||||||
.globl _dl_runtime_resolve
|
.globl _dl_runtime_resolve
|
||||||
.type _dl_runtime_resolve, @function
|
.type _dl_runtime_resolve, @function
|
||||||
_dl_runtime_resolve:
|
_dl_runtime_resolve:
|
||||||
| Pass two args to fixup: the PLT address computed from the PC saved
|
#call %g0
|
||||||
| in the PLT's call insn, and the reloc offset passed in %g1.
|
# Pass two args to fixup: the PLT address computed from the PC saved
|
||||||
ld [%o7 + 8], %o1 | Second arg, loaded from PLTPC[2].
|
# in the PLT's call insn, and the reloc offset passed in %g1.
|
||||||
call fixup
|
#ld [%o7 + 8], %o1 | Second arg, loaded from PLTPC[2].
|
||||||
shrl %g1, 22, %o0 | First arg, set in delay slot of call.
|
#call fixup
|
||||||
| Jump to the real function.
|
#shrl %g1, 22, %o0 | First arg, set in delay slot of call.
|
||||||
jmpl %o0, %g0
|
# Jump to the real function.
|
||||||
| In the delay slot of that jump, restore the register window
|
#jmpl %o0, %g0
|
||||||
| saved by the first insn of the PLT.
|
# In the delay slot of that jump, restore the register window
|
||||||
restore
|
# saved by the first insn of the PLT.
|
||||||
|
#restore
|
||||||
.size _dl_runtime_resolve, . - _dl_runtime_resolve
|
.size _dl_runtime_resolve, . - _dl_runtime_resolve
|
||||||
");
|
");
|
||||||
/* The PLT uses Elf32_Rela relocs. */
|
/* The PLT uses Elf32_Rela relocs. */
|
||||||
@ -248,4 +280,13 @@ _dl_runtime_resolve:
|
|||||||
The C function `_dl_start' is the real entry point;
|
The C function `_dl_start' is the real entry point;
|
||||||
its return value is the user program's entry point. */
|
its return value is the user program's entry point. */
|
||||||
|
|
||||||
#define RTLD_START asm (???)
|
#define RTLD_START __asm__ ( \
|
||||||
|
".text\n\
|
||||||
|
.globl _start\n\
|
||||||
|
.type _start,@function\n\
|
||||||
|
_start:\n\
|
||||||
|
call _dl_start\n\
|
||||||
|
nop\n\
|
||||||
|
call %o0\n\
|
||||||
|
nop\n\
|
||||||
|
");
|
||||||
|
5
sysdeps/sparc/elf/DEFS.h
Normal file
5
sysdeps/sparc/elf/DEFS.h
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#define FUNC(name) \
|
||||||
|
.global name; \
|
||||||
|
.type name,@function; \
|
||||||
|
.align 4; \
|
||||||
|
name:
|
@ -1,21 +1,21 @@
|
|||||||
/* Startup code compliant to the ELF SPARC ABI.
|
/* Startup code compliant to the ELF SPARC ABI.
|
||||||
Copyright (C) 1996 Free Software Foundation, Inc.
|
Copyright (C) 1996, 1997 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public License as
|
modify it under the terms of the GNU Library General Public License as
|
||||||
published by the Free Software Foundation; either version 2 of the
|
published by the Free Software Foundation; either version 2 of the
|
||||||
License, or (at your option) any later version.
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Library General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU Library General Public
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Cambridge, MA 02139, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
/* This is the canonical entry point, usually the first thing in the text
|
/* This is the canonical entry point, usually the first thing in the text
|
||||||
segment. The SVR4/SPARC ABI (NOTE: I don't actually have it) says that
|
segment. The SVR4/SPARC ABI (NOTE: I don't actually have it) says that
|
||||||
@ -82,7 +82,7 @@ nofini:
|
|||||||
sll ENVP, 2, ENVP
|
sll ENVP, 2, ENVP
|
||||||
add ARGV, ENVP, ENVP
|
add ARGV, ENVP, ENVP
|
||||||
/* Store ENVP in the global variable `_environ'. */
|
/* Store ENVP in the global variable `_environ'. */
|
||||||
st [TMP + %lo(_environ)], ENVP
|
ld [TMP + %lo(_environ)], ENVP
|
||||||
|
|
||||||
/* Call `_init', which is the entry point to our own `.init'
|
/* Call `_init', which is the entry point to our own `.init'
|
||||||
section; and register with `atexit' to have `exit' call
|
section; and register with `atexit' to have `exit' call
|
||||||
@ -100,6 +100,7 @@ nofini:
|
|||||||
mov ENVP, %o2
|
mov ENVP, %o2
|
||||||
|
|
||||||
call exit /* This should never return. */
|
call exit /* This should never return. */
|
||||||
|
nop
|
||||||
unimp 0 /* Crash if somehow it does return. */
|
unimp 0 /* Crash if somehow it does return. */
|
||||||
|
|
||||||
/* Define a symbol for the first piece of initialized data. */
|
/* Define a symbol for the first piece of initialized data. */
|
||||||
|
@ -53,13 +53,6 @@
|
|||||||
/* private namespace. It should only be used by crt0.o. */
|
/* private namespace. It should only be used by crt0.o. */
|
||||||
extern unsigned short __fpu_control;
|
extern unsigned short __fpu_control;
|
||||||
|
|
||||||
__BEGIN_DECLS
|
|
||||||
|
|
||||||
/* called by crt0.o. It can be used to manipulate 387 control word. */
|
|
||||||
extern void __setfpucw __P ((unsigned short));
|
|
||||||
|
|
||||||
__END_DECLS
|
|
||||||
|
|
||||||
/* Type of the control word. */
|
/* Type of the control word. */
|
||||||
typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__HI__)));
|
typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__HI__)));
|
||||||
|
|
||||||
|
@ -38,11 +38,15 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "DEFS.h"
|
#include "DEFS.h"
|
||||||
|
#ifdef __linux__
|
||||||
|
#include <asm/traps.h>
|
||||||
|
#else
|
||||||
#ifdef __svr4__
|
#ifdef __svr4__
|
||||||
#include <sys/trap.h>
|
#include <sys/trap.h>
|
||||||
#else
|
#else
|
||||||
#include <machine/trap.h>
|
#include <machine/trap.h>
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
FUNC(.rem)
|
FUNC(.rem)
|
||||||
! compute sign of result; if neither is negative, no problem
|
! compute sign of result; if neither is negative, no problem
|
||||||
|
@ -38,11 +38,15 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "DEFS.h"
|
#include "DEFS.h"
|
||||||
|
#ifdef __linux__
|
||||||
|
#include <asm/traps.h>
|
||||||
|
#else
|
||||||
#ifdef __svr4__
|
#ifdef __svr4__
|
||||||
#include <sys/trap.h>
|
#include <sys/trap.h>
|
||||||
#else
|
#else
|
||||||
#include <machine/trap.h>
|
#include <machine/trap.h>
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
FUNC(.div)
|
FUNC(.div)
|
||||||
! compute sign of result; if neither is negative, no problem
|
! compute sign of result; if neither is negative, no problem
|
||||||
|
@ -1,20 +1,20 @@
|
|||||||
/* Copyright (C) 1991, 1993, 1994, 1996 Free Software Foundation, Inc.
|
/* Copyright (C) 1991, 1993, 1994, 1996, 1997 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
modify it under the terms of the GNU Library General Public License as
|
modify it under the terms of the GNU Library General Public License as
|
||||||
published by the Free Software Foundation; either version 2 of the
|
published by the Free Software Foundation; either version 2 of the
|
||||||
License, or (at your option) any later version.
|
License, or (at your option) any later version.
|
||||||
|
|
||||||
The GNU C Library is distributed in the hope that it will be useful,
|
The GNU C Library is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
Library General Public License for more details.
|
Library General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU Library General Public
|
You should have received a copy of the GNU Library General Public
|
||||||
License along with the GNU C Library; see the file COPYING.LIB. If
|
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Cambridge, MA 02139, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
|
|
||||||
@ -25,9 +25,25 @@ ENTRY (__sigsetjmp)
|
|||||||
/* Save our SP and FP; in the delay slot of the jump, save our
|
/* Save our SP and FP; in the delay slot of the jump, save our
|
||||||
return PC. Save the signal mask if requested with a tail-call
|
return PC. Save the signal mask if requested with a tail-call
|
||||||
for simplicity; it always returns zero. */
|
for simplicity; it always returns zero. */
|
||||||
|
#ifdef PIC
|
||||||
|
2:
|
||||||
|
jmpl 1f,%g2
|
||||||
|
nop
|
||||||
|
1:
|
||||||
|
sethi %hi(_GLOBAL_OFFSET_TABLE_-(2b-.)),%l7
|
||||||
|
sethi %hi(C_SYMBOL_NAME (__sigjmp_save)), %g3
|
||||||
|
st %sp, [%o0 + (JB_SP * 4)]
|
||||||
|
or %l7,%lo(_GLOBAL_OFFSET_TABLE_-(2b-.)),%l7
|
||||||
|
or %g3,%lo(C_SYMBOL_NAME (__sigjmp_save)), %g3
|
||||||
|
st %fp, [%o0 + (JB_FP * 4)]
|
||||||
|
ld [%l7+%g3],%g1
|
||||||
|
jmp %g1
|
||||||
|
st %o7, [%o0+(JB_PC*4)]
|
||||||
|
#else
|
||||||
sethi %hi(C_SYMBOL_NAME (__sigjmp_save)), %g1
|
sethi %hi(C_SYMBOL_NAME (__sigjmp_save)), %g1
|
||||||
st %sp, [%o0 + (JB_SP*4)]
|
st %sp, [%o0 + (JB_SP*4)]
|
||||||
or %lo(C_SYMBOL_NAME (__sigjmp_save)), %g1, %g1
|
or %lo(C_SYMBOL_NAME (__sigjmp_save)), %g1, %g1
|
||||||
st %fp, [%o0 + (JB_FP*4)]
|
st %fp, [%o0 + (JB_FP*4)]
|
||||||
jmp %g1
|
jmp %g1
|
||||||
st %o7, [%o0 + (JB_PC*4)]
|
st %o7, [%o0 + (JB_PC*4)]
|
||||||
|
#endif /* PIC */
|
||||||
|
@ -38,11 +38,15 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "DEFS.h"
|
#include "DEFS.h"
|
||||||
|
#ifdef __linux__
|
||||||
|
#include <asm/traps.h>
|
||||||
|
#else
|
||||||
#ifdef __svr4__
|
#ifdef __svr4__
|
||||||
#include <sys/trap.h>
|
#include <sys/trap.h>
|
||||||
#else
|
#else
|
||||||
#include <machine/trap.h>
|
#include <machine/trap.h>
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
FUNC(.udiv)
|
FUNC(.udiv)
|
||||||
|
|
||||||
|
@ -38,11 +38,15 @@
|
|||||||
|
|
||||||
|
|
||||||
#include "DEFS.h"
|
#include "DEFS.h"
|
||||||
|
#ifdef __linux__
|
||||||
|
#include <asm/traps.h>
|
||||||
|
#else
|
||||||
#ifdef __svr4__
|
#ifdef __svr4__
|
||||||
#include <sys/trap.h>
|
#include <sys/trap.h>
|
||||||
#else
|
#else
|
||||||
#include <machine/trap.h>
|
#include <machine/trap.h>
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
FUNC(.urem)
|
FUNC(.urem)
|
||||||
|
|
||||||
|
@ -233,12 +233,17 @@ struct ip_mreq
|
|||||||
struct in_addr imr_interface; /* local IP address of interface */
|
struct in_addr imr_interface; /* local IP address of interface */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* Functions to convert between host and network byte order. */
|
/* Functions to convert between host and network byte order.
|
||||||
|
|
||||||
extern unsigned long int ntohl __P ((unsigned long int));
|
Please note that these functions normally take `unsigned long int' or
|
||||||
extern unsigned short int ntohs __P ((unsigned short int));
|
`unsigned short int' values as arguments and also return them. But
|
||||||
extern unsigned long int htonl __P ((unsigned long int));
|
this was a short-sighted decision since on different systems the types
|
||||||
extern unsigned short int htons __P ((unsigned short int));
|
may have different representations but the values are always the same. */
|
||||||
|
|
||||||
|
extern u_int32_t ntohl __P ((u_int32_t __netlong));
|
||||||
|
extern u_int16_t ntohs __P ((u_int16_t __netshort));
|
||||||
|
extern u_int32_t htonl __P ((u_int32_t __hostlong));
|
||||||
|
extern u_int16_t htons __P ((u_int16_t __hostshort));
|
||||||
|
|
||||||
#include <endian.h>
|
#include <endian.h>
|
||||||
|
|
||||||
|
@ -1,3 +1,11 @@
|
|||||||
ifeq ($(subdir),signal)
|
ifeq ($(subdir),signal)
|
||||||
sysdep_routines += __sigtrampoline
|
sysdep_routines += __sigtrampoline
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
# When I get this to work, this is the right thing
|
||||||
|
ifeq ($(subdir),elf)
|
||||||
|
CFLAGS-rtld.c += -mv8
|
||||||
|
#rtld-routines += dl-sysdepsparc
|
||||||
|
endif # elf
|
||||||
|
|
||||||
|
asm-CPPFLAGS = -fPIC
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
/* Sources: David Miller, 4.4BSD/SPARC code */
|
/* Sources: David Miller, 4.4BSD/SPARC code */
|
||||||
|
|
||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
|
#define __ASSEMBLY__
|
||||||
/* For REGWIN_SZ */
|
/* For REGWIN_SZ */
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
#include <asm/psr.h>
|
#include <asm/psr.h>
|
||||||
@ -18,7 +18,7 @@
|
|||||||
.text
|
.text
|
||||||
|
|
||||||
ENTRY(____sparc_signal_trampoline)
|
ENTRY(____sparc_signal_trampoline)
|
||||||
.global SYMBOL_NAME(____sig_table)
|
.global C_SYMBOL_NAME(____sig_table)
|
||||||
|
|
||||||
/* Make room for 32 %f registers + %fsr
|
/* Make room for 32 %f registers + %fsr
|
||||||
* this is 132 bytes + alignement = 136
|
* this is 132 bytes + alignement = 136
|
||||||
@ -87,8 +87,8 @@ ___syy:
|
|||||||
mov %o5,%o4
|
mov %o5,%o4
|
||||||
/* o4 has the GOT pointer */
|
/* o4 has the GOT pointer */
|
||||||
#endif
|
#endif
|
||||||
sethi %hi(SYMBOL_NAME(____sig_table)),%o5
|
sethi %hi(C_SYMBOL_NAME(____sig_table)),%o5
|
||||||
or %o5,%lo(SYMBOL_NAME(____sig_table)),%o5
|
or %o5,%lo(C_SYMBOL_NAME(____sig_table)),%o5
|
||||||
#ifdef __PIC__
|
#ifdef __PIC__
|
||||||
add %o5,%o4,%o4
|
add %o5,%o4,%o4
|
||||||
ld [%o4],%o5
|
ld [%o4],%o5
|
||||||
@ -99,7 +99,8 @@ ___syy:
|
|||||||
ld [%fp + REGWIN_SZ + 4],%o1 /* Load subcode */
|
ld [%fp + REGWIN_SZ + 4],%o1 /* Load subcode */
|
||||||
ld [%fp + REGWIN_SZ + 8],%o2 /* pointer to sigcontext */
|
ld [%fp + REGWIN_SZ + 8],%o2 /* pointer to sigcontext */
|
||||||
call %o4
|
call %o4
|
||||||
ld [%fp + REGWIN_SZ + 12],%o3 /* Address where signal occurred */
|
ld [%fp + REGWIN_SZ + 12],%o3 /* Address where signal ocurre
|
||||||
|
*/
|
||||||
|
|
||||||
/* handler returned, restore state */
|
/* handler returned, restore state */
|
||||||
tst %l0
|
tst %l0
|
||||||
@ -134,9 +135,9 @@ ___syy:
|
|||||||
mov %l7,%g7
|
mov %l7,%g7
|
||||||
|
|
||||||
/* call sigreturn */
|
/* call sigreturn */
|
||||||
restore %g0,SYS_sigreturn,%g1 /* register back and set syscall */
|
restore %g0,SYS_ify(sigreturn),%g1 /* register back and set syscal */
|
||||||
add %sp,64+16,%o0
|
add %sp,64+16,%o0
|
||||||
t 0x10
|
t 0x10
|
||||||
/* if we return, sysreturn failed */
|
/* if we return, sysreturn failed */
|
||||||
mov SYS_exit,%g1
|
mov SYS_ify(exit),%g1
|
||||||
t 0x10
|
t 0x10
|
||||||
|
1
sysdeps/unix/sysv/linux/sparc/errno.c
Normal file
1
sysdeps/unix/sysv/linux/sparc/errno.c
Normal file
@ -0,0 +1 @@
|
|||||||
|
itn errno;
|
@ -22,14 +22,5 @@
|
|||||||
void
|
void
|
||||||
profil_counter (int signo, __siginfo_t si)
|
profil_counter (int signo, __siginfo_t si)
|
||||||
{
|
{
|
||||||
extern int __sparc_old_signals;
|
|
||||||
|
|
||||||
if (__sparc_old_signals)
|
|
||||||
{
|
|
||||||
struct sigcontext_struct *s = (void *) &si;
|
|
||||||
|
|
||||||
profil_count ((void *) s->sigc_pc);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
profil_count ((void *) si.si_regs.pc);
|
profil_count ((void *) si.si_regs.pc);
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,10 @@
|
|||||||
#include <sys/signal.h>
|
#include <sys/signal.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
/* Commented out while I figure out what the fuck goes on */
|
||||||
|
long ____sig_table [NSIG];
|
||||||
|
#if 0
|
||||||
|
|
||||||
/* The kernel will deliver signals in the old way if the signal
|
/* The kernel will deliver signals in the old way if the signal
|
||||||
number is a positive number. The kernel will deliver a signal
|
number is a positive number. The kernel will deliver a signal
|
||||||
with the new stack layout if the signal number is a negative number.
|
with the new stack layout if the signal number is a negative number.
|
||||||
@ -30,7 +34,6 @@
|
|||||||
using at runtime. */
|
using at runtime. */
|
||||||
|
|
||||||
extern void ____sparc_signal_trampoline (int);
|
extern void ____sparc_signal_trampoline (int);
|
||||||
long ____sig_table [NSIG];
|
|
||||||
|
|
||||||
int
|
int
|
||||||
__trampoline_sigaction (int sig, struct sigaction *new, struct sigaction *old)
|
__trampoline_sigaction (int sig, struct sigaction *new, struct sigaction *old)
|
||||||
@ -60,7 +63,7 @@ __trampoline_sigaction (int sig, struct sigaction *new, struct sigaction *old)
|
|||||||
"1:"
|
"1:"
|
||||||
: "=r" (ret), "=r" ((long int) sig), "=r" ((long int) new),
|
: "=r" (ret), "=r" ((long int) sig), "=r" ((long int) new),
|
||||||
"=r" ((long int) old)
|
"=r" ((long int) old)
|
||||||
: "0" (SYS_sigaction), "1" (sig), "2" (new), "3" (old)
|
: "0" (__NR_sigaction), "1" (sig), "2" (new), "3" (old)
|
||||||
: "g1", "o0", "o1", "o2");
|
: "g1", "o0", "o1", "o2");
|
||||||
|
|
||||||
if (ret >= 0)
|
if (ret >= 0)
|
||||||
@ -79,9 +82,12 @@ __trampoline_sigaction (int sig, struct sigaction *new, struct sigaction *old)
|
|||||||
__set_errno (-ret);
|
__set_errno (-ret);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
# define __new_sigaction __sigaction
|
||||||
|
#endif
|
||||||
|
|
||||||
int
|
int
|
||||||
__new_sigaction (int sig, struct sigaction *new, struct sigaction *old)
|
__new_sigaction (int sig, __const struct sigaction *new, struct sigaction *old)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -98,7 +104,7 @@ __new_sigaction (int sig, struct sigaction *new, struct sigaction *old)
|
|||||||
"1:"
|
"1:"
|
||||||
: "=r" (ret), "=r" ((long int) sig), "=r" ((long int) new),
|
: "=r" (ret), "=r" ((long int) sig), "=r" ((long int) new),
|
||||||
"=r" ((long int) old)
|
"=r" ((long int) old)
|
||||||
: "0" (SYS_sigaction), "1" (sig), "2" (new), "3" (old)
|
: "0" (__NR_sigaction), "1" (sig), "2" (new), "3" (old)
|
||||||
: "g1", "o0", "o1", "o2");
|
: "g1", "o0", "o1", "o2");
|
||||||
if (ret >= 0)
|
if (ret >= 0)
|
||||||
return 0;
|
return 0;
|
||||||
@ -106,10 +112,11 @@ __new_sigaction (int sig, struct sigaction *new, struct sigaction *old)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if 0
|
||||||
int
|
int
|
||||||
__sigaction (int sig, struct sigaction *new, struct sigaction *old)
|
__sigaction (int sig, __const struct sigaction *new, struct sigaction *old)
|
||||||
{
|
{
|
||||||
static (*sigact_routine) (int, struct sigaction *, struct sigaction *);
|
static (*sigact_routine) (int, __const struct sigaction *, struct sigaction *);
|
||||||
int ret;
|
int ret;
|
||||||
struct sigaction sa;
|
struct sigaction sa;
|
||||||
|
|
||||||
@ -124,4 +131,6 @@ __sigaction (int sig, struct sigaction *new, struct sigaction *old)
|
|||||||
|
|
||||||
return __sigaction (sig, new, old);
|
return __sigaction (sig, new, old);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
weak_alias (__sigaction, sigaction);
|
weak_alias (__sigaction, sigaction);
|
||||||
|
@ -16,15 +16,26 @@
|
|||||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
Boston, MA 02111-1307, USA. */
|
Boston, MA 02111-1307, USA. */
|
||||||
|
|
||||||
#define DONT_LOAD_G1
|
|
||||||
#include <sysdep.h>
|
#include <sysdep.h>
|
||||||
ENTRY (__libc_syscall)
|
.text
|
||||||
|
ENTRY (syscall)
|
||||||
or %o0,%g0,%g1
|
or %o0,%g0,%g1
|
||||||
or %o1,%g0,%o0
|
or %o1,%g0,%o0
|
||||||
or %o2,%g0,%o1
|
or %o2,%g0,%o1
|
||||||
or %o3,%g0,%o2
|
or %o3,%g0,%o2
|
||||||
or %o4,%g0,%o3
|
or %o4,%g0,%o3
|
||||||
or %o5,%g0,%o4
|
or %o5,%g0,%o4
|
||||||
PSEUDO_NOENT(__libc_syscall, syscall, 5)
|
ta 0x10
|
||||||
|
bcc 1f
|
||||||
|
nop
|
||||||
|
save %sp, -96, %sp
|
||||||
|
call __errno_location
|
||||||
|
nop
|
||||||
|
st %i0,[%o0]
|
||||||
|
restore
|
||||||
|
retl
|
||||||
|
mov -1, %o0
|
||||||
|
1:
|
||||||
ret
|
ret
|
||||||
SYSCALL__POST(syscall,5)
|
|
||||||
|
PSEUDO_END (syscall)
|
||||||
|
3
sysdeps/unix/sysv/linux/sparc/syscalls.list
Normal file
3
sysdeps/unix/sysv/linux/sparc/syscalls.list
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
# File name Caller Syscall name # args Strong name Weak names
|
||||||
|
|
||||||
|
s_llseek llseek _llseek 5 __sys_llseek
|
3
sysdeps/unix/sysv/linux/sparc/sysdep.S
Normal file
3
sysdeps/unix/sysv/linux/sparc/sysdep.S
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
/* Define errno */
|
||||||
|
|
||||||
|
.common errno,4,4
|
@ -20,6 +20,11 @@
|
|||||||
#ifndef _LINUX_SPARC_SYSDEP_H
|
#ifndef _LINUX_SPARC_SYSDEP_H
|
||||||
#define _LINUX_SPARC_SYSDEP_H 1
|
#define _LINUX_SPARC_SYSDEP_H 1
|
||||||
|
|
||||||
|
/* Kernel headers use __ASSEMBLY__ */
|
||||||
|
#ifdef ASSEMBLER
|
||||||
|
#define __ASSEMBLY__
|
||||||
|
#endif
|
||||||
|
|
||||||
#include <sysdeps/unix/sparc/sysdep.h>
|
#include <sysdeps/unix/sparc/sysdep.h>
|
||||||
|
|
||||||
#undef SYS_ify
|
#undef SYS_ify
|
||||||
@ -30,12 +35,34 @@
|
|||||||
#ifdef DONT_LOAD_G1
|
#ifdef DONT_LOAD_G1
|
||||||
# define LOADSYSCALL(x)
|
# define LOADSYSCALL(x)
|
||||||
#else
|
#else
|
||||||
# define LOADSYSCALL(x) mov SYS_##n, %g1
|
# define LOADSYSCALL(x) mov __NR_##x, %g1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Linux/SPARC uses a different trap number and uses __errno_location always */
|
/* Linux/SPARC uses a different trap number */
|
||||||
#undef PSEUDO
|
#undef PSEUDO
|
||||||
|
|
||||||
|
#ifdef PIC
|
||||||
|
#define SYSCALL_ERROR_HANDLER \
|
||||||
|
.global C_SYMBOL_NAME(__errno_location);\
|
||||||
|
.type C_SYMBOL_NAME(__errno_location),@function;\
|
||||||
|
save %sp,-96,%sp;\
|
||||||
|
call __errno_location;\
|
||||||
|
nop;\
|
||||||
|
st %i0,[%o0];\
|
||||||
|
restore;\
|
||||||
|
retl;\
|
||||||
|
mov -1,%o0;
|
||||||
|
#else
|
||||||
|
#define SYSCALL_ERROR_HANDLER \
|
||||||
|
save %sp,-96,%sp; \
|
||||||
|
call __errno_location; \
|
||||||
|
nop; \
|
||||||
|
st %i0,[%o0]; \
|
||||||
|
restore; \
|
||||||
|
retl; \
|
||||||
|
mov -1,%o0;
|
||||||
|
#endif /* PIC */
|
||||||
|
|
||||||
#define PSEUDO(name, syscall_name, args) \
|
#define PSEUDO(name, syscall_name, args) \
|
||||||
.text; \
|
.text; \
|
||||||
ENTRY(name); \
|
ENTRY(name); \
|
||||||
@ -43,14 +70,8 @@
|
|||||||
ta 0x10; \
|
ta 0x10; \
|
||||||
bcc,a 1f; \
|
bcc,a 1f; \
|
||||||
nop; \
|
nop; \
|
||||||
save %sp,96,%sp; \
|
SYSCALL_ERROR_HANDLER; \
|
||||||
call __errno_location; \
|
1:;
|
||||||
nop; \
|
|
||||||
st %i0,[%o0]; \
|
|
||||||
restore; \
|
|
||||||
retl; \
|
|
||||||
mov -1,%o0; \
|
|
||||||
1:
|
|
||||||
|
|
||||||
#endif /* ASSEMBLER */
|
#endif /* ASSEMBLER */
|
||||||
|
|
||||||
|
@ -106,12 +106,12 @@ $(tzfiles:%=$(objpfx)z.%): $(objpfx)z.%: % Makefile
|
|||||||
echo '$*-zones := $$(subst $$(nl), ,$$($*-zones))' ;\
|
echo '$*-zones := $$(subst $$(nl), ,$$($*-zones))' ;\
|
||||||
echo 'ifdef $*-zones' ;\
|
echo 'ifdef $*-zones' ;\
|
||||||
if test x$(findstring $*, $(tzlinks)) != x; then \
|
if test x$(findstring $*, $(tzlinks)) != x; then \
|
||||||
echo '$$(addprefix $$(inst_datadir)/zone%/right/,$$($*-zones)) \';\
|
echo '$$(addprefix $$(inst_zonedir)/right/,$$($*-zones)) \';\
|
||||||
echo '$$(addprefix $$(inst_datadir)/zone%/posix/,$$($*-zones)) \';\
|
echo '$$(addprefix $$(inst_zonedir)/posix/,$$($*-zones)) \';\
|
||||||
echo '$$(addprefix $$(inst_datadir)/zone%/,$$($*-zones)): \' ;\
|
echo '$$(addprefix $$(inst_zonedir)/,$$($*-zones)): \' ;\
|
||||||
echo '$$(foreach t,$$(tzbases),$$(addprefix $$(inst_datadir)/zone%/right/,$$($$t-zones))) \' ;\
|
echo '$$(foreach t,$$(tzbases),$$(addprefix $$(inst_zonedir)/right/,$$($$t-zones))) \' ;\
|
||||||
echo '$$(foreach t,$$(tzbases),$$(addprefix $$(inst_datadir)/zone%/posix/,$$($$t-zones))) \' ;\
|
echo '$$(foreach t,$$(tzbases),$$(addprefix $$(inst_zonedir)/posix/,$$($$t-zones))) \' ;\
|
||||||
echo '$$(foreach t,$$(tzbases),$$(addprefix $$(inst_datadir)/zone%/,$$($$t-zones)))' ;\
|
echo '$$(foreach t,$$(tzbases),$$(addprefix $$(inst_zonedir)/,$$($$t-zones)))' ;\
|
||||||
fi ;\
|
fi ;\
|
||||||
echo '$$(addprefix $$(inst_datadir)/zone%/right/,$$($*-zones)): \' ;\
|
echo '$$(addprefix $$(inst_datadir)/zone%/right/,$$($*-zones)): \' ;\
|
||||||
echo '$< $$(objpfx)zic leapseconds yearistype' ;\
|
echo '$< $$(objpfx)zic leapseconds yearistype' ;\
|
||||||
|
Reference in New Issue
Block a user