1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-28 00:21:52 +03:00

update from main archive 970120

Tue Jan 21 04:05:20 1997  Ulrich Drepper  <drepper@cygnus.com>

	* version.h (VERSION): Bump to 1.101.

	Implement -d and -r option to `ldd' to check relocations.
	* elf/dl-error.c: Add another method to intercept errors.
	(_dl_receive_error): New function.  Install user defined handler.
	(receiver): New variable.  Contains pointer to user provided handler.
	(_dl_signal_error): If user provided handler is installed call this.
	* elf/dl-load.c (_dl_map_object): When shared object is not found in
	trace mode initialize a few more fields so that lookup can actually
	happen but always fails.
	* elf/ldd.sh.in: Rewrite argument handling.  Recognize new arguments
	to trigger reloation test.  Return with appropriate error code if
	a file wasn't found.  Print warning if object is not executable.
	* elf/ldd.bash.in: Likewise.
	* elf/link.h (receiver_fct): New type.  Used in _dl_receive_error.
	(_dl_sysdep_error): New prototype.
	(_dl_receive_error): New prototype.
	(_dl_signal_error): Remove  __attribute__ ((__noreturn__)).
	* elf/rtld.c (dl_main): Rewrite argument handling.  More than
	one argument allowed.  Recognize --data-relocs and --function-relocs
	arguments.
	Don't determine `lazy' mode from LD_BIND_NOW environment variable
	when in trace mode.
	If in trace mode and either --data-relocs or --function-relocs is
	given perform relocation.  Report errors using print_unresolved
	function.
	(print_unresolved): New function.  Print information about missing
	symbol on stderr.
	* sysdeps/generic/dl-sysdep.c (_dl_sysdep_error): New function.
	Like _dl_sysdep_message but print to stderr.
	* sysdeps/mach/hurd/dl-sysdep.c: Likewise.

	* sysdeps/generic/sockaddrcom.h: Add definition of sa_family_t.
	Reported by Andreas Schwab.
	(__SOCKADDR_COMMON): Use sa_family_t for family member.
	* sysdeps/unix/bsd/bsd4.4/sockaddrcom.h: Likewise.

	Linux/Sparc support by Miguel de Icaza.
	* sysdeps/sparc/fpu_control.h: New file.
	* sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S: New file.
	* sysdeps/unix/sysv/linux/sparc/brk.c: New file.
	* sysdeps/unix/sysv/linux/sparc/profil-counter.h: New file.
	* sysdeps/unix/sysv/linux/sparc/sigaction.c: New file.
	* sysdeps/unix/sysv/linux/sparc/socket.S: New file.
	* sysdeps/unix/sysv/linux/sparc/syscall.S: New file.
	* sysdeps/unix/sysv/linux/sparc/sysdep.h: New file.
	* sysdeps/unix/sysv/linux/sparc/Dist: New file.
	* sysdeps/unix/sysv/linux/sparc/Makefile: New file.

	* sysdeps/unix/sysv/linux/net/if_arp.h: Don't use kernel header.
	Provide own definition based on 4.4BSD and Linux.
	* sysdeps/unix/sysv/linux/net/ppp_defs.h: Define __u32 before
	including <linux/ppp_defs.h>.
	* sysdeps/unix/sysv/linux/sys/msq_buf.h (struct msqid_ds): Don't
	use __pid_t since the kernel might have a different size.
	* sysdeps/unix/sysv/linux/sys/shm_buf.h (struct shmid_ds): Likewise.
	Reported by Andreas Schwab.

	* time/asctime.c: Update copyright.
	* time/dysize.c: Likewise.
	* time/gmtime.c: Likewise.
	* time/timegm.c: Likewise.
	* time/offtime.c: Likewise.  De-ANSI-declfy.

	* time/tzset.c (__tzset_internal): When TZ envvar does not name a
	DST timezone don't default to offset -1.

	* sysdeps/unix/sysv/linux/net/route.h: Don't use kernel header.
	Reported by a sun <asun@zoology.washington.edu>.

	* resolv/Makefile: Correct spelling: subdirs-dirs -> subdir-dirs.

	* sysdeps/stub/sysv_signal.c: New file.  Stub implementation.

	* Makefile (distribute): Add mcheck.h.

	* nis/Makefile (distribute): Add nss-nis.h.

	* libio/Makefile (routines): Change vdprintf to iovdprintf to prevent
	dist problem.

	* nss/Makefile (distribute): Add digits_dots.c.

	* sysdeps/unix/sysv/linux/Dist: Add kernel_sigaction.h.
	* sysdeps/unix/sysv/linux/alpha/Dist: Add sys/procfs.h.
	* sysdeps/unix/sysv/linux/sparc/Dist: Add clone.S.
	* new-malloc/Makefile (distribute): Add mcheck-init.c and mcheck.h.

Mon Jan 20 17:54:28 1997  Sven Verdoolaege  <skimo@breughel.ufsia.ac.be>

	* manual/filesys.texi: Fix little problem (reentrant->readdir).

Fri Jan 17 19:07:07 1997  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* configure.in [$elf=yes]: Check for support of .previous and
	.popsection in the assembler.
	* config.h.in: Add HAVE_ASM_PREVIOUS_DIRECTIVE and
	HAVE_ASM_POPSECTION_DIRECTIVE.
	* libc-symbols.h (__make_section_unallocated) [HAVE_ELF]: Define
	appropriate if either .previous or .popsection is supported.
	(libc_warning) [HAVE_ELF]: Use it here.

Sat Jan 18 22:15:26 1997  Richard Henderson  <rth@tamu.edu>

	* Makeconfig (CFLAGS-.so): Add -fno-common to prevent odd sorts of
	errors that can occur when linking libc.so.

Mon Jan 20 05:20:49 1997  Ulrich Drepper  <drepper@cygnus.com>

	* elf/dl-load.c (open_path): When running setuid don't try
	a directory if it is not given with the full name.

	* elf/Makefile (before-compile): New variable.  Mention trusted-dirs.h.
	(trusted-dirs.h): Construct file from $(default-rpath) and
	$(user-defined-trusted-dirs) variables.
	* elf/dl-load.c (_dl_map_object): Pass additional argument to open_path
	which is NULL except for the LD_LIBRARY_PATH pass in which case it
	is a pointer to the list of directories from the trusted-dirs.h
	file.
	(open_path): Accept additional argument with list of trusted dirs.
	When running setuid and a list of trusted dirs is given only use
	those which are mentioned in the list.

	* elf/rtld.c (dl_main): Don't reject whole LD_LIBRARY_PATH when
	running setuid.  Instead accept entries which do not contain a '/'.

	* Makeconfig: Correct comment about +(default_cflags).

Mon Jan 20 05:11:14 1997  Hrvoje Niksic  <hniksic@srce.hr>

	* time/strptime.c (recursive): Use && not || to test for valid
	argument.

Mon Jan 20 05:06:50 1997  Ulrich Drepper  <drepper@cygnus.com>

	* elf/ldd.sh.in: Exit with value 1 if an error occured.
	* elf/ldd.bash.in: Likewise.

	* elf/rtld.c (dl_main): Do not always ignore LD_PRELOAD when the
	binary runs setuid.  It is save to use those entries which do not
	contain a '/'.  This is compatible with Solaris-2.
This commit is contained in:
Ulrich Drepper
1997-01-21 06:10:42 +00:00
parent f9c53d1159
commit fd26970f33
51 changed files with 1671 additions and 241 deletions

144
ChangeLog
View File

@ -1,3 +1,147 @@
Tue Jan 21 04:05:20 1997 Ulrich Drepper <drepper@cygnus.com>
* version.h (VERSION): Bump to 1.101.
Implement -d and -r option to `ldd' to check relocations.
* elf/dl-error.c: Add another method to intercept errors.
(_dl_receive_error): New function. Install user defined handler.
(receiver): New variable. Contains pointer to user provided handler.
(_dl_signal_error): If user provided handler is installed call this.
* elf/dl-load.c (_dl_map_object): When shared object is not found in
trace mode initialize a few more fields so that lookup can actually
happen but always fails.
* elf/ldd.sh.in: Rewrite argument handling. Recognize new arguments
to trigger reloation test. Return with appropriate error code if
a file wasn't found. Print warning if object is not executable.
* elf/ldd.bash.in: Likewise.
* elf/link.h (receiver_fct): New type. Used in _dl_receive_error.
(_dl_sysdep_error): New prototype.
(_dl_receive_error): New prototype.
(_dl_signal_error): Remove __attribute__ ((__noreturn__)).
* elf/rtld.c (dl_main): Rewrite argument handling. More than
one argument allowed. Recognize --data-relocs and --function-relocs
arguments.
Don't determine `lazy' mode from LD_BIND_NOW environment variable
when in trace mode.
If in trace mode and either --data-relocs or --function-relocs is
given perform relocation. Report errors using print_unresolved
function.
(print_unresolved): New function. Print information about missing
symbol on stderr.
* sysdeps/generic/dl-sysdep.c (_dl_sysdep_error): New function.
Like _dl_sysdep_message but print to stderr.
* sysdeps/mach/hurd/dl-sysdep.c: Likewise.
* sysdeps/generic/sockaddrcom.h: Add definition of sa_family_t.
Reported by Andreas Schwab.
(__SOCKADDR_COMMON): Use sa_family_t for family member.
* sysdeps/unix/bsd/bsd4.4/sockaddrcom.h: Likewise.
Linux/Sparc support by Miguel de Icaza.
* sysdeps/sparc/fpu_control.h: New file.
* sysdeps/unix/sysv/linux/sparc/__sigtrampoline.S: New file.
* sysdeps/unix/sysv/linux/sparc/brk.c: New file.
* sysdeps/unix/sysv/linux/sparc/profil-counter.h: New file.
* sysdeps/unix/sysv/linux/sparc/sigaction.c: New file.
* sysdeps/unix/sysv/linux/sparc/socket.S: New file.
* sysdeps/unix/sysv/linux/sparc/syscall.S: New file.
* sysdeps/unix/sysv/linux/sparc/sysdep.h: New file.
* sysdeps/unix/sysv/linux/sparc/Dist: New file.
* sysdeps/unix/sysv/linux/sparc/Makefile: New file.
* sysdeps/unix/sysv/linux/net/if_arp.h: Don't use kernel header.
Provide own definition based on 4.4BSD and Linux.
* sysdeps/unix/sysv/linux/net/ppp_defs.h: Define __u32 before
including <linux/ppp_defs.h>.
* sysdeps/unix/sysv/linux/sys/msq_buf.h (struct msqid_ds): Don't
use __pid_t since the kernel might have a different size.
* sysdeps/unix/sysv/linux/sys/shm_buf.h (struct shmid_ds): Likewise.
Reported by Andreas Schwab.
* time/asctime.c: Update copyright.
* time/dysize.c: Likewise.
* time/gmtime.c: Likewise.
* time/timegm.c: Likewise.
* time/offtime.c: Likewise. De-ANSI-declfy.
* time/tzset.c (__tzset_internal): When TZ envvar does not name a
DST timezone don't default to offset -1.
* sysdeps/unix/sysv/linux/net/route.h: Don't use kernel header.
Reported by a sun <asun@zoology.washington.edu>.
* resolv/Makefile: Correct spelling: subdirs-dirs -> subdir-dirs.
* sysdeps/stub/sysv_signal.c: New file. Stub implementation.
* Makefile (distribute): Add mcheck.h.
* nis/Makefile (distribute): Add nss-nis.h.
* libio/Makefile (routines): Change vdprintf to iovdprintf to prevent
dist problem.
* nss/Makefile (distribute): Add digits_dots.c.
* sysdeps/unix/sysv/linux/Dist: Add kernel_sigaction.h.
* sysdeps/unix/sysv/linux/alpha/Dist: Add sys/procfs.h.
* sysdeps/unix/sysv/linux/sparc/Dist: Add clone.S.
* new-malloc/Makefile (distribute): Add mcheck-init.c and mcheck.h.
Mon Jan 20 17:54:28 1997 Sven Verdoolaege <skimo@breughel.ufsia.ac.be>
* manual/filesys.texi: Fix little problem (reentrant->readdir).
Fri Jan 17 19:07:07 1997 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* configure.in [$elf=yes]: Check for support of .previous and
.popsection in the assembler.
* config.h.in: Add HAVE_ASM_PREVIOUS_DIRECTIVE and
HAVE_ASM_POPSECTION_DIRECTIVE.
* libc-symbols.h (__make_section_unallocated) [HAVE_ELF]: Define
appropriate if either .previous or .popsection is supported.
(libc_warning) [HAVE_ELF]: Use it here.
Sat Jan 18 22:15:26 1997 Richard Henderson <rth@tamu.edu>
* Makeconfig (CFLAGS-.so): Add -fno-common to prevent odd sorts of
errors that can occur when linking libc.so.
Mon Jan 20 05:20:49 1997 Ulrich Drepper <drepper@cygnus.com>
* elf/dl-load.c (open_path): When running setuid don't try
a directory if it is not given with the full name.
* elf/Makefile (before-compile): New variable. Mention trusted-dirs.h.
(trusted-dirs.h): Construct file from $(default-rpath) and
$(user-defined-trusted-dirs) variables.
* elf/dl-load.c (_dl_map_object): Pass additional argument to open_path
which is NULL except for the LD_LIBRARY_PATH pass in which case it
is a pointer to the list of directories from the trusted-dirs.h
file.
(open_path): Accept additional argument with list of trusted dirs.
When running setuid and a list of trusted dirs is given only use
those which are mentioned in the list.
* elf/rtld.c (dl_main): Don't reject whole LD_LIBRARY_PATH when
running setuid. Instead accept entries which do not contain a '/'.
* Makeconfig: Correct comment about +(default_cflags).
Mon Jan 20 05:11:14 1997 Hrvoje Niksic <hniksic@srce.hr>
* time/strptime.c (recursive): Use && not || to test for valid
argument.
Mon Jan 20 05:06:50 1997 Ulrich Drepper <drepper@cygnus.com>
* elf/ldd.sh.in: Exit with value 1 if an error occured.
* elf/ldd.bash.in: Likewise.
* elf/rtld.c (dl_main): Do not always ignore LD_PRELOAD when the
binary runs setuid. It is save to use those entries which do not
contain a '/'. This is compatible with Solaris-2.
Mon Jan 20 03:02:50 1997 Ulrich Drepper <drepper@cygnus.com> Mon Jan 20 03:02:50 1997 Ulrich Drepper <drepper@cygnus.com>
* Make-dist: Update and reformat copyright. * Make-dist: Update and reformat copyright.

View File

@ -421,7 +421,7 @@ ifdef CFLAGS
endif # CFLAGS endif # CFLAGS
endif # +cflags endif # +cflags
# If none of the above worked, default to "-g". # If none of the above worked, default to "-g -O".
ifeq "$(strip $(+cflags))" "" ifeq "$(strip $(+cflags))" ""
+cflags := $(default_cflags) +cflags := $(default_cflags)
endif # $(+cflags) == "" endif # $(+cflags) == ""
@ -470,7 +470,7 @@ ifeq (yes,$(build-shared))
# The PIC object files are named foo.so. # The PIC object files are named foo.so.
object-suffixes += .so object-suffixes += .so
CPPFLAGS-.so = -DPIC CPPFLAGS-.so = -DPIC
CFLAGS-.so = -fPIC CFLAGS-.so = -fPIC -fno-common
libtype.so := lib%_pic.a libtype.so := lib%_pic.a
endif endif
ifeq (yes,$(build-profile)) ifeq (yes,$(build-profile))

View File

@ -295,7 +295,8 @@ distribute := README INSTALL FAQ NOTES NEWS PROJECTS \
config.h.in config.make.in config-name.in Makefile.in \ config.h.in config.make.in config-name.in Makefile.in \
autolock.sh rellns-sh munch-tmpl.c munch.awk interp.c \ autolock.sh rellns-sh munch-tmpl.c munch.awk interp.c \
sysdep.h set-hooks.h libc-symbols.h version.h shlib-versions \ sysdep.h set-hooks.h libc-symbols.h version.h shlib-versions \
rpm/Makefile rpm/template rpm/rpmrc nsswitch.h netgroup.h rpm/Makefile rpm/template rpm/rpmrc nsswitch.h netgroup.h \
mcheck.h
distribute := $(strip $(distribute)) distribute := $(strip $(distribute))
generated := $(generated) stubs.h version-info.h generated := $(generated) stubs.h version-info.h

4
README
View File

@ -1,4 +1,4 @@
This directory contains the version 1.96 test release of the GNU C Library. This directory contains the version 1.101 test release of the GNU C Library.
Many bugs have been fixed since the last release. Many bugs have been fixed since the last release.
Some bugs surely remain. Some bugs surely remain.
@ -46,7 +46,7 @@ provides the Unix `crypt' function, plus some other entry points.
Because of the United States export restriction on DES implementations, Because of the United States export restriction on DES implementations,
we are distributing this code separately from the rest of the C we are distributing this code separately from the rest of the C
library. There is an extra distribution tar file just for crypt; it is library. There is an extra distribution tar file just for crypt; it is
called `glibc-1.96-crypt.tar.gz'. You can just unpack the crypt called `glibc-1.101-crypt.tar.gz'. You can just unpack the crypt
distribution along with the rest of the C library and build; you can distribution along with the rest of the C library and build; you can
also build the library without getting crypt. Users outside the USA also build the library without getting crypt. Users outside the USA
can get the crypt distribution via anonymous FTP from ftp.uni-c.dk can get the crypt distribution via anonymous FTP from ftp.uni-c.dk

View File

@ -35,6 +35,14 @@
This is defined by configure under --enable-libio. */ This is defined by configure under --enable-libio. */
#undef USE_IN_LIBIO #undef USE_IN_LIBIO
/* Define if using ELF and the assembler supports the `.previous'
directive. */
#undef HAVE_ASM_PREVIOUS_DIRECTIVE
/* Define if using ELF and the assembler supports the `.popsection'
directive. */
#undef HAVE_ASM_POPSECTION_DIRECTIVE
/* /*
*/ */

84
configure vendored
View File

@ -1604,14 +1604,66 @@ EOF
fi fi
if test $elf = yes; then
echo $ac_n "checking for .previous assembler directive""... $ac_c" 1>&6
echo "configure:1610: checking for .previous assembler directive" >&5
if eval "test \"`echo '$''{'libc_cv_asm_previous_directive'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.s <<EOF
.section foo_section
.previous
EOF
if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1618: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_asm_previous_directive=yes
else
libc_cv_asm_previous_directive=no
fi
rm -f conftest*
fi
echo "$ac_t""$libc_cv_asm_previous_directive" 1>&6
if test $libc_cv_asm_previous_directive = yes; then
cat >> confdefs.h <<\EOF
#define HAVE_ASM_PREVIOUS_DIRECTIVE 1
EOF
else
echo $ac_n "checking for .popsection assembler directive""... $ac_c" 1>&6
echo "configure:1634: checking for .popsection assembler directive" >&5
if eval "test \"`echo '$''{'libc_cv_asm_popsection_directive'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
cat > conftest.s <<EOF
.pushsection foo_section
.popsection
EOF
if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'; { (eval echo configure:1642: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_asm_popsection_directive=yes
else
libc_cv_asm_popsection_directive=no
fi
rm -f conftest*
fi
echo "$ac_t""$libc_cv_asm_popsection_directive" 1>&6
if test $libc_cv_asm_popsection_directive = yes; then
cat >> confdefs.h <<\EOF
#define HAVE_ASM_POPSECTION_DIRECTIVE 1
EOF
fi
fi
fi
if test $elf != yes; then if test $elf != yes; then
echo $ac_n "checking for .init and .fini sections""... $ac_c" 1>&6 echo $ac_n "checking for .init and .fini sections""... $ac_c" 1>&6
echo "configure:1610: checking for .init and .fini sections" >&5 echo "configure:1662: checking for .init and .fini sections" >&5
if eval "test \"`echo '$''{'libc_cv_have_initfini'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_have_initfini'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1615 "configure" #line 1667 "configure"
#include "confdefs.h" #include "confdefs.h"
int main() { int main() {
@ -1620,7 +1672,7 @@ asm (".section .init");
asm (".text"); asm (".text");
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1624: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then if { (eval echo configure:1676: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
rm -rf conftest* rm -rf conftest*
libc_cv_have_initfini=yes libc_cv_have_initfini=yes
else else
@ -1645,19 +1697,19 @@ if test $elf = yes; then
libc_cv_asm_underscores=no libc_cv_asm_underscores=no
else else
echo $ac_n "checking for _ prefix on C symbol names""... $ac_c" 1>&6 echo $ac_n "checking for _ prefix on C symbol names""... $ac_c" 1>&6
echo "configure:1649: checking for _ prefix on C symbol names" >&5 echo "configure:1701: checking for _ prefix on C symbol names" >&5
if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_asm_underscores'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1654 "configure" #line 1706 "configure"
#include "confdefs.h" #include "confdefs.h"
asm ("_glibc_foobar:"); asm ("_glibc_foobar:");
int main() { int main() {
glibc_foobar (); glibc_foobar ();
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1661: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:1713: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
libc_cv_asm_underscores=yes libc_cv_asm_underscores=yes
else else
@ -1684,7 +1736,7 @@ if test $elf = yes; then
libc_cv_asm_weakext_directive=no libc_cv_asm_weakext_directive=no
else else
echo $ac_n "checking for assembler .weak directive""... $ac_c" 1>&6 echo $ac_n "checking for assembler .weak directive""... $ac_c" 1>&6
echo "configure:1688: checking for assembler .weak directive" >&5 echo "configure:1740: checking for assembler .weak directive" >&5
if eval "test \"`echo '$''{'libc_cv_asm_weak_directive'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_asm_weak_directive'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1707,7 +1759,7 @@ echo "$ac_t""$libc_cv_asm_weak_directive" 1>&6
if test $libc_cv_asm_weak_directive = no; then if test $libc_cv_asm_weak_directive = no; then
echo $ac_n "checking for assembler .weakext directive""... $ac_c" 1>&6 echo $ac_n "checking for assembler .weakext directive""... $ac_c" 1>&6
echo "configure:1711: checking for assembler .weakext directive" >&5 echo "configure:1763: checking for assembler .weakext directive" >&5
if eval "test \"`echo '$''{'libc_cv_asm_weakext_directive'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_asm_weakext_directive'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1744,7 +1796,7 @@ EOF
fi fi
echo $ac_n "checking for ld --no-whole-archive""... $ac_c" 1>&6 echo $ac_n "checking for ld --no-whole-archive""... $ac_c" 1>&6
echo "configure:1748: checking for ld --no-whole-archive" >&5 echo "configure:1800: checking for ld --no-whole-archive" >&5
if eval "test \"`echo '$''{'libc_cv_ld_no_whole_archive'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_ld_no_whole_archive'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1755,7 +1807,7 @@ __throw () {}
EOF EOF
if { ac_try='${CC-cc} $CFLAGS if { ac_try='${CC-cc} $CFLAGS
-nostdlib -nostartfiles -Wl,--no-whole-archive -nostdlib -nostartfiles -Wl,--no-whole-archive
-o conftest conftest.c'; { (eval echo configure:1759: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then -o conftest conftest.c'; { (eval echo configure:1811: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_ld_no_whole_archive=yes libc_cv_ld_no_whole_archive=yes
else else
libc_cv_ld_no_whole_archive=no libc_cv_ld_no_whole_archive=no
@ -1766,7 +1818,7 @@ fi
echo "$ac_t""$libc_cv_ld_no_whole_archive" 1>&6 echo "$ac_t""$libc_cv_ld_no_whole_archive" 1>&6
echo $ac_n "checking for gcc -fno-exceptions""... $ac_c" 1>&6 echo $ac_n "checking for gcc -fno-exceptions""... $ac_c" 1>&6
echo "configure:1770: checking for gcc -fno-exceptions" >&5 echo "configure:1822: checking for gcc -fno-exceptions" >&5
if eval "test \"`echo '$''{'libc_cv_gcc_no_exceptions'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_gcc_no_exceptions'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1777,7 +1829,7 @@ __throw () {}
EOF EOF
if { ac_try='${CC-cc} $CFLAGS if { ac_try='${CC-cc} $CFLAGS
-nostdlib -nostartfiles -fno-exceptions -nostdlib -nostartfiles -fno-exceptions
-o conftest conftest.c'; { (eval echo configure:1781: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then -o conftest conftest.c'; { (eval echo configure:1833: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
libc_cv_gcc_no_exceptions=yes libc_cv_gcc_no_exceptions=yes
else else
libc_cv_gcc_no_exceptions=no libc_cv_gcc_no_exceptions=no
@ -1829,7 +1881,7 @@ if test "$uname" = generic; then
fi fi
echo $ac_n "checking OS release for uname""... $ac_c" 1>&6 echo $ac_n "checking OS release for uname""... $ac_c" 1>&6
echo "configure:1833: checking OS release for uname" >&5 echo "configure:1885: checking OS release for uname" >&5
if eval "test \"`echo '$''{'libc_cv_uname_release'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_uname_release'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1851,7 +1903,7 @@ echo "$ac_t""$libc_cv_uname_release" 1>&6
uname_release="$libc_cv_uname_release" uname_release="$libc_cv_uname_release"
echo $ac_n "checking OS version for uname""... $ac_c" 1>&6 echo $ac_n "checking OS version for uname""... $ac_c" 1>&6
echo "configure:1855: checking OS version for uname" >&5 echo "configure:1907: checking OS version for uname" >&5
if eval "test \"`echo '$''{'libc_cv_uname_version'+set}'`\" = set"; then if eval "test \"`echo '$''{'libc_cv_uname_version'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@ -1873,7 +1925,7 @@ else
fi fi
echo $ac_n "checking stdio selection""... $ac_c" 1>&6 echo $ac_n "checking stdio selection""... $ac_c" 1>&6
echo "configure:1877: checking stdio selection" >&5 echo "configure:1929: checking stdio selection" >&5
case $stdio in case $stdio in
libio) cat >> confdefs.h <<\EOF libio) cat >> confdefs.h <<\EOF
@ -1885,7 +1937,7 @@ esac
echo "$ac_t""$stdio" 1>&6 echo "$ac_t""$stdio" 1>&6
echo $ac_n "checking malloc selection""... $ac_c" 1>&6 echo $ac_n "checking malloc selection""... $ac_c" 1>&6
echo "configure:1889: checking malloc selection" >&5 echo "configure:1941: checking malloc selection" >&5
case $malloc in case $malloc in
new-malloc) USE_NEW_MALLOC=-DUSE_NEW_MALLOC ;; new-malloc) USE_NEW_MALLOC=-DUSE_NEW_MALLOC ;;

View File

@ -496,6 +496,40 @@ if test $libc_cv_asm_set_directive = yes; then
AC_DEFINE(HAVE_ASM_SET_DIRECTIVE) AC_DEFINE(HAVE_ASM_SET_DIRECTIVE)
fi fi
if test $elf = yes; then
AC_CACHE_CHECK(for .previous assembler directive,
libc_cv_asm_previous_directive, [dnl
cat > conftest.s <<EOF
.section foo_section
.previous
EOF
if AC_TRY_COMMAND(${CC-cc} -c $CFLAGS conftest.s 1>&AC_FD_CC); then
libc_cv_asm_previous_directive=yes
else
libc_cv_asm_previous_directive=no
fi
rm -f conftest*])
if test $libc_cv_asm_previous_directive = yes; then
AC_DEFINE(HAVE_ASM_PREVIOUS_DIRECTIVE)
else
AC_CACHE_CHECK(for .popsection assembler directive,
libc_cv_asm_popsection_directive, [dnl
cat > conftest.s <<EOF
.pushsection foo_section
.popsection
EOF
if AC_TRY_COMMAND(${CC-cc} -c $CFLAGS conftest.s 1>&AC_FD_CC); then
libc_cv_asm_popsection_directive=yes
else
libc_cv_asm_popsection_directive=no
fi
rm -f conftest*])
if test $libc_cv_asm_popsection_directive = yes; then
AC_DEFINE(HAVE_ASM_POPSECTION_DIRECTIVE)
fi
fi
fi
if test $elf != yes; then if test $elf != yes; then
AC_CACHE_CHECK(for .init and .fini sections, libc_cv_have_initfini, AC_CACHE_CHECK(for .init and .fini sections, libc_cv_have_initfini,
[AC_TRY_COMPILE(, [asm (".section .init"); [AC_TRY_COMPILE(, [asm (".section .init");

View File

@ -41,6 +41,8 @@ extra-libs = libdl
extra-libs-others = $(extra-libs) extra-libs-others = $(extra-libs)
libdl-routines := dlopen dlclose dlsym dlerror dladdr libdl-routines := dlopen dlclose dlsym dlerror dladdr
before-compile = $(objpfx)trusted-dirs.h
all: # Make this the default target; it will be defined in Rules. all: # Make this the default target; it will be defined in Rules.
@ -92,6 +94,17 @@ $(objpfx)$(rtld-installed-name): $(objpfx)ld.so
ln -s $(<F) $@ ln -s $(<F) $@
endif endif
# Build a file mentioning all trustworthy directories to look for shared
# libraries when using LD_LIBRARY_PATH in a setuid program. The user can
# add directories to the list by defining $(user-defined-trusted-dirs)
# before starting make.
$(objpfx)trusted-dirs.h: Makefile
(for dir in `echo "$(default-rpath) $(user-defined-trusted-dirs)" | \
sed 's/:/ /g'`; do \
echo " \"$$dir\","; \
done;) > $@T
mv -f $@T $@
CFLAGS-dl-load.c = -I$(objdir)/$(subdir)
# Specify the dependencies of libdl.so; its commands come from the generic # Specify the dependencies of libdl.so; its commands come from the generic
# rule to build a shared library. # rule to build a shared library.

View File

@ -37,6 +37,11 @@ struct catch
this is null. */ this is null. */
static struct catch *catch; static struct catch *catch;
/* This points to a function which is called when an error is
received. Unlike the handling of `catch' this function may return.
The arguments will be the `errstring' and `objname'. */
static receiver_fct receiver;
void void
_dl_signal_error (int errcode, _dl_signal_error (int errcode,
@ -58,6 +63,13 @@ _dl_signal_error (int errcode,
catch->objname = objname; catch->objname = objname;
longjmp (catch->env, errcode ?: -1); longjmp (catch->env, errcode ?: -1);
} }
else if (receiver)
{
/* We are inside _dl_receive_error. Call the user supplied
handler and resume the work. The receiver will still
installed. */
(*receiver) (errstring, objname);
}
else else
{ {
/* Lossage while resolving the program's own symbols is always fatal. */ /* Lossage while resolving the program's own symbols is always fatal. */
@ -77,6 +89,8 @@ _dl_catch_error (char **errstring,
{ {
int errcode; int errcode;
struct catch *old, c = { errstring: NULL, objname: NULL }; struct catch *old, c = { errstring: NULL, objname: NULL };
/* We need not handle `receiver' since setting a `catch' is handle
before it. */
old = catch; old = catch;
errcode = setjmp (c.env); errcode = setjmp (c.env);
@ -96,3 +110,22 @@ _dl_catch_error (char **errstring,
*objname = c.objname; *objname = c.objname;
return errcode == -1 ? 0 : errcode; return errcode == -1 ? 0 : errcode;
} }
void
_dl_receive_error (receiver_fct fct, void (*operate) (void))
{
struct catch *old_catch;
receiver_fct old_receiver;
old_catch = catch;
old_receiver = receiver;
/* Set the new values. */
catch = NULL;
receiver = fct;
(*operate) ();
catch = old_catch;
receiver = old_receiver;
}

View File

@ -1,5 +1,5 @@
/* _dl_map_object -- Map in a shared object's segments from the file. /* _dl_map_object -- Map in a shared object's segments from the file.
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
@ -409,7 +409,8 @@ _dl_map_object_from_fd (char *name, int fd, char *realname,
static int static int
open_path (const char *name, size_t namelen, open_path (const char *name, size_t namelen,
const char *dirpath, const char *dirpath,
char **realname) char **realname,
const char *trusted_dirs[])
{ {
char *buf; char *buf;
const char *p; const char *p;
@ -426,13 +427,42 @@ open_path (const char *name, size_t namelen,
do do
{ {
size_t buflen; size_t buflen;
size_t this_len;
dirpath = p; dirpath = p;
p = strpbrk (dirpath, ":;"); p = strpbrk (dirpath, ":;");
if (p == NULL) if (p == NULL)
p = strchr (dirpath, '\0'); p = strchr (dirpath, '\0');
if (p == dirpath) this_len = p - dirpath;
/* When we run a setuid program we do not accept any directory. */
if (__libc_enable_secure)
{
/* All trusted directory must be complete name. */
if (dirpath[0] != '/')
continue;
/* If we got a list of trusted directories only accept one
of these. */
if (trusted_dirs != NULL)
{
const char **trust = trusted_dirs;
while (*trust != NULL)
if (memcmp (dirpath, *trust, this_len) == 0
&& (*trust)[this_len] == '\0')
break;
else
++trust;
/* If directory is not trusted, ignore this directory. */
if (*trust == NULL)
continue;
}
}
if (this_len == 0)
{ {
/* Two adjacent colons, or a colon at the beginning or the end of /* Two adjacent colons, or a colon at the beginning or the end of
the path means to search the current directory. */ the path means to search the current directory. */
@ -442,10 +472,10 @@ open_path (const char *name, size_t namelen,
else else
{ {
/* Construct the pathname to try. */ /* Construct the pathname to try. */
(void) memcpy (buf, dirpath, p - dirpath); (void) memcpy (buf, dirpath, this_len);
buf[p - dirpath] = '/'; buf[this_len] = '/';
(void) memcpy (&buf[(p - dirpath) + 1], name, namelen); (void) memcpy (&buf[this_len + 1], name, namelen);
buflen = p - dirpath + 1 + namelen; buflen = this_len + 1 + namelen;
} }
fd = __open (buf, O_RDONLY); fd = __open (buf, O_RDONLY);
@ -508,9 +538,9 @@ _dl_map_object (struct link_map *loader, const char *name, int type,
size_t namelen = strlen (name) + 1; size_t namelen = strlen (name) + 1;
inline void trypath (const char *dirpath) inline void trypath (const char *dirpath, const char *trusted[])
{ {
fd = open_path (name, namelen, dirpath, &realname); fd = open_path (name, namelen, dirpath, &realname, trusted);
} }
fd = -1; fd = -1;
@ -521,16 +551,24 @@ _dl_map_object (struct link_map *loader, const char *name, int type,
if (l && l->l_info[DT_RPATH]) if (l && l->l_info[DT_RPATH])
trypath ((const char *) (l->l_addr + trypath ((const char *) (l->l_addr +
l->l_info[DT_STRTAB]->d_un.d_ptr + l->l_info[DT_STRTAB]->d_un.d_ptr +
l->l_info[DT_RPATH]->d_un.d_val)); l->l_info[DT_RPATH]->d_un.d_val), NULL);
/* If dynamically linked, try the DT_RPATH of the executable itself. */ /* If dynamically linked, try the DT_RPATH of the executable itself. */
l = _dl_loaded; l = _dl_loaded;
if (fd == -1 && l && l->l_type != lt_loaded && l->l_info[DT_RPATH]) if (fd == -1 && l && l->l_type != lt_loaded && l->l_info[DT_RPATH])
trypath ((const char *) (l->l_addr + trypath ((const char *) (l->l_addr +
l->l_info[DT_STRTAB]->d_un.d_ptr + l->l_info[DT_STRTAB]->d_un.d_ptr +
l->l_info[DT_RPATH]->d_un.d_val)); l->l_info[DT_RPATH]->d_un.d_val), NULL);
/* Try an environment variable (unless setuid). */ /* Try an environment variable (unless setuid). */
if (fd == -1 && ! __libc_enable_secure) if (fd == -1 && ! __libc_enable_secure)
trypath (getenv ("LD_LIBRARY_PATH")); {
static const char *trusted_dirs[] =
{
#include "trusted-dirs.h"
NULL
};
trypath (getenv ("LD_LIBRARY_PATH"), trusted_dirs);
}
if (fd == -1) if (fd == -1)
{ {
/* Check the list of libraries in the file /etc/ld.so.cache, /* Check the list of libraries in the file /etc/ld.so.cache,
@ -555,7 +593,7 @@ _dl_map_object (struct link_map *loader, const char *name, int type,
if (fd == -1) if (fd == -1)
{ {
extern const char *_dl_rpath; /* Set in rtld.c. */ extern const char *_dl_rpath; /* Set in rtld.c. */
trypath (_dl_rpath); trypath (_dl_rpath, NULL);
} }
} }
else else
@ -590,6 +628,7 @@ _dl_map_object (struct link_map *loader, const char *name, int type,
are only interested in the list of libraries this isn't are only interested in the list of libraries this isn't
so severe. Fake an entry with all the information we so severe. Fake an entry with all the information we
have (in fact only the name). */ have (in fact only the name). */
static const ElfW(Symndx) dummy_bucket = STN_UNDEF;
/* Enter the new object in the list of loaded objects. */ /* Enter the new object in the list of loaded objects. */
if ((name_copy = local_strdup (name)) == NULL if ((name_copy = local_strdup (name)) == NULL
@ -599,6 +638,11 @@ _dl_map_object (struct link_map *loader, const char *name, int type,
/* We use an opencount of 0 as a sign for the faked entry. */ /* We use an opencount of 0 as a sign for the faked entry. */
l->l_opencount = 0; l->l_opencount = 0;
l->l_reserved = 0; l->l_reserved = 0;
l->l_buckets = &dummy_bucket;
l->l_nbuckets = 1;
l->l_relocated = 1;
return l;
} }
else else
_dl_signal_error (errno, name, "cannot open shared object file"); _dl_signal_error (errno, name, "cannot open shared object file");

View File

@ -29,23 +29,39 @@ TEXTDOMAIN=libc
TEXTDOMAINDIR=@TEXTDOMAINDIR@ TEXTDOMAINDIR=@TEXTDOMAINDIR@
RTLD=@RTLD@ RTLD=@RTLD@
RELOCS=
while test $# -gt 0; do while test $# -gt 0; do
case "$1" in case "$1" in
--v*) --v | --ve | --ver | --vers | --versi | --versio | --version)
echo $"ldd (GNU libc) @VERSION@ echo $"ldd (GNU libc) @VERSION@
Copyright (C) 1996, 1997 Free Software Foundation, Inc. Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
exit 0 ;; exit 0 ;;
--h*) --h | --he | --hel | --help)
echo $"ldd [OPTION]... FILE... echo $"ldd [OPTION]... FILE...
--help print this help and exit --help print this help and exit
--version print version information and exit --version print version information and exit
-d, --data-relocs process data relocations
-r, --function-relocs process data and function relocations
Report bugs using the \`glibcbug' script to <bugs@gnu.ai.mit.edu>." Report bugs using the \`glibcbug' script to <bugs@gnu.ai.mit.edu>."
exit 0 ;; exit 0 ;;
-d | --d | --da | --dat | --data | --data- | --data-r | --data-re | \
--data-rel | --data-relo | --data-reloc | --data-relocs)
RELOCS='--data-relocs'
shift ;;
-r | --f | --fu | --fun | --func | --funct | --functi | --functio | \
--function | --function- | --function-r | --function-re | --function-rel | \
--function-relo | --function-reloc | --function-relocs)
RELOCS='--function-relocs'
shift ;;
--) # Stop option processing. --) # Stop option processing.
shift; break ;; shift; break ;;
-*)
echo >&2 $"ldd: unrecognized option" "\`$1'"
echo >&2 $"Try \`ldd --help' for more information."
exit 1 ;;
*) *)
break ;; break ;;
esac esac
@ -53,9 +69,8 @@ done
case $# in case $# in
0) 0)
echo >&2 $"\ echo >&2 $"ldd: missing file arguments"
ldd: missing file arguments echo >&2 $"Try \`ldd --help' for more information."
Try \`ldd --help' for more information."
exit 1 ;; exit 1 ;;
1) 1)
# We don't list the file name when there is only one. # We don't list the file name when there is only one.
@ -65,14 +80,21 @@ Try \`ldd --help' for more information."
esac esac
if test ! -f "$file"; then if test ! -f "$file"; then
echo "${file}:" $"no such file" echo "${file}:" $"no such file"
elif ${RTLD} --verify "$file"; then exit 1
LD_TRACE_LOADED_OBJECTS=1 exec ${RTLD} "$file" && exit 1
else else
echo $" not a dynamic executable" test -x "$file" ||
echo $"warning: you do not have execution permission for" "\`$file'"
if ${RTLD} --verify "$file"; then
LD_TRACE_LOADED_OBJECTS=1 exec ${RTLD} ${RELOCS} "$file" || exit 1
else
echo $" not a dynamic executable"
exit 1
fi
fi fi
exit ;; exit ;;
*) *)
set -e # Bail out immediately if ${RTLD} loses on any argument. set -e # Bail out immediately if ${RTLD} loses on any argument.
result=0
for file; do for file; do
echo "${file}:" echo "${file}:"
case "$file" in case "$file" in
@ -80,16 +102,22 @@ Try \`ldd --help' for more information."
*) file="./$file" ;; *) file="./$file" ;;
esac esac
if test ! -f "$file"; then if test ! -f "$file"; then
echo "$file:" $"no such file" echo "${file}:" $"no such file"
elif ${RTLD} --verify "$file"; then result=1
LD_TRACE_LOADED_OBJECTS=1 ${RTLD} "$file"
else else
echo $" not a dynamic executable" test -x "$file" ||
echo $"warning: you do not have execution permission for" "\`$file'"
if ${RTLD} --verify "$file"; then
LD_TRACE_LOADED_OBJECTS=1 ${RTLD} ${RELOCS} "$file" || result=1
else
echo $" not a dynamic executable"
result=1
fi
fi fi
done done
esac esac
exit 0 exit $result
# Local Variables: # Local Variables:
# mode:ksh # mode:ksh
# End: # End:

View File

@ -25,23 +25,40 @@
# variable LD_TRACE_LOADED_OBJECTS to a non-empty value. # variable LD_TRACE_LOADED_OBJECTS to a non-empty value.
RTLD=@RTLD@ RTLD=@RTLD@
RELOCS=
while test $# -gt 0; do while test $# -gt 0; do
case "$1" in case "$1" in
--v*) --v | --ve | --ver | --vers | --versi | --versio | --version)
echo 'ldd (GNU libc) @VERSION@ echo 'ldd (GNU libc) @VERSION@
Copyright (C) 1996, 1997 Free Software Foundation, Inc. Copyright (C) 1996, 1997 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.' warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.'
exit 0 ;; exit 0 ;;
--h*) --h | --he | --hel | --help)
echo "ldd [OPTION]... FILE... echo "ldd [OPTION]... FILE...
--help print this help and exit --help print this help and exit
--version print version information and exit --version print version information and exit
-d, --data-relocs process data relocations
-r, --function-relocs process data and function relocations
Report bugs using the \`glibcbug' script to <bugs@gnu.ai.mit.edu>." Report bugs using the \`glibcbug' script to <bugs@gnu.ai.mit.edu>."
exit 0 ;; exit 0 ;;
-d | --d | --da | --dat | --data | --data- | --data-r | --data-re | \
--data-rel | --data-relo | --data-reloc | --data-relocs)
RELOCS='--data-relocs'
shift ;;
-r | --f | --fu | --fun | --func | --funct | --functi | --functio | \
--function | --function- | --function-r | --function-re | --function-rel | \
--function-relo | --function-reloc | --function-relocs)
RELOCS='--function-relocs'
shift ;;
--) # Stop option processing. --) # Stop option processing.
shift; break ;; shift; break ;;
-*)
echo >&2 "\
ldd: unrecognized option \`$1'
Try \`ldd --help' for more information."
exit 1 ;;
*) *)
break ;; break ;;
esac esac
@ -61,14 +78,21 @@ Try \`ldd --help' for more information."
esac esac
if test ! -f "$file"; then if test ! -f "$file"; then
echo "${file}: no such file" echo "${file}: no such file"
elif ${RTLD} --verify "$file"; then exit 1
LD_TRACE_LOADED_OBJECTS=1 exec ${RTLD} "$file" && exit 1
else else
echo ' not a dynamic executable' test -x "$file" ||
echo "warning: you do not have execution permission for \`$file'"
if ${RTLD} --verify "$file"; then
LD_TRACE_LOADED_OBJECTS=1 exec ${RTLD} ${RELOCS} "$file" || exit 1
else
echo ' not a dynamic executable'
exit 1
fi
fi fi
exit ;; exit ;;
*) *)
set -e # Bail out immediately if ${RTLD} loses on any argument. set -e # Bail out immediately if ${RTLD} loses on any argument.
result=0
for file; do for file; do
echo "${file}:" echo "${file}:"
case "$file" in case "$file" in
@ -76,13 +100,19 @@ Try \`ldd --help' for more information."
*) file="./$file" ;; *) file="./$file" ;;
esac esac
if test ! -f "$file"; then if test ! -f "$file"; then
echo "$file: no such file" echo "${file}: no such file"
elif ${RTLD} --verify "$file"; then result=1
LD_TRACE_LOADED_OBJECTS=1 ${RTLD} "$file"
else else
echo ' not a dynamic executable' test -x "$file" ||
echo "warning: you do not have execution permission for \`$file'"
if ${RTLD} --verify "$file"; then
LD_TRACE_LOADED_OBJECTS=1 ${RTLD} ${RELOCS} "$file" || result=1
else
echo ' not a dynamic executable'
result=1
fi
fi fi
done done
esac esac
exit 0 exit $result

View File

@ -137,6 +137,12 @@ struct link_map
unsigned int l_global:1; /* Nonzero if object in _dl_global_scope. */ unsigned int l_global:1; /* Nonzero if object in _dl_global_scope. */
unsigned int l_reserved:2; /* Reserved for internal use. */ unsigned int l_reserved:2; /* Reserved for internal use. */
}; };
/* Function used as argument for `_dl_receive_error' function. The
arguments are the error string and the objname the error occurred
in. */
typedef void (*receiver_fct) (const char *, const char *);
/* Internal functions of the run-time dynamic linker. /* Internal functions of the run-time dynamic linker.
These can be accessed if you link again the dynamic linker These can be accessed if you link again the dynamic linker
@ -161,6 +167,11 @@ extern int _dl_sysdep_open_zero_fill (void); /* dl-sysdep.c */
are concatenated to form the message to print. */ are concatenated to form the message to print. */
extern void _dl_sysdep_message (const char *string, ...); extern void _dl_sysdep_message (const char *string, ...);
/* OS-dependent function to write a message on the standard error.
All arguments are `const char *'; args until a null pointer
are concatenated to form the message to print. */
extern void _dl_sysdep_error (const char *string, ...);
/* OS-dependent function to give a fatal error message and exit /* OS-dependent function to give a fatal error message and exit
when the dynamic linker fails before the program is fully linked. when the dynamic linker fails before the program is fully linked.
All arguments are `const char *'; args until a null pointer All arguments are `const char *'; args until a null pointer
@ -177,11 +188,9 @@ extern int _dl_secure;
zero; OBJECT is the name of the problematical shared object, or null if zero; OBJECT is the name of the problematical shared object, or null if
it is a general problem; ERRSTRING is a string describing the specific it is a general problem; ERRSTRING is a string describing the specific
problem. */ problem. */
extern void _dl_signal_error (int errcode, extern void _dl_signal_error (int errcode,
const char *object, const char *object,
const char *errstring) const char *errstring);
__attribute__ ((__noreturn__));
/* Call OPERATE, catching errors from `dl_signal_error'. If there is no /* Call OPERATE, catching errors from `dl_signal_error'. If there is no
error, *ERRSTRING is set to null. If there is an error, *ERRSTRING and error, *ERRSTRING is set to null. If there is an error, *ERRSTRING and
@ -192,6 +201,11 @@ extern int _dl_catch_error (char **errstring,
const char **object, const char **object,
void (*operate) (void)); void (*operate) (void));
/* Call OPERATE, receiving errors from `dl_signal_error'. Unlike
`_dl_catch_error' the operation is resumed after the OPERATE
function returns. */
extern void _dl_receive_error (receiver_fct fct, void (*operate) (void));
/* Helper function for <dlfcn.h> functions. Runs the OPERATE function via /* Helper function for <dlfcn.h> functions. Runs the OPERATE function via
_dl_catch_error. Returns zero for success, nonzero for failure; and _dl_catch_error. Returns zero for success, nonzero for failure; and

View File

@ -44,6 +44,10 @@ extern void *_dl_sysdep_read_whole_file (const char *filename,
size_t *filesize_ptr, size_t *filesize_ptr,
int mmap_prot); int mmap_prot);
/* Helper function to handle errors while resolving symbols. */
static void print_unresolved (const char *errstring, const char *objname);
int _dl_argc; int _dl_argc;
char **_dl_argv; char **_dl_argv;
const char *_dl_rpath; const char *_dl_rpath;
@ -142,11 +146,19 @@ dl_main (const ElfW(Phdr) *phdr,
enum { normal, list, verify, trace } mode; enum { normal, list, verify, trace } mode;
struct link_map **preloads; struct link_map **preloads;
unsigned int npreloads; unsigned int npreloads;
const char *preloadlist;
size_t file_size; size_t file_size;
char *file; char *file;
mode = getenv ("LD_TRACE_LOADED_OBJECTS") != NULL ? trace : normal; mode = getenv ("LD_TRACE_LOADED_OBJECTS") != NULL ? trace : normal;
/* LAZY is determined by the parameters --datadeps and --function-deps
if we trace the binary. */
if (mode == trace)
lazy = -1;
else
lazy = !__libc_enable_secure && *(getenv ("LD_BIND_NOW") ?: "") == '\0';
/* Set up a flag which tells we are just starting. */ /* Set up a flag which tells we are just starting. */
_dl_starting_up = 1; _dl_starting_up = 1;
@ -186,22 +198,44 @@ of this helper program; chances are you did not intend to run this program.\n",
/* Note the place where the dynamic linker actually came from. */ /* Note the place where the dynamic linker actually came from. */
_dl_rtld_map.l_name = _dl_argv[0]; _dl_rtld_map.l_name = _dl_argv[0];
if (! strcmp (_dl_argv[1], "--list")) while (_dl_argc > 1)
{ if (! strcmp (_dl_argv[1], "--list"))
mode = list; {
mode = list;
lazy = -1; /* This means do no dependency analysis. */
++_dl_skip_args; ++_dl_skip_args;
--_dl_argc; --_dl_argc;
++_dl_argv; ++_dl_argv;
} }
else if (! strcmp (_dl_argv[1], "--verify")) else if (! strcmp (_dl_argv[1], "--verify"))
{ {
mode = verify; mode = verify;
++_dl_skip_args; ++_dl_skip_args;
--_dl_argc; --_dl_argc;
++_dl_argv; ++_dl_argv;
} }
else if (! strcmp (_dl_argv[1], "--data-relocs"))
{
mode = trace;
lazy = 1; /* This means do only data relocation analysis. */
++_dl_skip_args;
--_dl_argc;
++_dl_argv;
}
else if (! strcmp (_dl_argv[1], "--function-relocs"))
{
mode = trace;
lazy = 0; /* This means do also function relocation analysis. */
++_dl_skip_args;
--_dl_argc;
++_dl_argv;
}
else
break;
++_dl_skip_args; ++_dl_skip_args;
--_dl_argc; --_dl_argc;
@ -311,23 +345,22 @@ of this helper program; chances are you did not intend to run this program.\n",
preloads = NULL; preloads = NULL;
npreloads = 0; npreloads = 0;
if (! __libc_enable_secure) preloadlist = getenv ("LD_PRELOAD");
if (preloadlist)
{ {
const char *preloadlist = getenv ("LD_PRELOAD"); /* The LD_PRELOAD environment variable gives a white space
if (preloadlist) separated list of libraries that are loaded before the
{ executable's dependencies and prepended to the global scope
/* The LD_PRELOAD environment variable gives a white space list. If the binary is running setuid all elements
separated list of libraries that are loaded before the containing a '/' are ignored since it is insecure. */
executable's dependencies and prepended to the global char *list = strdupa (preloadlist);
scope list. */ char *p;
char *list = strdupa (preloadlist); while ((p = strsep (&list, " ")) != NULL)
char *p; if (! __libc_enable_secure || strchr (p, '/') == NULL)
while ((p = strsep (&list, " ")) != NULL) {
{ (void) _dl_map_object (NULL, p, lt_library, 0);
(void) _dl_map_object (NULL, p, lt_library, 0); ++npreloads;
++npreloads; }
}
}
} }
/* Read the contents of the file. */ /* Read the contents of the file. */
@ -496,12 +529,31 @@ of this helper program; chances are you did not intend to run this program.\n",
*--bp = '0'; *--bp = '0';
_dl_sysdep_message (" in object at 0x", bp, "\n", NULL); _dl_sysdep_message (" in object at 0x", bp, "\n", NULL);
} }
else if (lazy >= 0)
{
/* We have to do symbol dependency testing. */
void doit (void)
{
_dl_relocate_object (l, _dl_object_relocation_scope (l), lazy);
}
l = _dl_loaded;
while (l->l_next)
l = l->l_next;
do
{
if (l != &_dl_rtld_map && l->l_opencount > 0)
{
_dl_receive_error (print_unresolved, doit);
*_dl_global_scope_end = NULL;
}
l = l->l_prev;
} while (l);
}
_exit (0); _exit (0);
} }
lazy = !__libc_enable_secure && *(getenv ("LD_BIND_NOW") ?: "") == '\0';
{ {
/* Now we have all the objects loaded. Relocate them all except for /* Now we have all the objects loaded. Relocate them all except for
the dynamic linker itself. We do this in reverse order so that copy the dynamic linker itself. We do this in reverse order so that copy
@ -573,3 +625,11 @@ of this helper program; chances are you did not intend to run this program.\n",
/* Once we return, _dl_sysdep_start will invoke /* Once we return, _dl_sysdep_start will invoke
the DT_INIT functions and then *USER_ENTRY. */ the DT_INIT functions and then *USER_ENTRY. */
} }
/* This is a little helper function for resolving symbols while
tracing the binary. */
static void
print_unresolved (const char *errstring, const char *objname)
{
_dl_sysdep_error (errstring, " (", objname, ")\n", NULL);
}

View File

@ -224,8 +224,20 @@ extern const char _libc_intl_domainname[];
warning message MSG. */ warning message MSG. */
#ifdef HAVE_GNU_LD #ifdef HAVE_GNU_LD
#ifdef HAVE_ELF #ifdef HAVE_ELF
/* We want the .gnu.warning.SYMBOL section to be unallocated. */
#ifdef HAVE_ASM_PREVIOUS_DIRECTIVE
#define __make_section_unallocated(section_string) \
asm(".section " section_string "; .previous");
#elif defined (HAVE_ASM_POPSECTION_DIRECTIVE)
#define __make_section_unallocated(section_string) \
asm(".pushsection " section_string "; .popsection");
#else
#define __make_section_unallocated(section_string)
#endif
#define link_warning(symbol, msg) \ #define link_warning(symbol, msg) \
asm(".section .gnu.warning." #symbol "; .previous"); \ __make_section_unallocated (".gnu.warning." #symbol) \
static const char __evoke_link_warning_##symbol[] \ static const char __evoke_link_warning_##symbol[] \
__attribute__ ((section (".gnu.warning." #symbol))) = msg; __attribute__ ((section (".gnu.warning." #symbol))) = msg;
#else #else

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
@ -32,7 +32,7 @@ routines := \
\ \
clearerr feof ferror fgetc fileno fputc freopen fseek getc getchar \ clearerr feof ferror fgetc fileno fputc freopen fseek getc getchar \
memstream pclose putc putchar rewind setbuf setlinebuf vasprintf \ memstream pclose putc putchar rewind setbuf setlinebuf vasprintf \
vdprintf vscanf vsnprintf obprintf fcloseall \ iovdprintf vscanf vsnprintf obprintf fcloseall \
\ \
libc_fatal libc_fatal

View File

@ -1,4 +1,4 @@
# Copyright (C) 1991, 92, 93, 94, 95, 96 Free Software Foundation, Inc. # Copyright (C) 1991, 92, 93, 94, 95, 96, 97 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
@ -27,7 +27,7 @@ dist-headers := malloc.h
headers := $(dist-headers) obstack.h headers := $(dist-headers) obstack.h
tests := mallocbug tests := mallocbug
distribute = thread-m.h mtrace.awk distribute = thread-m.h mtrace.awk mcheck-init.c mcheck.h
# Things which get pasted together into gmalloc.c. # Things which get pasted together into gmalloc.c.
gmalloc-routines := malloc morecore gmalloc-routines := malloc morecore

View File

@ -336,7 +336,7 @@ value. Use @code{readdir_r} when this is critical.
@comment dirent.h @comment dirent.h
@comment GNU @comment GNU
@deftypefun int readdir_r (DIR *@var{dirstream}, struct *@var{entry}, struct **@var{result}) @deftypefun int readdir_r (DIR *@var{dirstream}, struct *@var{entry}, struct **@var{result})
This function is the reentrant version of @code{reentrant}. Like This function is the reentrant version of @code{readdir}. Like
@code{readdir} it returns the next entry from the directory. But to @code{readdir} it returns the next entry from the directory. But to
prevent conflicts for simultaneously running threads the result is not prevent conflicts for simultaneously running threads the result is not
stored in some internal memory. Instead the argument @var{entry} has to stored in some internal memory. Instead the argument @var{entry} has to

View File

@ -1,4 +1,4 @@
# 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
@ -24,7 +24,7 @@ subdir := nss
headers := nss.h headers := nss.h
distribute := nsswitch.h XXX-lookup.c getXXbyYY.c getXXbyYY_r.c \ distribute := nsswitch.h XXX-lookup.c getXXbyYY.c getXXbyYY_r.c \
getXXent.c getXXent_r.c databases.def \ getXXent.c getXXent_r.c databases.def \
nsswitch.conf db-Makefile nsswitch.conf db-Makefile digits_dots.c
# This is the trivial part which goes into libc itself. # This is the trivial part which goes into libc itself.
routines = nsswitch $(addsuffix -lookup,$(databases)) routines = nsswitch $(addsuffix -lookup,$(databases))

View File

@ -1,4 +1,4 @@
# Copyright (C) 1994, 1995, 1996 Free Software Foundation, Inc. # Copyright (C) 1994, 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
@ -33,7 +33,7 @@ libresolv-routines := gethnamaddr res_comp res_debug \
res_data res_mkquery res_query res_send \ res_data res_mkquery res_query res_send \
inet_net_ntop inet_net_pton inet_neta base64 inet_net_ntop inet_net_pton inet_neta base64
subdirs-dirs = nss_dns subdir-dirs = nss_dns
vpath %.c nss_dns vpath %.c nss_dns
libnss_dns-routines := dns-host dns-network libnss_dns-routines := dns-host dns-network

View File

@ -1,21 +1,21 @@
/* Operating system support for run-time dynamic linker. Generic Unix version. /* Operating system support for run-time dynamic linker. Generic Unix version.
Copyright (C) 1995, 96 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
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 <elf.h> #include <elf.h>
#include <sys/types.h> #include <sys/types.h>
@ -192,6 +192,22 @@ _dl_sysdep_fatal (const char *msg, ...)
} }
void
_dl_sysdep_error (const char *msg, ...)
{
va_list ap;
va_start (ap, msg);
do
{
size_t len = strlen (msg);
__write (STDERR_FILENO, msg, len);
msg = va_arg (ap, const char *);
} while (msg);
va_end (ap);
}
void void
_dl_sysdep_message (const char *msg, ...) _dl_sysdep_message (const char *msg, ...)
{ {

View File

@ -1,5 +1,5 @@
/* Definition of `struct sockaddr_*' common members. Generic/4.2 BSD version. /* Definition of `struct sockaddr_*' common members. Generic/4.2 BSD version.
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
@ -21,12 +21,15 @@
#define _SOCKADDRCOM_H 1 #define _SOCKADDRCOM_H 1
/* POSIX.1g specifies this type name for the `sa_family' member. */
typedef unsigned short int sa_family_t;
/* This macro is used to declare the initial common members /* This macro is used to declare the initial common members
of the data types used for socket addresses, `struct sockaddr', of the data types used for socket addresses, `struct sockaddr',
`struct sockaddr_in', `struct sockaddr_un', etc. */ `struct sockaddr_in', `struct sockaddr_un', etc. */
#define __SOCKADDR_COMMON(sa_prefix) \ #define __SOCKADDR_COMMON(sa_prefix) \
unsigned short int sa_prefix##family sa_family_t sa_prefix##family
#define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int)) #define __SOCKADDR_COMMON_SIZE (sizeof (unsigned short int))

View File

@ -1,5 +1,5 @@
/* Operating system support for run-time dynamic linker. Hurd version. /* Operating system support for run-time dynamic linker. Hurd version.
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
@ -238,6 +238,29 @@ _dl_sysdep_fatal (const char *msg, ...)
} }
void
_dl_sysdep_error (const char *msg, ...)
{
va_list ap;
va_start (ap, msg);
do
{
size_t len = strlen (msg);
mach_msg_type_number_t nwrote;
do
{
if (__io_write (_hurd_init_dtable[2], msg, len, -1, &nwrote))
break;
len -= nwrote;
msg += nwrote;
} while (nwrote > 0);
msg = va_arg (ap, const char *);
} while (msg);
va_end (ap);
}
void void
_dl_sysdep_message (const char *msg, ...) _dl_sysdep_message (const char *msg, ...)
{ {

View File

@ -0,0 +1,86 @@
/* FPU control word bits. SPARC version.
Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Miguel de Icaza
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
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
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 not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _FPU_CONTROL_H
#define _FPU_CONTROL_H 1
#include <features.h>
/* precision control */
#define _FPU_EXTENDED 0x00000000 /* RECOMMENDED */
#define _FPU_DOUBLE 0x20000000
#define _FPU_80BIT 0x30000000
#define _FPU_SINGLE 0x10000000 /* DO NOT USE */
/* rounding control / Sparc */
#define _FPU_RC_NEAREST 0x0 /* RECOMMENDED */
#define _FPU_RC_DOWN 0x80000000
#define _FPU_RC_UP 0xc0000000
#define _FPU_RC_ZERO 0x40000000
#define _FPU_RESERVED 0x300000 /* Reserved bits in cw */
/* Now two recommended cw */
/* Linux default:
- extended precision
- rounding to nearest
- exceptions on overflow, zero divide and NaN */
#define _FPU_DEFAULT 0x1f
/* IEEE: same as above, but exceptions */
#define _FPU_IEEE 0x0
/* private namespace. It should only be used by crt0.o. */
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. */
typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__HI__)));
#define _FPU_GETCW(cw) __asm__ ("st %%fsr,%0" : "=m" (*&cw))
#define _FPU_SETCW(cw) __asm__ ("ld %0,%%fsr" : "=m" (*&cw))
#if 0
/* The intel original macros */
/* Macros for accessing the hardware control word. */
#define _FPU_GETCW(cw) __asm__ ("fnstcw %0" : "=m" (*&cw))
#define _FPU_SETCW(cw) __asm__ ("fldcw %0" : : "m" (*&cw))
#endif
/* Default control word set at startup. */
extern fpu_control_t __fpu_control;
__BEGIN_DECLS
/* Called at startup. It can be used to manipulate fpu control register. */
extern void __setfpucw __P ((fpu_control_t));
__END_DECLS
#endif /* fpu_control.h */

View File

@ -0,0 +1,42 @@
/* Copyright (C) 1991, 1992, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
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 not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <signal.h>
/* Set the handler for the signal SIG to HANDLER,
returning the old handler, or SIG_ERR on error. */
__sighandler_t
__sysv_signal (sig, handler)
int sig;
__sighandler_t handler;
{
/* Check signal extents to protect __sigismember. */
if (handler == SIG_ERR || sig < 1 || sig >= NSIG)
{
__set_errno (EINVAL);
return SIG_ERR;
}
__set_errno (ENOSYS);
return SIG_ERR;
}
weak_alias (__sysv_signal, sysv_signal)
stub_warning (sysv_signal)

View File

@ -1,5 +1,5 @@
/* Definition of `struct sockaddr_*' common members. 4.4 BSD version. /* Definition of `struct sockaddr_*' common members. 4.4 BSD version.
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
@ -21,13 +21,16 @@
#define _SOCKADDRCOM_H 1 #define _SOCKADDRCOM_H 1
/* POSIX.1g specifies this type name for the `sa_family' member. */
typedef unsigned char sa_family_t;
/* This macro is used to declare the initial common members /* This macro is used to declare the initial common members
of the data types used for socket addresses, `struct sockaddr', of the data types used for socket addresses, `struct sockaddr',
`struct sockaddr_in', `struct sockaddr_un', etc. */ `struct sockaddr_in', `struct sockaddr_un', etc. */
#define __SOCKADDR_COMMON(sa_prefix) \ #define __SOCKADDR_COMMON(sa_prefix) \
unsigned char sa_prefix##len; \ unsigned char sa_prefix##len; \
unsigned char sa_prefix##family sa_family_t sa_prefix##family
#define __SOCKADDR_COMMON_SIZE (2 * sizeof (unsigned char)) #define __SOCKADDR_COMMON_SIZE (2 * sizeof (unsigned char))

View File

@ -1,4 +1,5 @@
init-first.h init-first.h
kernel_sigaction.h
kernel_termios.h kernel_termios.h
llseek.c llseek.c
siglist.h siglist.h

View File

@ -6,3 +6,4 @@ clone.S
sys/io.h sys/io.h
kernel_termios.h kernel_termios.h
sys/acct.h sys/acct.h
sys/procfs.h

View File

@ -1 +1,146 @@
#include <linux/if_arp.h> /* Definitions for Address Resolution Protocol.
Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
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 not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* Based on the 4.4BSD and Linux version of this file. */
#ifndef _NET_IF_ARP_H
#define _NET_IF_ARP_H 1
#include <sys/cdefs.h>
#include <sys/types.h>
__BEGIN_DECLS
/* This structure defines an ethernet arp header. */
/* ARP protocol opcodes. */
#define ARPOP_REQUEST 1 /* ARP request. */
#define ARPOP_REPLY 2 /* ARP reply. */
#define ARPOP_RREQUEST 3 /* RARP request. */
#define ARPOP_RREPLY 4 /* RARP reply. */
/* See RFC 826 for protocol description. ARP packets are variable
in size; the arphdr structure defines the fixed-length portion.
Protocol type values are the same as those for 10 Mb/s Ethernet.
It is followed by the variable-sized fields ar_sha, arp_spa,
arp_tha and arp_tpa in that order, according to the lengths
specified. Field names used correspond to RFC 826. */
struct arphdr
{
unsigned short int ar_hrd; /* Format of hardware address. */
unsigned short int ar_pro; /* Format of protocol address. */
unsigned char ar_hln; /* Length of hardware address. */
unsigned char ar_pln; /* Length of protocol address. */
unsigned short int ar_op; /* ARP opcode (command). */
#if 0
/* Ethernet looks like this : This bit is variable sized
however... */
unsigned char __ar_sha[ETH_ALEN]; /* Sender hardware address. */
unsigned char __ar_sip[4]; /* Sender IP address. */
unsigned char __ar_tha[ETH_ALEN]; /* Target hardware address. */
unsigned char __ar_tip[4]; /* Target IP address. */
#endif
};
/* ARP protocol HARDWARE identifiers. */
#define ARPHRD_NETROM 0 /* From KA9Q: NET/ROM pseudo. */
#define ARPHRD_ETHER 1 /* Ethernet 10Mbps. */
#define ARPHRD_EETHER 2 /* Experimental Ethernet. */
#define ARPHRD_AX25 3 /* AX.25 Level 2. */
#define ARPHRD_PRONET 4 /* PROnet token ring. */
#define ARPHRD_CHAOS 5 /* Chaosnet. */
#define ARPHRD_IEEE802 6 /* IEEE 802.2 Ethernet/TR/TB. */
#define ARPHRD_ARCNET 7 /* ARCnet. */
#define ARPHRD_APPLETLK 8 /* APPLEtalk. */
#define ARPHRD_DLCI 15 /* Frame Relay DLCI. */
#define ARPHRD_METRICOM 23 /* Metricom STRIP (new IANA id). */
/* Dummy types for non ARP hardware */
#define ARPHRD_SLIP 256
#define ARPHRD_CSLIP 257
#define ARPHRD_SLIP6 258
#define ARPHRD_CSLIP6 259
#define ARPHRD_RSRVD 260 /* Notional KISS type. */
#define ARPHRD_ADAPT 264
#define ARPHRD_ROSE 270
#define ARPHRD_X25 271 /* CCITT X.25. */
#define ARPHRD_PPP 512
#define ARPHRD_TUNNEL 768 /* IPIP tunnel. */
#define ARPHRD_TUNNEL6 769 /* IPIP6 tunnel. */
#define ARPHRD_FRAD 770 /* Frame Relay Access Device. */
#define ARPHRD_SKIP 771 /* SKIP vif. */
#define ARPHRD_LOOPBACK 772 /* Loopback device. */
#define ARPHRD_LOCALTLK 773 /* Localtalk device. */
#define ARPHRD_FDDI 774 /* Fiber Distributed Data Interface. */
#define ARPHRD_BIF 775 /* AP1000 BIF. */
#define ARPHRD_SIT 776 /* sit0 device - IPv6-in-IPv4. */
/* ARP ioctl request. */
struct arpreq
{
struct sockaddr arp_pa; /* Protocol address. */
struct sockaddr arp_ha; /* Hardware address. */
int arp_flags; /* Flags. */
struct sockaddr arp_netmask; /* Netmask (only for proxy arps). */
char arp_dev[16];
};
struct arpreq_old
{
struct sockaddr arp_pa; /* Protocol address. */
struct sockaddr arp_ha; /* Hardware address. */
int arp_flags; /* Flags. */
struct sockaddr arp_netmask; /* Netmask (only for proxy arps). */
};
/* ARP Flag values. */
#define ATF_COM 0x02 /* Completed entry (ha valid). */
#define ATF_PERM 0x04 /* Permanent entry. */
#define ATF_PUBL 0x08 /* Publish entry. */
#define ATF_USETRAILERS 0x10 /* Has requested trailers. */
#define ATF_NETMASK 0x20 /* Want to use a netmask (only
for proxy entries). */
#define ATF_DONTPUB 0x40 /* Don't answer this addresses. */
#define ATF_MAGIC 0x80 /* Automatically added entry. */
/* Support for the user space arp daemon, arpd. */
#define ARPD_UPDATE 0x01
#define ARPD_LOOKUP 0x02
#define ARPD_FLUSH 0x03
struct arpd_request
{
unsigned short int req; /* Request type. */
u_int32_t ip; /* IP address of entry. */
unsigned long int dev; /* Device entry is tied to. */
unsigned long int stamp;
unsigned long int updated;
unsigned char ha[MAX_ADDR_LEN]; /* Hardware address. */
};
__END_DECLS
#endif /* net/if_arp.h */

View File

@ -1 +1,3 @@
#include <sys/types.h>
typedef u_int32_t __u32;
#include <linux/ppp_defs.h> #include <linux/ppp_defs.h>

View File

@ -1 +1,125 @@
#include <linux/route.h> /* Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
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 not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
/* Based on the 4.4BSD and Linux version of this file. */
#ifndef _NET_ROUTE_H
#define _NET_ROUTE_H 1
#include <features.h>
#include <sys/socket.h>
#include <sys/types.h>
/* This structure gets passed by the SIOCADDRT and SIOCDELRT calls. */
struct rtentry
{
unsigned long int rt_pad1;
struct sockaddr rt_dst; /* Target address. */
struct sockaddr rt_gateway; /* Gateway addr (RTF_GATEWAY). */
struct sockaddr rt_genmask; /* Target network mask (IP). */
unsigned short int rt_flags;
short int rt_pad2;
unsigned long int rt_pad3;
unsigned char rt_tos;
unsigned char rt_class;
short int rt_pad4;
short int rt_metric; /* +1 for binary compatibility! */
char *rt_dev; /* Forcing the device at add. */
unsigned long int rt_mtu; /* Per route MTU/Window. */
unsigned long int rt_window; /* Window clamping. */
unsigned short int rt_irtt; /* Initial RTT. */
};
/* Compatibility hack. */
#define rt_mss rt_mtu
#define RTF_UP 0x0001 /* Route usable. */
#define RTF_GATEWAY 0x0002 /* Destination is a gateway. */
#define RTF_HOST 0x0004 /* Host entry (net otherwise). */
#define RTF_REINSTATE 0x0008 /* Reinstate route after timeout. */
#define RTF_DYNAMIC 0x0010 /* Created dyn. (by redirect). */
#define RTF_MODIFIED 0x0020 /* Modified dyn. (by redirect). */
#define RTF_MTU 0x0040 /* Specific MTU for this route. */
#define RTF_MSS RTF_MTU /* Compatibility. */
#define RTF_WINDOW 0x0080 /* Per route window clamping. */
#define RTF_IRTT 0x0100 /* Initial round trip time. */
#define RTF_REJECT 0x0200 /* Reject route. */
#define RTF_STATIC 0x0400 /* Manually injected route. */
#define RTF_XRESOLVE 0x0800 /* External resolver. */
#define RTF_NOFORWARD 0x1000 /* Forwarding inhibited. */
#define RTF_THROW 0x2000 /* Go to next class. */
#define RTF_NOPMTUDISC 0x4000 /* Do not send packets with DF. */
/* Bad idea. IPv6 should not use broken IPv4 interface. */
#define RTF_ADDRCONF 0x0800 /* Announced on link prefix. */
#define RTF_INVALID 0x1000
#define RTF_DCACHE 0x2000
#define RTF_DEFAULT 0x4000 /* Route is a default route. */
#define RTF_NEXTHOP 0x8000 /* Non gateway route with nexthop. */
#define RTF_MAGIC 0x10000 /* Route added/deleted authomatically,
when interface changes its state. */
#define RTCF_VALVE 0x00200000
#define RTCF_MASQ 0x00400000
#define RTCF_NAT 0x00800000
#define RTCF_DOREDIRECT 0x01000000
#define RTCF_LOG 0x02000000
#define RTCF_DIRECTSRC 0x04000000
#define RTF_LOCAL 0x80000000
#define RTF_INTERFACE 0x40000000
#define RTF_MULTICAST 0x20000000
#define RTF_BROADCAST 0x10000000
#define RTF_NAT 0x08000000
#define RTF_ADDRCLASSMASK 0xF8000000
#define RT_ADDRCLASS(flags) ((__u_int32_t) flags >> 23)
#define RT_TOS(tos) ((tos) & IPTOS_TOS_MASK)
#define RT_LOCALADDR(flags) ((flags & RTF_ADDRCLASSMASK) \
== (RTF_LOCAL|RTF_INTERFACE))
#define RT_CLASS_UNSPEC 0
#define RT_CLASS_DEFAULT 253
#define RT_CLASS_MAIN 254
#define RT_CLASS_LOCAL 255
#define RT_CLASS_MAX 255
#define RTMSG_ACK NLMSG_ACK
#define RTMSG_OVERRUN NLMSG_OVERRUN
#define RTMSG_NEWDEVICE 0x11
#define RTMSG_DELDEVICE 0x12
#define RTMSG_NEWROUTE 0x21
#define RTMSG_DELROUTE 0x22
#define RTMSG_NEWRULE 0x31
#define RTMSG_DELRULE 0x32
#define RTMSG_CONTROL 0x40
#define RTMSG_AR_FAILED 0x51 /* Address Resolution failed. */
#endif /* net/route.h */

View File

@ -0,0 +1,2 @@
__sigtrampoline.S
clone.S

View File

@ -0,0 +1,3 @@
ifeq ($(subdir),signal)
sysdep_routines += __sigtrampoline
endif

View File

@ -0,0 +1,142 @@
/* Userland trampoline code for sigaction on Linux/SPARC */
/* (C) 1996, 1997 Free Software Foundation, Inc. */
/* This file is part of the GNU C Library. */
/* Contributed by Miguel de Icaza (miguel@gnu.ai.mit.edu) */
/* Many thanks go to David Miller for explaining all this to me */
/* miguel@nuclecu.unam.mx */
/* Sources: David Miller, 4.4BSD/SPARC code */
#include <sysdep.h>
/* For REGWIN_SZ */
#include <asm/ptrace.h>
#include <asm/psr.h>
/* The C compiler frame size */
#define CCFSZ 96
.text
ENTRY(____sparc_signal_trampoline)
.global SYMBOL_NAME(____sig_table)
/* Make room for 32 %f registers + %fsr
* this is 132 bytes + alignement = 136
* 96 is the C frame size
*/
save %sp,-136-CCFSZ,%sp
/* save regular registers */
mov %g2,%l2
mov %g3,%l3
mov %g4,%l4
mov %g5,%l5
mov %g6,%l6
mov %g7,%l7
/* save fpu registers */
ld [%fp+64+16+20],%l0 /* load the psr from sigcontext */
sethi %hi(PSR_EF),%l1
andcc %l0,%l1,%l0 /* is floating point enabled? */
be 1f
rd %y,%l1 /* save y anyways */
/* save fpu registers */
st %fsr, [%sp + CCFSZ + 0]
std %f0, [%sp + CCFSZ + 8]
std %f2, [%sp + CCFSZ + 16]
std %f4, [%sp + CCFSZ + 24]
std %f6, [%sp + CCFSZ + 32]
std %f8, [%sp + CCFSZ + 40]
std %f10, [%sp + CCFSZ + 48]
std %f12, [%sp + CCFSZ + 56]
std %f14, [%sp + CCFSZ + 64]
std %f16, [%sp + CCFSZ + 72]
std %f18, [%sp + CCFSZ + 80]
std %f20, [%sp + CCFSZ + 88]
std %f22, [%sp + CCFSZ + 96]
std %f24, [%sp + CCFSZ + 104]
std %f26, [%sp + CCFSZ + 112]
std %f28, [%sp + CCFSZ + 120]
std %f30, [%sp + CCFSZ + 128]
1:
/* Load signal number */
ld [%fp + REGWIN_SZ],%o0
mov %fp,%o1
mov 0xfea,%o2
/* Sanity check */
cmp %o0,33
bl 1f
or %g0,%g0,%g1 /*Call sys_setup */
t 0x10
1:
#ifdef __PIC__
/* Save return address */
mov %o7,%o4
___sxx:
call ___syy
nop
___syy:
sethi %hi(_GLOBAL_OFFSET_TABLE_-(___sxx-.)),%o5
or %o5,%lo(_GLOBAL_OFFSET_TABLE_-(___sxx-.)),%o5
add %o7,%o5,%o5
/* restore return address */
mov %o4,%o7
mov %o5,%o4
/* o4 has the GOT pointer */
#endif
sethi %hi(SYMBOL_NAME(____sig_table)),%o5
or %o5,%lo(SYMBOL_NAME(____sig_table)),%o5
#ifdef __PIC__
add %o5,%o4,%o4
ld [%o4],%o5
#endif
sll %o0,2,%o4
add %o5,%o4,%o4
ld [%o4],%o4
ld [%fp + REGWIN_SZ + 4],%o1 /* Load subcode */
ld [%fp + REGWIN_SZ + 8],%o2 /* pointer to sigcontext */
call %o4
ld [%fp + REGWIN_SZ + 12],%o3 /* Address where signal ocurred */
/* handler returned, restore state */
tst %l0
be 1f
wr %l1,%g0,%y
/* fpu restoration */
ld [%sp + CCFSZ + 0], %fsr
ldd [%sp + CCFSZ + 8], %f0
ldd [%sp + CCFSZ + 16], %f2
ldd [%sp + CCFSZ + 24], %f4
ldd [%sp + CCFSZ + 32], %f6
ldd [%sp + CCFSZ + 40], %f8
ldd [%sp + CCFSZ + 48], %f10
ldd [%sp + CCFSZ + 56], %f12
ldd [%sp + CCFSZ + 64], %f14
ldd [%sp + CCFSZ + 72], %f16
ldd [%sp + CCFSZ + 80], %f18
ldd [%sp + CCFSZ + 88], %f20
ldd [%sp + CCFSZ + 96], %f22
ldd [%sp + CCFSZ + 104], %f24
ldd [%sp + CCFSZ + 112], %f26
ldd [%sp + CCFSZ + 120], %f28
ldd [%sp + CCFSZ + 128], %f30
1:
mov %l2,%g2
mov %l3,%g3
mov %l4,%g4
mov %l5,%g5
mov %l6,%g6
mov %l7,%g7
/* call sigreturn */
restore %g0,SYS_sigreturn,%g1 /* register back and set syscall */
add %sp,64+16,%o0
t 0x10
/* if we return, sysreturn failed */
mov SYS_exit,%g1
t 0x10

View File

@ -0,0 +1,56 @@
/* brk system call for Linux/SPARC.
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Miguel de Icaza (miguel@nuclecu.unam.mx)
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
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
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 not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <errno.h>
#include <unistd.h>
#include <sysdep.h>
/* This must be initialized data because commons can't have aliases. */
void *__curbrk = 0;
/* Old braindamage in GCC's crtstuff.c requires this symbol in an attempt
to work around different old braindamage in the old Linux ELF dynamic
linker. */
weak_alias (__curbrk, ___brk_addr)
int
__brk (void *addr)
{
void *newbrk, *scratch;
asm ("mov %1, %%g1\n\t"
"mov %2, %%o0\n\t"
"t 0x10\n\t"
"mov %%o0, %0\n\t"
: "=r" (newbrk)
: "0" (SYS_brk), "r" (addr)
: "g1", "o0");
__curbrk = newbrk;
if (newbrk < addr)
{
__set_errno (ENOMEM);
return -1;
}
return 0;
}
weak_alias (__brk, brk)

View File

@ -0,0 +1,35 @@
/* Low-level statistical profiling support function. Linux/SPARC version.
Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
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 not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <sigcontext.h>
void
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);
}

View File

@ -0,0 +1,127 @@
/* POSIX.1 sigaction call for Linux/SPARC.
Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Miguel de Icaza (miguel@nuclecu.unam.mx), 1997.
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
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
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 not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <syscall.h>
#include <sys/signal.h>
#include <errno.h>
/* The kernel will deliver signals in the old way if the 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.
Our sigaction code takes care of selecting the type of kernel we are
using at runtime. */
extern void ____sparc_signal_trampoline (int);
long ____sig_table [NSIG];
int
__trampoline_sigaction (int sig, struct sigaction *new, struct sigaction *old)
{
int ret;
int need_to_hide_trick = 0;
__sighandler_t old_sh;
if (new)
{
if (new->sa_handler != SIG_DFL && new->sa_handler != SIG_IGN)
{
old_sh = ____sig_table[sig];
____sig_table[sig] = (long int) new->sa_handler;
new->sa_handler = ____sparc_signal_trampoline;
need_to_hide_trick = 1;
}
}
__asm__("or %%g0,%0,%%g1\n\t"
"or %%g0,%1,%%o0\n\t"
"or %%g0,%2,%%o1\n\t"
"or %%g0,%3,%%o2\n\t"
"t 0x10\n\t"
"bcc 1f\n\t"
"or %%o0, %%g0, %0\n\t"
"sub %%g0, %%o0, %0\n\t"
"1:"
: "=r" (ret), "=r" ((long int) sig), "=r" ((long int) new),
"=r" ((long int) old)
: "0" (SYS_sigaction), "1" (sig), "2" (new), "3" (old)
: "g1", "o0", "o1", "o2");
if (ret >= 0)
{
if (old && old->sa_handler == ____sparc_signal_trampoline)
{
if (need_to_hide_trick)
old->sa_handler = old_sh;
else
old->sa_handler = ____sig_table[sig];
}
if (need_to_hide_trick)
new->sa_handler = ____sig_table[sig];
return 0;
}
__set_errno (-ret);
return -1;
}
int
__new_sigaction (int sig, struct sigaction *new, struct sigaction *old)
{
int ret;
sig = -sig;
__asm__("or %%g0,%0,%%g1\n\t"
"or %%g0,%1,%%o0\n\t"
"or %%g0,%2,%%o1\n\t"
"or %%g0,%3,%%o2\n\t"
"t 0x10\n\t"
"bcc 1f\n\t"
"or %%o0, %%g0, %0\n\t"
"sub %%g0,%%o0,%0\n\t"
"1:"
: "=r" (ret), "=r" ((long int) sig), "=r" ((long int) new),
"=r" ((long int) old)
: "0" (SYS_sigaction), "1" (sig), "2" (new), "3" (old)
: "g1", "o0", "o1", "o2");
if (ret >= 0)
return 0;
__set_errno (-ret);
return -1;
}
int
__sigaction (int sig, struct sigaction *new, struct sigaction *old)
{
static (*sigact_routine) (int, struct sigaction *, struct sigaction *);
int ret;
struct sigaction sa;
if (sigact_routine)
return (*sigact_routine) (sig, new, old);
ret = __new_sigaction (1, NULL, &sa);
if (ret == -1)
sigact_routine = __trampoline_sigaction;
else
sigact_routine = __new_sigaction;
return __sigaction (sig, new, old);
}
weak_alias (__sigaction, sigaction);

View File

@ -0,0 +1,58 @@
/* Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, 1997.
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
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
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 not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <sysdep.h>
#include <sys/socketcall.h>
#define P(a, b) P2(a, b)
#define P2(a, b) a##b
.text
/* The socket-oriented system calls are handled unusally in Linux.
They are all gated through the single `socketcall' system call number.
`socketcall' takes two arguments: the first is the subcode, specifying
which socket function is being called; and the second is a pointer to
the arguments to the specific function.
The .S files for the other calls just #define socket and #include this. */
.globl P(__,socket)
ENTRY (P(__,socket))
mov SYS_ify(socketcall), %g1 /* System call number */
/* Use ## so `socket' is a separate token that might be #define'd. */
mov P(SOCKOP_,socket), %o0 /* Subcode is first arg to syscall. */
mov %i0,%o1 /* args pointer is second arg to syscall */
t 0x10
bcc,a 1
nop
save %sp,96,%sp
call __errno_location
nop
st %i0,[%o0]
restore
retl
mov -1,%o0
1:
ret
PSEUDO_END (P(__,socket))
weak_alias (P(__,socket), socket)

View File

@ -0,0 +1,30 @@
/* Copyright (C) 1991, 1992, 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
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 not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#define DONT_LOAD_G1
#include <sysdep.h>
ENTRY (__libc_syscall)
or %o0,%g0,%g1
or %o1,%g0,%o0
or %o2,%g0,%o1
or %o3,%g0,%o2
or %o4,%g0,%o3
or %o5,%g0,%o4
PSEUDO_NOENT(__libc_syscall, syscall, 5)
ret
SYSCALL__POST(syscall,5)

View File

@ -0,0 +1,57 @@
/* Copyright (C) 1997 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Miguel de Icaza <miguel@gnu.ai.mit.edu>, January 1997.
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
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
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 not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#ifndef _LINUX_SPARC_SYSDEP_H
#define _LINUX_SPARC_SYSDEP_H 1
#include <sysdeps/unix/sparc/sysdep.h>
#undef SYS_ify
#define SYS_ify(syscall_name) __NR_##syscall_name
#ifdef ASSEMBLER
#ifdef DONT_LOAD_G1
# define LOADSYSCALL(x)
#else
# define LOADSYSCALL(x) mov SYS_##n, %g1
#endif
/* Linux/SPARC uses a different trap number and uses __errno_location always */
#undef PSEUDO
#define PSEUDO(name, syscall_name, args) \
.text; \
ENTRY(name); \
LOADSYSCALL(syscall_name); \
ta 0x10; \
bcc,a 1f; \
nop; \
save %sp,96,%sp; \
call __errno_location; \
nop; \
st %i0,[%o0]; \
restore; \
retl; \
mov -1,%o0; \
1:
#endif /* ASSEMBLER */
#endif /* linux/sparc/sysdep.h */

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.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
@ -46,8 +46,8 @@ struct msqid_ds
unsigned short int __msg_cbytes;/* current number of bytes on queue */ unsigned short int __msg_cbytes;/* current number of bytes on queue */
unsigned short int msg_qnum; /* number of messages currently on queue */ unsigned short int msg_qnum; /* number of messages currently on queue */
unsigned short int msg_qbytes;/* max number of bytes allowed on queue */ unsigned short int msg_qbytes;/* max number of bytes allowed on queue */
__pid_t msg_lspid; /* pid of last msgsnd() */ int msg_lspid; /* pid of last msgsnd() */
__pid_t msg_lrpid; /* pid of last msgrcv() */ int msg_lrpid; /* pid of last msgrcv() */
}; };
#ifdef __USE_MISC #ifdef __USE_MISC

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.
Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, August 1995.
@ -48,8 +48,8 @@ struct shmid_ds
__time_t shm_atime; /* time of last shmat() */ __time_t shm_atime; /* time of last shmat() */
__time_t shm_dtime; /* time of last shmdt() */ __time_t shm_dtime; /* time of last shmdt() */
__time_t shm_ctime; /* time of last change by shmctl() */ __time_t shm_ctime; /* time of last change by shmctl() */
__pid_t shm_cpid; /* pid of creator */ int shm_cpid; /* pid of creator */
__pid_t shm_lpid; /* pid of last shmop */ int shm_lpid; /* pid of last shmop */
unsigned short int shm_nattch; /* number of current attaches */ unsigned short int shm_nattch; /* number of current attaches */
unsigned short int __shm_npages; /* size of segment (pages) */ unsigned short int __shm_npages; /* size of segment (pages) */
unsigned long int *__shm_pages; /* array of ptrs to frames -> SHMMAX */ unsigned long int *__shm_pages; /* array of ptrs to frames -> SHMMAX */

View File

@ -1,20 +1,20 @@
/* Copyright (C) 1991, 1993, 1995, 1996 Free Software Foundation, Inc. /* Copyright (C) 1991, 1993, 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
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 "../locale/localeinfo.h" #include "../locale/localeinfo.h"
#include <errno.h> #include <errno.h>

View File

@ -1,20 +1,20 @@
/* 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 <time.h> #include <time.h>

View File

@ -1,20 +1,20 @@
/* Copyright (C) 1991, 1993, 1995, 1996 Free Software Foundation, Inc. /* Copyright (C) 1991, 1993, 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
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 <stddef.h> #include <stddef.h>
#include <time.h> #include <time.h>

View File

@ -1,26 +1,25 @@
/* Copyright (C) 1991, 1993 Free Software Foundation, Inc. /* Copyright (C) 1991, 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 <time.h> #include <time.h>
/* Defined in mktime.c. */ /* Defined in mktime.c. */
extern CONST unsigned short int __mon_yday[2][13]; extern const unsigned short int __mon_yday[2][13];
#define SECS_PER_HOUR (60 * 60) #define SECS_PER_HOUR (60 * 60)
#define SECS_PER_DAY (SECS_PER_HOUR * 24) #define SECS_PER_DAY (SECS_PER_HOUR * 24)
@ -29,11 +28,13 @@ extern CONST unsigned short int __mon_yday[2][13];
offset OFFSET seconds east of UTC, offset OFFSET seconds east of UTC,
and store year, yday, mon, mday, wday, hour, min, sec into *TP. */ and store year, yday, mon, mday, wday, hour, min, sec into *TP. */
void void
DEFUN(__offtime, (t, offset, tp), __offtime (t, offset, tp)
CONST time_t *t AND long int offset AND struct tm *tp) const time_t *t;
long int offset;
struct tm *tp;
{ {
register long int days, rem, y; register long int days, rem, y;
register CONST unsigned short int *ip; register const unsigned short int *ip;
days = *t / SECS_PER_DAY; days = *t / SECS_PER_DAY;
rem = *t % SECS_PER_DAY; rem = *t % SECS_PER_DAY;
@ -58,7 +59,7 @@ DEFUN(__offtime, (t, offset, tp),
tp->tm_wday += 7; tp->tm_wday += 7;
y = 1970; y = 1970;
# define LEAPS_THRU_END_OF(y) ((y) / 4 - (y) / 100 + (y) / 400) #define LEAPS_THRU_END_OF(y) ((y) / 4 - (y) / 100 + (y) / 400)
while (days < 0 || days >= (__isleap (y) ? 366 : 365)) while (days < 0 || days >= (__isleap (y) ? 366 : 365))
{ {

View File

@ -129,7 +129,7 @@ localtime_r (t, tp)
#endif #endif
#define recursive(new_fmt) \ #define recursive(new_fmt) \
(*(new_fmt) != '\0' \ (*(new_fmt) != '\0' \
|| strptime_internal (rp, (new_fmt), tm, decided) != NULL) && strptime_internal (rp, (new_fmt), tm, decided) != NULL)
#ifdef _LIBC #ifdef _LIBC

View File

@ -1,20 +1,20 @@
/* 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 <time.h> #include <time.h>

View File

@ -229,41 +229,41 @@ __tzset_internal (always)
tz += l; tz += l;
} }
/* Figure out the DST offset from GMT. */
if (*tz == '-' || *tz == '+')
tz_rules[1].offset = *tz++ == '-' ? 1L : -1L;
else
tz_rules[1].offset = -1L;
switch (sscanf (tz, "%hu:%hu:%hu", &hh, &mm, &ss))
{
default:
/* Default to one hour later than standard time. */
tz_rules[1].offset = tz_rules[0].offset + (60 * 60);
break;
case 1:
mm = 0;
case 2:
ss = 0;
case 3:
tz_rules[1].offset *= (min (ss, 59) + (min (mm, 59) * 60) +
(min (hh, 23) * (60 * 60)));
break;
}
for (l = 0; l < 3; ++l)
{
while (isdigit (*tz))
++tz;
if (l < 2 && *tz == ':')
++tz;
}
} }
else else
/* There is no DST. */ /* There is no DST. */
tz_rules[1].name = tz_rules[0].name; tz_rules[1].name = tz_rules[0].name;
/* Figure out the DST offset from GMT. */
if (*tz == '-' || *tz == '+')
tz_rules[1].offset = *tz++ == '-' ? 1L : -1L;
else
tz_rules[1].offset = -1L;
switch (sscanf (tz, "%hu:%hu:%hu", &hh, &mm, &ss))
{
default:
/* Default to one hour later than standard time. */
tz_rules[1].offset = tz_rules[0].offset + (60 * 60);
break;
case 1:
mm = 0;
case 2:
ss = 0;
case 3:
tz_rules[1].offset *= (min (ss, 59) + (min (mm, 59) * 60) +
(min (hh, 23) * (60 * 60)));
break;
}
for (l = 0; l < 3; ++l)
{
while (isdigit (*tz))
++tz;
if (l < 2 && *tz == ':')
++tz;
}
done_names: done_names:
if (*tz == '\0' || (tz[0] == ',' && tz[1] == '\0')) if (*tz == '\0' || (tz[0] == ',' && tz[1] == '\0'))

View File

@ -1,4 +1,4 @@
/* This file just defines the current version number of libc. */ /* This file just defines the current version number of libc. */
#define RELEASE "alpha" #define RELEASE "alpha"
#define VERSION "1.100" #define VERSION "1.101"