1
0
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:
Ulrich Drepper
1997-02-27 06:01:16 +00:00
parent 867a8743a4
commit ceb2d9aaa8
47 changed files with 794 additions and 425 deletions

129
ChangeLog
View File

@ -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>

View File

@ -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.

View File

@ -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

View File

@ -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;
} }

View File

@ -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,22 +493,26 @@ 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
for (l = _dl_loaded->l_next; l; l = l->l_next) {
if (l->l_opencount == 0) struct link_map *l;
/* The library was not found. */
_dl_sysdep_message ("\t", l->l_libname->name, " => not found\n", for (l = _dl_loaded->l_next; l; l = l->l_next)
NULL); if (l->l_opencount == 0)
else /* The library was not found. */
{ _dl_sysdep_message ("\t", l->l_libname->name, " => not found\n",
char buf[20], *bp; NULL);
buf[sizeof buf - 1] = '\0'; else
bp = _itoa (l->l_addr, &buf[sizeof buf - 1], 16, 0); {
while ((size_t) (&buf[sizeof buf - 1] - bp) char buf[20], *bp;
< sizeof l->l_addr * 2) buf[sizeof buf - 1] = '\0';
*--bp = '0'; bp = _itoa (l->l_addr, &buf[sizeof buf - 1], 16, 0);
_dl_sysdep_message ("\t", l->l_libname->name, " => ", l->l_name, while ((size_t) (&buf[sizeof buf - 1] - bp)
" (0x", bp, ")\n", NULL); < sizeof l->l_addr * 2)
} *--bp = '0';
_dl_sysdep_message ("\t", l->l_libname->name, " => ",
l->l_name, " (0x", bp, ")\n", NULL);
}
}
if (mode != trace) if (mode != trace)
for (i = 1; i < _dl_argc; ++i) for (i = 1; i < _dl_argc; ++i)
@ -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;

View File

@ -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 *

View 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))

View File

@ -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*));

View File

@ -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);
} }

View File

@ -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 = {

View File

@ -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 $@ $^

View File

@ -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
View 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);
}

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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>

View File

@ -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);

View File

@ -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);

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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',

View File

@ -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
View File

@ -0,0 +1,5 @@
#define FUNC(name) \
.global name; \
.type name,@function; \
.align 4; \
name:

View File

@ -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. */

View File

@ -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__)));

View File

@ -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

View File

@ -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

View File

@ -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 */

View File

@ -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)

View File

@ -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)

View File

@ -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>

View File

@ -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

View File

@ -4,10 +4,10 @@
/* Contributed by Miguel de Icaza (miguel@gnu.ai.mit.edu) */ /* Contributed by Miguel de Icaza (miguel@gnu.ai.mit.edu) */
/* Many thanks go to David Miller for explaining all this to me */ /* Many thanks go to David Miller for explaining all this to me */
/* miguel@nuclecu.unam.mx */ /* miguel@nuclecu.unam.mx */
/* 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,13 +18,13 @@
.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
* 96 is the C frame size * 96 is the C frame size
*/ */
save %sp,-136-CCFSZ,%sp save %sp,-136-CCFSZ,%sp
/* save regular registers */ /* save regular registers */
mov %g2,%l2 mov %g2,%l2
@ -34,31 +34,31 @@ ENTRY(____sparc_signal_trampoline)
mov %g6,%l6 mov %g6,%l6
mov %g7,%l7 mov %g7,%l7
/* save fpu registers */ /* save fpu registers */
ld [%fp+64+16+20],%l0 /* load the psr from sigcontext */ ld [%fp+64+16+20],%l0 /* load the psr from sigcontext */
sethi %hi(PSR_EF),%l1 sethi %hi(PSR_EF),%l1
andcc %l0,%l1,%l0 /* is floating point enabled? */ andcc %l0,%l1,%l0 /* is floating point enabled? */
be 1f be 1f
rd %y,%l1 /* save y anyways */ rd %y,%l1 /* save y anyways */
/* save fpu registers */ /* save fpu registers */
st %fsr, [%sp + CCFSZ + 0] st %fsr, [%sp + CCFSZ + 0]
std %f0, [%sp + CCFSZ + 8] std %f0, [%sp + CCFSZ + 8]
std %f2, [%sp + CCFSZ + 16] std %f2, [%sp + CCFSZ + 16]
std %f4, [%sp + CCFSZ + 24] std %f4, [%sp + CCFSZ + 24]
std %f6, [%sp + CCFSZ + 32] std %f6, [%sp + CCFSZ + 32]
std %f8, [%sp + CCFSZ + 40] std %f8, [%sp + CCFSZ + 40]
std %f10, [%sp + CCFSZ + 48] std %f10, [%sp + CCFSZ + 48]
std %f12, [%sp + CCFSZ + 56] std %f12, [%sp + CCFSZ + 56]
std %f14, [%sp + CCFSZ + 64] std %f14, [%sp + CCFSZ + 64]
std %f16, [%sp + CCFSZ + 72] std %f16, [%sp + CCFSZ + 72]
std %f18, [%sp + CCFSZ + 80] std %f18, [%sp + CCFSZ + 80]
std %f20, [%sp + CCFSZ + 88] std %f20, [%sp + CCFSZ + 88]
std %f22, [%sp + CCFSZ + 96] std %f22, [%sp + CCFSZ + 96]
std %f24, [%sp + CCFSZ + 104] std %f24, [%sp + CCFSZ + 104]
std %f26, [%sp + CCFSZ + 112] std %f26, [%sp + CCFSZ + 112]
std %f28, [%sp + CCFSZ + 120] std %f28, [%sp + CCFSZ + 120]
std %f30, [%sp + CCFSZ + 128] std %f30, [%sp + CCFSZ + 128]
1: 1:
/* Load signal number */ /* Load signal number */
@ -69,7 +69,7 @@ ENTRY(____sparc_signal_trampoline)
/* Sanity check */ /* Sanity check */
cmp %o0,33 cmp %o0,33
bl 1f bl 1f
or %g0,%g0,%g1 /*Call sys_setup */ or %g0,%g0,%g1 /*Call sys_setup */
t 0x10 t 0x10
1: 1:
#ifdef __PIC__ #ifdef __PIC__
@ -79,16 +79,16 @@ ___sxx:
call ___syy call ___syy
nop nop
___syy: ___syy:
sethi %hi(_GLOBAL_OFFSET_TABLE_-(___sxx-.)),%o5 sethi %hi(_GLOBAL_OFFSET_TABLE_-(___sxx-.)),%o5
or %o5,%lo(_GLOBAL_OFFSET_TABLE_-(___sxx-.)),%o5 or %o5,%lo(_GLOBAL_OFFSET_TABLE_-(___sxx-.)),%o5
add %o7,%o5,%o5 add %o7,%o5,%o5
/* restore return address */ /* restore return address */
mov %o4,%o7 mov %o4,%o7
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
@ -97,9 +97,10 @@ ___syy:
add %o5,%o4,%o4 add %o5,%o4,%o4
ld [%o4],%o4 ld [%o4],%o4
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
@ -107,23 +108,23 @@ ___syy:
wr %l1,%g0,%y wr %l1,%g0,%y
/* fpu restoration */ /* fpu restoration */
ld [%sp + CCFSZ + 0], %fsr ld [%sp + CCFSZ + 0], %fsr
ldd [%sp + CCFSZ + 8], %f0 ldd [%sp + CCFSZ + 8], %f0
ldd [%sp + CCFSZ + 16], %f2 ldd [%sp + CCFSZ + 16], %f2
ldd [%sp + CCFSZ + 24], %f4 ldd [%sp + CCFSZ + 24], %f4
ldd [%sp + CCFSZ + 32], %f6 ldd [%sp + CCFSZ + 32], %f6
ldd [%sp + CCFSZ + 40], %f8 ldd [%sp + CCFSZ + 40], %f8
ldd [%sp + CCFSZ + 48], %f10 ldd [%sp + CCFSZ + 48], %f10
ldd [%sp + CCFSZ + 56], %f12 ldd [%sp + CCFSZ + 56], %f12
ldd [%sp + CCFSZ + 64], %f14 ldd [%sp + CCFSZ + 64], %f14
ldd [%sp + CCFSZ + 72], %f16 ldd [%sp + CCFSZ + 72], %f16
ldd [%sp + CCFSZ + 80], %f18 ldd [%sp + CCFSZ + 80], %f18
ldd [%sp + CCFSZ + 88], %f20 ldd [%sp + CCFSZ + 88], %f20
ldd [%sp + CCFSZ + 96], %f22 ldd [%sp + CCFSZ + 96], %f22
ldd [%sp + CCFSZ + 104], %f24 ldd [%sp + CCFSZ + 104], %f24
ldd [%sp + CCFSZ + 112], %f26 ldd [%sp + CCFSZ + 112], %f26
ldd [%sp + CCFSZ + 120], %f28 ldd [%sp + CCFSZ + 120], %f28
ldd [%sp + CCFSZ + 128], %f30 ldd [%sp + CCFSZ + 128], %f30
1: 1:
mov %l2,%g2 mov %l2,%g2
@ -133,10 +134,10 @@ ___syy:
mov %l6,%g6 mov %l6,%g6
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

View File

@ -0,0 +1 @@
itn errno;

View File

@ -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; profil_count ((void *) si.si_regs.pc);
if (__sparc_old_signals)
{
struct sigcontext_struct *s = (void *) &si;
profil_count ((void *) s->sigc_pc);
}
else
profil_count ((void *) si.si_regs.pc);
} }

View File

@ -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);

View File

@ -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)

View File

@ -0,0 +1,3 @@
# File name Caller Syscall name # args Strong name Weak names
s_llseek llseek _llseek 5 __sys_llseek

View File

@ -0,0 +1,3 @@
/* Define errno */
.common errno,4,4

View File

@ -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 */

View File

@ -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' ;\