1
0
mirror of https://sourceware.org/git/glibc.git synced 2025-07-29 11:41:21 +03:00
1998-07-27 17:42  Ulrich Drepper  <drepper@cygnus.com>

	* nss/nss_files/files-parse.c (INT_FIELD): Use strtoul instead of
	strtol.
	(INT_FIELD_MAYBE_NULL): Likewise.

	* posix/globtest.c: Rewrite for extended test suite.
	* posix/globtest.sh: More tests.
	Patch by Brian Wellington <bwelling@anomaly.munge.com>.

	* stdlib/strtol.c: Don't redefine LONG_MAX, LONG_MIN, and ULONG_MAX.
	Use new macro.

	* sysdeps/generic/readv.c: Correct return type.
	* sysdeps/generic/writev.c: Likewise.

1998-07-24  Gordon Matzigkeit  <gord@fig.org>

	* argp/argp-help.c (_GNU_SOURCE): Define, to suck in
	program_invocation_name when compiling outside of glibc.

1998-07-26  Philip Blundell  <philb@gnu.org>

	* sysdeps/unix/sysv/linux/arm/siglist.c: New file; ARM tools don't
	like `@' in .type directives.

	* sysdeps/libm-ieee754/e_expf.c (__ieee754_expf): Check whether
	FE_TONEAREST exists for this platform before using it.
	* sysdeps/libm-ieee754/e_exp.c (__ieee754_exp): Likewise.

	* sysdeps/arm/dl-machine.h (elf_machine_rel): Delete redundant
	debugging code.  Correct handling of PC24 relocs.

	* elf/Makefile (ld-map): Only define if versioning is in use.

	* sysdeps/arm/fpu_control.h: Move to ...
	* sysdeps/arm/fpu/fpu_control.h: ... here.
	* sysdeps/generic/fpu_control.h: Made usable as a dummy
	implementation.

	* sysdeps/unix/sysv/linux/arm/brk.c: New file.

	* sysdeps/arm/machine-gmon.h: Improved profiling for ARM.
	* sysdeps/arm/sysdep.h (CALL_MCOUNT): Replace stub with real
	implementation.
	* sysdeps/unix/sysv/linux/arm/clone.S: Likewise.
	Based on patch from Scott Bambrough and Pat Beirne.

	* shlib-versions: Add appropriate definitions for ARM machines.

	* README.template: Mention that Linux/ARM with ELF works now.

1998-07-18  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* Makerules: Generate compilation rules for all object suffixes,
	not only those currently selected, for sources in the current or
	object directory.

1998-07-24  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* posix/fnmatch.c (fnmatch): Allow `/' in character class.  Don't
	match `/' in filename by a character class if requested.
	* posix/testfnm.c: Rewritten.
	* posix/testfnm.args: Removed.

1998-07-25  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* posix/annexc.c (limits_syms): Add missing symbols.
	(stdarg_syms): Move va_list to `maybe' list.
	(stdio_syms): Add FOPEN_MAX.
This commit is contained in:
Ulrich Drepper
1998-07-27 17:55:05 +00:00
parent 6730873037
commit 3f62b69af3
27 changed files with 2165 additions and 888 deletions

View File

@ -1,3 +1,74 @@
1998-07-27 17:42 Ulrich Drepper <drepper@cygnus.com>
* nss/nss_files/files-parse.c (INT_FIELD): Use strtoul instead of
strtol.
(INT_FIELD_MAYBE_NULL): Likewise.
* posix/globtest.c: Rewrite for extended test suite.
* posix/globtest.sh: More tests.
Patch by Brian Wellington <bwelling@anomaly.munge.com>.
* stdlib/strtol.c: Don't redefine LONG_MAX, LONG_MIN, and ULONG_MAX.
Use new macro.
* sysdeps/generic/readv.c: Correct return type.
* sysdeps/generic/writev.c: Likewise.
1998-07-24 Gordon Matzigkeit <gord@fig.org>
* argp/argp-help.c (_GNU_SOURCE): Define, to suck in
program_invocation_name when compiling outside of glibc.
1998-07-26 Philip Blundell <philb@gnu.org>
* sysdeps/unix/sysv/linux/arm/siglist.c: New file; ARM tools don't
like `@' in .type directives.
* sysdeps/libm-ieee754/e_expf.c (__ieee754_expf): Check whether
FE_TONEAREST exists for this platform before using it.
* sysdeps/libm-ieee754/e_exp.c (__ieee754_exp): Likewise.
* sysdeps/arm/dl-machine.h (elf_machine_rel): Delete redundant
debugging code. Correct handling of PC24 relocs.
* elf/Makefile (ld-map): Only define if versioning is in use.
* sysdeps/arm/fpu_control.h: Move to ...
* sysdeps/arm/fpu/fpu_control.h: ... here.
* sysdeps/generic/fpu_control.h: Made usable as a dummy
implementation.
* sysdeps/unix/sysv/linux/arm/brk.c: New file.
* sysdeps/arm/machine-gmon.h: Improved profiling for ARM.
* sysdeps/arm/sysdep.h (CALL_MCOUNT): Replace stub with real
implementation.
* sysdeps/unix/sysv/linux/arm/clone.S: Likewise.
Based on patch from Scott Bambrough and Pat Beirne.
* shlib-versions: Add appropriate definitions for ARM machines.
* README.template: Mention that Linux/ARM with ELF works now.
1998-07-18 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* Makerules: Generate compilation rules for all object suffixes,
not only those currently selected, for sources in the current or
object directory.
1998-07-24 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* posix/fnmatch.c (fnmatch): Allow `/' in character class. Don't
match `/' in filename by a character class if requested.
* posix/testfnm.c: Rewritten.
* posix/testfnm.args: Removed.
1998-07-25 Andreas Schwab <schwab@issan.informatik.uni-dortmund.de>
* posix/annexc.c (limits_syms): Add missing symbols.
(stdarg_syms): Move va_list to `maybe' list.
(stdio_syms): Add FOPEN_MAX.
1998-07-25 Ulrich Drepper <drepper@cygnus.com> 1998-07-25 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/i386/bits/byteswap.h (__bswap_64): Change __v to __w to * sysdeps/i386/bits/byteswap.h (__bswap_64): Change __v to __w to

View File

@ -171,21 +171,21 @@ $(common-objpfx)dummy.d:
define o-iterator-doit define o-iterator-doit
$(objpfx)%$o: %.S $(before-compile); $$(compile-command.S) $(objpfx)%$o: %.S $(before-compile); $$(compile-command.S)
endef endef
object-suffixes-left := $(object-suffixes-for-libc) object-suffixes-left := $(all-object-suffixes)
include $(o-iterator) include $(o-iterator)
$(objpfx)%.d: %.S $(before-compile); $(+make-deps) $(objpfx)%.d: %.S $(before-compile); $(+make-deps)
define o-iterator-doit define o-iterator-doit
$(objpfx)%$o: %.s $(before-compile); $$(compile-command.s) $(objpfx)%$o: %.s $(before-compile); $$(compile-command.s)
endef endef
object-suffixes-left := $(object-suffixes-for-libc) object-suffixes-left := $(all-object-suffixes)
include $(o-iterator) include $(o-iterator)
$(objpfx)%.d: %.s $(common-objpfx)dummy.d; $(make-dummy-dep) $(objpfx)%.d: %.s $(common-objpfx)dummy.d; $(make-dummy-dep)
define o-iterator-doit define o-iterator-doit
$(objpfx)%$o: %.c $(before-compile); $$(compile-command.c) $(objpfx)%$o: %.c $(before-compile); $$(compile-command.c)
endef endef
object-suffixes-left := $(object-suffixes-for-libc) object-suffixes-left := $(all-object-suffixes)
include $(o-iterator) include $(o-iterator)
$(objpfx)%.d: %.c $(before-compile); $(+make-deps) $(objpfx)%.d: %.c $(before-compile); $(+make-deps)
@ -197,21 +197,21 @@ ifdef objpfx
define o-iterator-doit define o-iterator-doit
$(objpfx)%$o: $(objpfx)%.S $(before-compile); $$(compile-command.S) $(objpfx)%$o: $(objpfx)%.S $(before-compile); $$(compile-command.S)
endef endef
object-suffixes-left := $(object-suffixes-for-libc) object-suffixes-left := $(all-object-suffixes)
include $(o-iterator) include $(o-iterator)
$(objpfx)%.d: $(objpfx)%.S $(before-compile); $(+make-deps) $(objpfx)%.d: $(objpfx)%.S $(before-compile); $(+make-deps)
define o-iterator-doit define o-iterator-doit
$(objpfx)%$o: $(objpfx)%.s $(before-compile); $$(compile-command.s) $(objpfx)%$o: $(objpfx)%.s $(before-compile); $$(compile-command.s)
endef endef
object-suffixes-left := $(object-suffixes-for-libc) object-suffixes-left := $(all-object-suffixes)
include $(o-iterator) include $(o-iterator)
$(objpfx)%.d: $(objpfx)%.s $(common-objpfx)dummy.d; $(make-dummy-dep) $(objpfx)%.d: $(objpfx)%.s $(common-objpfx)dummy.d; $(make-dummy-dep)
define o-iterator-doit define o-iterator-doit
$(objpfx)%$o: $(objpfx)%.c $(before-compile); $$(compile-command.c) $(objpfx)%$o: $(objpfx)%.c $(before-compile); $$(compile-command.c)
endef endef
object-suffixes-left := $(object-suffixes-for-libc) object-suffixes-left := $(all-object-suffixes)
include $(o-iterator) include $(o-iterator)
$(objpfx)%.d: $(objpfx)%.c $(before-compile); $(+make-deps) $(objpfx)%.d: $(objpfx)%.c $(before-compile); $(+make-deps)
endif endif

View File

@ -13,6 +13,7 @@ configurations:
sparc-*-linux-gnu Linux-2.x on SPARC sparc-*-linux-gnu Linux-2.x on SPARC
sparc64-*-linux-gnu Linux-2.x on UltraSPARC sparc64-*-linux-gnu Linux-2.x on UltraSPARC
arm-*-none ARM standalone systems arm-*-none ARM standalone systems
arm-*-linux Linux-2.x on ARM
arm-*-linuxaout Linux-2.x on ARM using a.out binaries arm-*-linuxaout Linux-2.x on ARM using a.out binaries

View File

@ -18,6 +18,10 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#ifndef _GNU_SOURCE
# define _GNU_SOURCE 1
#endif
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
#include <config.h> #include <config.h>
#endif #endif

View File

@ -35,7 +35,9 @@ elide-routines.os = $(dl-routines) dl-support enbl-secure
# ld.so uses those routines, plus some special stuff for being the program # ld.so uses those routines, plus some special stuff for being the program
# interpreter and operating independent of libc. # interpreter and operating independent of libc.
rtld-routines := rtld $(dl-routines) dl-sysdep dl-environ dl-minimal rtld-routines := rtld $(dl-routines) dl-sysdep dl-environ dl-minimal
ifeq ($(versioning),yes)
ld-map = $(common-objpfx)libc.map ld-map = $(common-objpfx)libc.map
endif
distribute = $(rtld-routines:=.c) dynamic-link.h do-rel.h dl-machine.h \ distribute = $(rtld-routines:=.c) dynamic-link.h do-rel.h dl-machine.h \
dl-hash.h soinit.c sofini.c ldd.sh.in ldd.bash.in eval.c \ dl-hash.h soinit.c sofini.c ldd.sh.in ldd.bash.in eval.c \
genrtldtbl.awk atomicity.h dl-procinfo.h ldsodefs.h \ genrtldtbl.awk atomicity.h dl-procinfo.h ldsodefs.h \

View File

@ -109,7 +109,7 @@ parse_line (char *line, struct STRUCTURE *result, \
# define INT_FIELD(variable, terminator_p, swallow, base, convert) \ # define INT_FIELD(variable, terminator_p, swallow, base, convert) \
{ \ { \
char *endp; \ char *endp; \
variable = convert (strtol (line, &endp, base)); \ variable = convert (strtoul (line, &endp, base)); \
if (endp == line) \ if (endp == line) \
return 0; \ return 0; \
else if (terminator_p (*endp)) \ else if (terminator_p (*endp)) \
@ -127,7 +127,7 @@ parse_line (char *line, struct STRUCTURE *result, \
if (*line == '\0') \ if (*line == '\0') \
/* We expect some more input, so don't allow the string to end here. */ \ /* We expect some more input, so don't allow the string to end here. */ \
return 0; \ return 0; \
variable = convert (strtol (line, &endp, base)); \ variable = convert (strtoul (line, &endp, base)); \
if (endp == line) \ if (endp == line) \
variable = default; \ variable = default; \
if (terminator_p (*endp)) \ if (terminator_p (*endp)) \

File diff suppressed because it is too large Load Diff

View File

@ -160,8 +160,10 @@ static const char *const limits_syms[] =
"_POSIX_THREAD_DESTRUCTOR_ITERATIONS", "_POSIX_THREAD_KEYS_MAX", "_POSIX_THREAD_DESTRUCTOR_ITERATIONS", "_POSIX_THREAD_KEYS_MAX",
"_POSIX_THREAD_THREADS_MAX", "_POSIX_TIMER_MAX", "_POSIX_TTY_NAME_MAX", "_POSIX_THREAD_THREADS_MAX", "_POSIX_TIMER_MAX", "_POSIX_TTY_NAME_MAX",
"_POSIX_TZNAME_MAX", "_POSIX_THREAD_DESTRUCTOR_ITERATIONS", "_POSIX_TZNAME_MAX", "_POSIX_THREAD_DESTRUCTOR_ITERATIONS",
"CHAR_BIT", "CHAR_MAX", "CHAR_MIN", "INT_MAX", "INT_MIN", "MB_LEN_MAX", "CHAR_BIT", "CHAR_MAX", "CHAR_MIN", "INT_MAX", "INT_MIN", "LONG_MAX",
"NGROUPS_MAX", "PAGESIZE", "SCHAR_MIN", "SCHAR_MAX" "LONG_MIN", "MB_LEN_MAX", "NGROUPS_MAX", "PAGESIZE", "SCHAR_MAX",
"SCHAR_MIN", "SHRT_MAX", "SHRT_MIN", "UCHAR_MAX", "UINT_MAX",
"ULONG_MAX", "USHRT_MAX"
}; };
static const char *const limits_maybe[] = static const char *const limits_maybe[] =
{ {
@ -333,10 +335,11 @@ static const char *const signal_maybe[] =
/* <stdarg.h>. */ /* <stdarg.h>. */
static const char *const stdarg_syms[] = static const char *const stdarg_syms[] =
{ {
"va_arg", "va_end", "va_list", "va_start" "va_arg", "va_end", "va_start"
}; };
static const char *const stdarg_maybe[] = static const char *const stdarg_maybe[] =
{ {
"va_list"
}; };
/* <stddef.h>. */ /* <stddef.h>. */
@ -351,9 +354,9 @@ static const char *const stddef_maybe[] =
/* <stdio.h>. */ /* <stdio.h>. */
static const char *const stdio_syms[] = static const char *const stdio_syms[] =
{ {
"BUFSIZ", "EOF", "FILENAME_MAX", "L_ctermid", "L_cuserid", "L_tmpnam", "BUFSIZ", "EOF", "FILENAME_MAX", "FOPEN_MAX", "L_ctermid", "L_cuserid",
"NULL", "SEEK_CUR", "SEEK_END", "SEEK_SET", "STREAM_MAX", "TMP_MAX", "L_tmpnam", "NULL", "SEEK_CUR", "SEEK_END", "SEEK_SET", "STREAM_MAX",
"stderr", "stdin", "stdout", "_IOFBF", "_IOLBF", "_IONBF" "TMP_MAX", "stderr", "stdin", "stdout", "_IOFBF", "_IOLBF", "_IONBF"
}; };
static const char *const stdio_maybe[] = static const char *const stdio_maybe[] =
{ {

View File

@ -228,6 +228,10 @@ fnmatch (pattern, string, flags)
(n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/'))) (n == string || ((flags & FNM_FILE_NAME) && n[-1] == '/')))
return FNM_NOMATCH; return FNM_NOMATCH;
if (*n == '/' && (flags & FNM_FILE_NAME))
/* `/' cannot be matched. */
return FNM_NOMATCH;
not = (*p == '!' || (posixly_correct < 0 && *p == '^')); not = (*p == '!' || (posixly_correct < 0 && *p == '^'));
if (not) if (not)
++p; ++p;
@ -246,9 +250,6 @@ fnmatch (pattern, string, flags)
if (c == fn) if (c == fn)
goto matched; goto matched;
} }
else if ((flags & FNM_FILE_NAME) && c == '/')
/* [/] can never match. */
return FNM_NOMATCH;
else if (c == '[' && *p == ':') else if (c == '[' && *p == ':')
{ {
/* Leave room for the null. */ /* Leave room for the null. */

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1997 Free Software Foundation, Inc. /* Copyright (C) 1997, 1998 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
@ -16,36 +16,93 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */ Boston, MA 02111-1307, USA. */
#include <getopt.h>
#include <stdio.h> #include <stdio.h>
#include <glob.h>
#include <unistd.h> #include <unistd.h>
#include <glob.h>
int int
main (int argc, char *argv[]) main (int argc, char *argv[])
{ {
int i; int i, j;
int glob_flags = GLOB_NOSORT; int glob_flags = 0;
glob_t filenames; glob_t g;
int quotes = 1;
if (argc != 3) while ((i = getopt (argc, argv, "bcdegmopqst")) != -1)
exit (1); switch(i)
if (chdir (argv[1])) {
exit (1); case 'b':
i = glob (argv[2], glob_flags, NULL, &filenames); glob_flags |= GLOB_BRACE;
break;
case 'c':
glob_flags |= GLOB_NOCHECK;
break;
case 'd':
glob_flags |= GLOB_ONLYDIR;
break;
case 'e':
glob_flags |= GLOB_NOESCAPE;
break;
case 'g':
glob_flags |= GLOB_NOMAGIC;
break;
case 'm':
glob_flags |= GLOB_MARK;
break;
case 'o':
glob_flags |= GLOB_DOOFFS;
g.gl_offs = 1;
break;
case 'p':
glob_flags |= GLOB_PERIOD;
break;
case 'q':
quotes = 0;
break;
case 's':
glob_flags |= GLOB_NOSORT;
break;
case 't':
glob_flags |= GLOB_TILDE;
break;
default:
exit (-1);
}
if (optind >= argc || chdir (argv[optind]))
exit(1);
j = optind + 1;
if (optind + 1 >= argc)
exit (1);
/* Do a glob on each remaining argument. */
for (j = optind + 1; j < argc; j++) {
i = glob (argv[j], glob_flags, NULL, &g);
if (i != 0)
break;
glob_flags |= GLOB_APPEND;
}
/* Was there an error? */
if (i == GLOB_NOSPACE) if (i == GLOB_NOSPACE)
puts ("GLOB_NOSPACE"); puts ("GLOB_NOSPACE");
else if (i == GLOB_ABEND) else if (i == GLOB_ABORTED)
puts ("GLOB_ABEND"); puts ("GLOB_ABORTED");
else if (i == GLOB_NOMATCH) else if (i == GLOB_NOMATCH)
puts ("GLOB_NOMATCH"); puts ("GLOB_NOMATCH");
printf ("%sNULL\n", filenames.gl_pathv ? "not " : ""); /* If we set an offset, fill in the first field. */
if (glob_flags & GLOB_DOOFFS)
g.gl_pathv[0] = (char *) "abc";
if (filenames.gl_pathv) /* Print out the names. Unless otherwise specified, qoute them. */
if (g.gl_pathv)
{ {
for (i = 0; i < filenames.gl_pathc; ++i) for (i = 0; i < g.gl_pathc; ++i)
printf ("`%s'\n", filenames.gl_pathv[i]); printf ("%s%s%s\n", quotes ? "`" : "", g.gl_pathv[i],
quotes ? "'" : "");
} }
return 0; return 0;
} }

View File

@ -4,17 +4,28 @@ common_objpfx=$1; shift
elf_objpfx=$1; shift elf_objpfx=$1; shift
rtld_installed_name=$1; shift rtld_installed_name=$1; shift
# Since we use `osrt' we must make sure to use the same locale everywhere.
LC_ALL=C
export LC_ALL
LANG=C
export LANG
# Create the arena # Create the arena
: ${TMPDIR=/tmp} : ${TMPDIR=/tmp}
testdir=$TMPDIR/globtest-dir testdir=$TMPDIR/globtest-dir
testout=$TMPDIR/globtest-out testout=$TMPDIR/globtest-out
testout2=$TMPDIR/globtest-out2
trap 'rm -fr $testdir $testout' 1 2 3 15 trap 'rm -fr $testdir $testout $testout2' 1 2 3 15
rm -fr $testdir rm -fr $testdir
mkdir $testdir mkdir $testdir
echo 1 > $testdir/file1 echo 1 > $testdir/file1
echo 2 > $testdir/file2 echo 2 > $testdir/file2
echo 3 > $testdir/-file3
echo 4 > $testdir/~file4
echo 5 > $testdir/.file5
echo 6 > $testdir/'*file6'
mkdir $testdir/dir1 mkdir $testdir/dir1
mkdir $testdir/dir2 mkdir $testdir/dir2
echo 1_1 > $testdir/dir1/file1_1 echo 1_1 > $testdir/dir1/file1_1
@ -23,40 +34,130 @@ echo 1_2 > $testdir/dir1/file1_2
# Run some tests. # Run some tests.
result=0 result=0
# Normal test
${elf_objpfx}${rtld_installed_name} --library-path ${common_objpfx} \ ${elf_objpfx}${rtld_installed_name} --library-path ${common_objpfx} \
${common_objpfx}posix/globtest "$testdir" "*" | ${common_objpfx}posix/globtest "$testdir" "*" |
sort > $testout sort > $testout
cat <<"EOF" | cmp - $testout || result=1 cat <<"EOF" | cmp - $testout || result=1
`*file6'
`-file3'
`dir1' `dir1'
`dir2' `dir2'
`file1' `file1'
`file2' `file2'
not NULL `~file4'
EOF EOF
# Don't let glob sort it
${elf_objpfx}${rtld_installed_name} --library-path ${common_objpfx} \
${common_objpfx}posix/globtest -s "$testdir" "*" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
`*file6'
`-file3'
`dir1'
`dir2'
`file1'
`file2'
`~file4'
EOF
# Mark directories
${elf_objpfx}${rtld_installed_name} --library-path ${common_objpfx} \
${common_objpfx}posix/globtest -m "$testdir" "*" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
`*file6'
`-file3'
`dir1/'
`dir2/'
`file1'
`file2'
`~file4'
EOF
# Find files starting with .
${elf_objpfx}${rtld_installed_name} --library-path ${common_objpfx} \
${common_objpfx}posix/globtest -p "$testdir" "*" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
`*file6'
`-file3'
`.'
`..'
`.file5'
`dir1'
`dir2'
`file1'
`file2'
`~file4'
EOF
# Test braces
${elf_objpfx}${rtld_installed_name} --library-path ${common_objpfx} \
${common_objpfx}posix/globtest -b "$testdir" "file{1,2}" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
`file1'
`file2'
EOF
# Test NOCHECK
${elf_objpfx}${rtld_installed_name} --library-path ${common_objpfx} \
${common_objpfx}posix/globtest -c "$testdir" "abc" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
`abc'
EOF
# Test NOMAGIC without magic characters
${elf_objpfx}${rtld_installed_name} --library-path ${common_objpfx} \
${common_objpfx}posix/globtest -g "$testdir" "abc" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
`abc'
EOF
# Test NOMAGIC with magic characters
${elf_objpfx}${rtld_installed_name} --library-path ${common_objpfx} \
${common_objpfx}posix/globtest -g "$testdir" "abc*" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
GLOB_NOMATCH
EOF
# Test subdirs correctly
${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ ${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \
${common_objpfx}posix/globtest "$testdir" "*/*" | ${common_objpfx}posix/globtest "$testdir" "*/*" |
sort > $testout sort > $testout
cat <<"EOF" | cmp - $testout || result=1 cat <<"EOF" | cmp - $testout || result=1
`dir1/file1_1' `dir1/file1_1'
`dir1/file1_2' `dir1/file1_2'
not NULL
EOF EOF
# Test subdirs for invalid names
${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ ${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \
${common_objpfx}posix/globtest "$testdir" "*/1" | ${common_objpfx}posix/globtest "$testdir" "*/1" |
sort > $testout sort > $testout
cat <<"EOF" | cmp - $testout || result=1 cat <<"EOF" | cmp - $testout || result=1
GLOB_NOMATCH GLOB_NOMATCH
NULL
EOF EOF
# Test subdirs with wildcard
${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ ${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \
${common_objpfx}posix/globtest "$testdir" "*/*1_1" | ${common_objpfx}posix/globtest "$testdir" "*/*1_1" |
sort > $testout sort > $testout
cat <<"EOF" | cmp - $testout || result=1 cat <<"EOF" | cmp - $testout || result=1
`dir1/file1_1' `dir1/file1_1'
not NULL EOF
# Test subdirs with ?
${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \
${common_objpfx}posix/globtest "$testdir" "*/*?_?" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
`dir1/file1_1'
`dir1/file1_2'
EOF EOF
${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ ${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \
@ -64,7 +165,6 @@ ${common_objpfx}posix/globtest "$testdir" "*/file1_1" |
sort > $testout sort > $testout
cat <<"EOF" | cmp - $testout || result=1 cat <<"EOF" | cmp - $testout || result=1
`dir1/file1_1' `dir1/file1_1'
not NULL
EOF EOF
${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ ${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \
@ -72,7 +172,6 @@ ${common_objpfx}posix/globtest "$testdir" "*-/*" |
sort > $testout sort > $testout
cat <<"EOF" | cmp - $testout || result=1 cat <<"EOF" | cmp - $testout || result=1
GLOB_NOMATCH GLOB_NOMATCH
NULL
EOF EOF
${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \ ${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \
@ -80,11 +179,93 @@ ${common_objpfx}posix/globtest "$testdir" "*-" |
sort > $testout sort > $testout
cat <<"EOF" | cmp - $testout || result=1 cat <<"EOF" | cmp - $testout || result=1
GLOB_NOMATCH GLOB_NOMATCH
NULL EOF
# Test subdirs with ?
${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \
${common_objpfx}posix/globtest "$testdir" "*/*?_?" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
`dir1/file1_1'
`dir1/file1_2'
EOF
# Test tilde expansion
#${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \
#${common_objpfx}posix/globtest -q -t "$testdir" "~" |
#sort >$testout
#echo ~ > $testout2
#cmp $testout2 $testout || result=1
# Test tilde expansion with trailing slash
#${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \
#${common_objpfx}posix/globtest -q -t "$testdir" "~/" |
#sort > $testout
#echo ~/ > $testout2
#cmp $testout2 $testout || result=1
# Test tilde expansion with username
#${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \
#${common_objpfx}posix/globtest -q -t "$testdir" "~"$USER |
#sort > $testout
#eval echo ~$USER > $testout2
#cmp $testout2 $testout || result=1
# Tilde expansion shouldn't match a file
#${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \
#${common_objpfx}posix/globtest -t "$testdir" "~file4" |
#sort > $testout
#cat <<"EOF" | cmp - $testout || result=1
#GLOB_NOMATCH
#EOF
# Matching \** should only find *file6
${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \
${common_objpfx}posix/globtest "$testdir" "\**" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
`*file6'
EOF
# ... unless NOESCAPE is used, in which case it shouldn't match anything.
${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \
${common_objpfx}posix/globtest -e "$testdir" "\**" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
GLOB_NOMATCH
EOF
# Try a recursive failed search
${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \
${common_objpfx}posix/globtest -e "$testdir" "a*/*" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
GLOB_NOMATCH
EOF
# Try multiple patterns (GLOB_APPEND)
${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \
${common_objpfx}posix/globtest "$testdir" "file1" "*/*" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
`dir1/file1_1'
`dir1/file1_2'
`file1'
EOF
# Try multiple patterns (GLOB_APPEND) with offset (GLOB_DOOFFS)
${elf_objpfx}${rtld_installed_name} --library-path $common_objpfx \
${common_objpfx}posix/globtest -o "$testdir" "file1" "*/*" |
sort > $testout
cat <<"EOF" | cmp - $testout || result=1
`abc'
`dir1/file1_1'
`dir1/file1_2'
`file1'
EOF EOF
if test $result -eq 0; then if test $result -eq 0; then
rm -fr $testdir $testout rm -fr $testdir $testout
fi fi
exit $result exit $result

View File

@ -1 +0,0 @@
*LIB* lib

View File

@ -1,10 +1,39 @@
#include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include "fnmatch.h" #include "fnmatch.h"
struct {
const char *name;
const char *pattern;
int flags;
int expected;
} tests[] = {
{ "lib", "*LIB*", FNM_PERIOD, FNM_NOMATCH },
{ "lib", "*LIB*", FNM_CASEFOLD|FNM_PERIOD, 0 },
{ "a/b", "a[/]b", 0, 0 },
{ "a/b", "a[/]b", FNM_PATHNAME, FNM_NOMATCH },
{ "a/b", "[a-z]/[a-z]", 0, 0 },
};
int int
main (int c, char *v[]) main (void)
{ {
printf ("%d\n", fnmatch (v[1], v[2], FNM_PERIOD)); size_t i;
printf ("%d\n", fnmatch (v[1], v[2], FNM_CASEFOLD|FNM_PERIOD)); int errors = 0;
exit (0);
for (i = 0; i < sizeof (tests) / sizeof (*tests); i++)
{
int match;
match = fnmatch (tests[i].pattern, tests[i].name, tests[i].flags);
if (match != tests[i].expected)
{
printf ("%s %s %s\n", tests[i].pattern,
match == 0 ? "matches" : "does not match",
tests[i].name);
errors++;
}
}
exit (errors != 0);
} }

View File

@ -17,6 +17,7 @@ alpha.*-.*-linux.* libm=6.1
alpha.*-.*-.* libm=6 alpha.*-.*-.* libm=6
powerpc-.*-.* libm=6 powerpc-.*-.* libm=6
mips-.*-.* libm=6 mips-.*-.* libm=6
arm.*-.*-.* libm=6
# We provide libc.so.6 for Linux kernel versions 2.0 and later. # We provide libc.so.6 for Linux kernel versions 2.0 and later.
alpha.*-.*-linux.* libc=6.1 alpha.*-.*-linux.* libc=6.1
@ -36,6 +37,7 @@ i.86-.*-linux.* ld=ld-linux.so.2
sparc-.*-linux.* ld=ld-linux.so.2 sparc-.*-linux.* ld=ld-linux.so.2
sparc64-.*-linux.* ld=ld-linux64.so.2 sparc64-.*-linux.* ld=ld-linux64.so.2
alpha.*-.*-linux.* ld=ld-linux.so.2 alpha.*-.*-linux.* ld=ld-linux.so.2
arm.*-.*-linux.* ld=ld-linux.so.2
# We use the ELF ABI standard name for the default. # We use the ELF ABI standard name for the default.
.*-.*-.* ld=ld.so.1 .*-.*-.* ld=ld.so.1

View File

@ -128,27 +128,27 @@ extern int errno;
operating on `long long int's. */ operating on `long long int's. */
#ifdef QUAD #ifdef QUAD
# define LONG long long # define LONG long long
# undef LONG_MIN # define STRTOL_LONG_MIN LONG_LONG_MIN
# define LONG_MIN LONG_LONG_MIN # define STRTOL_LONG_MAX LONG_LONG_MAX
# undef LONG_MAX # define STRTOL_ULONG_MAX ULONG_LONG_MAX
# define LONG_MAX LONG_LONG_MAX
# undef ULONG_MAX
# define ULONG_MAX ULONG_LONG_MAX
# if __GNUC__ == 2 && __GNUC_MINOR__ < 7 # if __GNUC__ == 2 && __GNUC_MINOR__ < 7
/* Work around gcc bug with using this constant. */ /* Work around gcc bug with using this constant. */
static const unsigned long long int maxquad = ULONG_LONG_MAX; static const unsigned long long int maxquad = ULONG_LONG_MAX;
# undef ULONG_MAX # undef STRTOL_ULONG_MAX
# define ULONG_MAX maxquad # define STRTOL_ULONG_MAX maxquad
# endif # endif
#else #else
# define LONG long # define LONG long
#ifndef ULONG_MAX # ifndef ULONG_MAX
# define ULONG_MAX ((unsigned long) ~(unsigned long) 0) # define ULONG_MAX ((unsigned long) ~(unsigned long) 0)
#endif # endif
#ifndef LONG_MAX # ifndef LONG_MAX
# define LONG_MAX ((long int) (ULONG_MAX >> 1)) # define LONG_MAX ((long int) (ULONG_MAX >> 1))
#endif # endif
# define STRTOL_LONG_MIN LONG_MIN
# define STRTOL_LONG_MAX ULONG_MAX
# define STRTOL_ULONG_MAX ULONG_MAX
#endif #endif
@ -339,8 +339,8 @@ INTERNAL (strtol) (nptr, endptr, base, group LOCALE_PARAM)
#endif #endif
end = NULL; end = NULL;
cutoff = ULONG_MAX / (unsigned LONG int) base; cutoff = STRTOL_ULONG_MAX / (unsigned LONG int) base;
cutlim = ULONG_MAX % (unsigned LONG int) base; cutlim = STRTOL_ULONG_MAX % (unsigned LONG int) base;
overflow = 0; overflow = 0;
i = 0; i = 0;
@ -380,8 +380,8 @@ INTERNAL (strtol) (nptr, endptr, base, group LOCALE_PARAM)
`unsigned LONG int', but outside the range of `LONG int'. */ `unsigned LONG int', but outside the range of `LONG int'. */
if (overflow == 0 if (overflow == 0
&& i > (negative && i > (negative
? -((unsigned LONG int) (LONG_MIN + 1)) + 1 ? -((unsigned LONG int) (STRTOL_LONG_MIN + 1)) + 1
: (unsigned LONG int) LONG_MAX)) : (unsigned LONG int) STRTOL_LONG_MAX))
overflow = 1; overflow = 1;
#endif #endif
@ -389,9 +389,9 @@ INTERNAL (strtol) (nptr, endptr, base, group LOCALE_PARAM)
{ {
__set_errno (ERANGE); __set_errno (ERANGE);
#if UNSIGNED #if UNSIGNED
return ULONG_MAX; return STRTOL_ULONG_MAX;
#else #else
return negative ? LONG_MIN : LONG_MAX; return negative ? STRTOL_LONG_MIN : STRTOL_LONG_MAX;
#endif #endif
} }

View File

@ -398,35 +398,6 @@ elf_machine_rel (struct link_map *map, const Elf32_Rel *reloc,
break; break;
case R_ARM_GLOB_DAT: case R_ARM_GLOB_DAT:
case R_ARM_JUMP_SLOT: case R_ARM_JUMP_SLOT:
#if 0
#define _HEX(i) for (j=28; j>=0; j-=4) b[7-j/4]="0123456789abcdef"[((int)i>>j)&15];
{
char b[10];
int j;
_HEX(map->l_addr);
__asm__ (" mov r0, #2; mov r1, %0; mov r2, #9; swi 0x00900004; "
: : "r"(b) : "r0", "r1", "r2" );
_HEX(sym->st_size);
__asm__ (" mov r0, #2; mov r1, %0; mov r2, #9; swi 0x00900004; "
: : "r"(b) : "r0", "r1", "r2" );
_HEX(&sym->st_value);
__asm__ (" mov r0, #2; mov r1, %0; mov r2, #9; swi 0x00900004; "
: : "r"(b) : "r0", "r1", "r2" );
_HEX(sym->st_value);
__asm__ (" mov r0, #2; mov r1, %0; mov r2, #9; swi 0x00900004; "
: : "r"(b) : "r0", "r1", "r2" );
_HEX(sym);
__asm__ (" mov r0, #2; mov r1, %0; mov r2, #9; swi 0x00900004; "
: : "r"(b) : "r0", "r1", "r2" );
_HEX(reloc_addr);
__asm__ (" mov r0, #2; mov r1, %0; mov r2, #9; swi 0x00900004; "
: : "r"(b) : "r0", "r1", "r2" );
b[0]=' '; b[1]='\n';
__asm__ (" mov r0, #2; mov r1, %0; mov r2, #2; swi 0x00900004; "
: : "r"(b) : "r0", "r1", "r2" );
}
#endif
*reloc_addr = value; *reloc_addr = value;
break; break;
case R_ARM_ABS32: case R_ARM_ABS32:
@ -451,7 +422,12 @@ __asm__ (" mov r0, #2; mov r1, %0; mov r2, #2; swi 0x00900004; "
break; break;
} }
case R_ARM_PC24: case R_ARM_PC24:
*reloc_addr += (value - (Elf32_Addr) reloc_addr); {
long int disp = (value - (Elf32_Addr) reloc_addr) / 4;
if ((disp >= (1<<24)) || (disp <= -(1<<24)))
assert (! "address out of range for PC24 reloc");
*reloc_addr += disp;
}
break; break;
default: default:
assert (! "unexpected dynamic reloc type"); assert (! "unexpected dynamic reloc type");

View File

@ -1,5 +1,5 @@
/* Machine-dependent definitions for profiling support. ARM version. /* Machine-dependent definitions for profiling support. ARM version.
Copyright (C) 1996, 1997 Free Software Foundation, Inc. Copyright (C) 1996, 1997, 1998 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
@ -37,19 +37,29 @@ static void mcount_internal (u_long frompc, u_long selfpc);
#define _MCOUNT_DECL(frompc, selfpc) \ #define _MCOUNT_DECL(frompc, selfpc) \
static void mcount_internal (u_long frompc, u_long selfpc) static void mcount_internal (u_long frompc, u_long selfpc)
#define MCOUNT \ /* This macro/func MUST save r0, r1 because the compiler inserts
void _mcount (void) \ blind calls to _mount(), ignoring the fact that _mcount may
{ \ clobber registers; therefore, _mcount may NOT clobber registers */
register unsigned long int frompc, selfpc; \ /* if (this_fp!=0) {
__asm__("movs fp, fp; " \ r0 = this_lr
"moveq %0, $0; " \ r1 = this_fp
"ldrne %0, [fp, $-4]; " \ r1 = [r1-4] which is caller's fp
"ldrne %1, [fp, $-12]; " \ if (r1!=0)
"movnes %1, %1; " \ r1 = caller's lr
"ldrne %1, [%1, $-4]; " \ call mcount_internal(this_lr, caller's_lr)
: "=g" (selfpc), "=g" (frompc) \ }
: : "cc" \ */
); \ #define MCOUNT \
if (selfpc) \ void _mcount (void) \
mcount_internal(frompc, selfpc); \ { \
__asm__("stmdb sp!, {r0, r1, r2, r3};" \
"movs fp, fp;" \
"moveq r0, #0;" \
"ldrne r0, [fp, $-4];" \
"ldrne r1, [fp, $-12];" \
"movnes r1, r1;" \
"ldrne r1, [r1, $-4];" \
"movs r1, r1;" \
"blne mcount_internal;" \
"ldmia sp!, {r0, r1, r2, r3}"); \
} }

View File

@ -73,10 +73,10 @@
/* If compiled for profiling, call `mcount' at the start of each function. */ /* If compiled for profiling, call `mcount' at the start of each function. */
#ifdef PROF #ifdef PROF
/* The mcount code relies on a normal frame pointer being on the stack #define CALL_MCOUNT \
to locate our caller, so push one just for its benefit. */ str lr,[sp, #-4]! \
#define CALL_MCOUNT \ bl PLTJMP(mcount) \
#error Profiling not supported. ldr lr, [sp], #4
#else #else
#define CALL_MCOUNT /* Do nothing. */ #define CALL_MCOUNT /* Do nothing. */
#endif #endif

View File

@ -20,18 +20,18 @@
#ifndef _FPU_CONTROL_H #ifndef _FPU_CONTROL_H
#define _FPU_CONTROL_H #define _FPU_CONTROL_H
#define _FPU_RESERVED ??? /* These bits are reserved are not changed. */ #define _FPU_RESERVED 0xffffffff /* These bits are reserved and not changed. */
/* The fdlibm code requires no interrupts for exceptions. Don't /* The fdlibm code requires no interrupts for exceptions. Don't
change the rounding mode, it would break long double I/O! */ change the rounding mode, it would break long double I/O! */
#define _FPU_DEFAULT 0x00000000 /* Default value. */ #define _FPU_DEFAULT 0x00000000 /* Default value. */
/* Type of the control word. */ /* Type of the control word. */
typedef unsigned int fpu_control_t __attribute__ ((__mode__ (__?I__))); typedef unsigned int fpu_control_t;
/* Macros for accessing the hardware control word. */ /* Macros for accessing the hardware control word. */
#define _FPU_GETCW(cw) __asm__ ("fetch fpu control word into %0" : "=g" (cw)) #define _FPU_GETCW(cw) 0
#define _FPU_SETCW(cw) __asm__ ("set fpu control word to %0" : : "g" (cw)) #define _FPU_SETCW(cw) do { } while (0)
/* Default control word set at startup. */ /* Default control word set at startup. */
extern fpu_control_t __fpu_control; extern fpu_control_t __fpu_control;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1991, 1995, 1996, 1997, 1998 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
@ -25,7 +25,7 @@
The buffers are filled in the order specified. The buffers are filled in the order specified.
Operates just like `read' (see <unistd.h>) except that data are Operates just like `read' (see <unistd.h>) except that data are
put in VECTOR instead of a contiguous buffer. */ put in VECTOR instead of a contiguous buffer. */
int ssize_t
__readv (fd, vector, count) __readv (fd, vector, count)
int fd; int fd;
const struct iovec *vector; const struct iovec *vector;

View File

@ -1,4 +1,4 @@
/* Copyright (C) 1991, 1995, 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1991, 1995, 1996, 1997, 1998 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
@ -25,7 +25,7 @@
The data is written in the order specified. The data is written in the order specified.
Operates just like `write' (see <unistd.h>) except that the data Operates just like `write' (see <unistd.h>) except that the data
are taken from VECTOR instead of a contiguous buffer. */ are taken from VECTOR instead of a contiguous buffer. */
int ssize_t
__writev (fd, vector, count) __writev (fd, vector, count)
int fd; int fd;
const struct iovec *vector; const struct iovec *vector;

View File

@ -91,7 +91,9 @@ __ieee754_exp (double x)
fenv_t oldenv; fenv_t oldenv;
feholdexcept (&oldenv); feholdexcept (&oldenv);
#ifdef FE_TONEAREST
fesetround (FE_TONEAREST); fesetround (FE_TONEAREST);
#endif
/* Calculate n. */ /* Calculate n. */
n = x * M_1_LN2 + THREEp51; n = x * M_1_LN2 + THREEp51;

View File

@ -87,7 +87,9 @@ __ieee754_expf (float x)
fenv_t oldenv; fenv_t oldenv;
feholdexcept (&oldenv); feholdexcept (&oldenv);
#ifdef FE_TONEAREST
fesetround (FE_TONEAREST); fesetround (FE_TONEAREST);
#endif
/* Calculate n. */ /* Calculate n. */
n = x * M_1_LN2 + THREEp22; n = x * M_1_LN2 + THREEp22;

View File

@ -0,0 +1,49 @@
/* brk system call for Linux/ARM.
Copyright (C) 1995, 1996 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU 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;
int
__brk (void *addr)
{
void *newbrk;
asm ("mov a1, %1\n" /* save the argment in r0 */
"swi %2\n" /* do the system call */
"mov %0, a1;" /* keep the return value */
: "=r"(newbrk)
: "r"(addr), "i" (SYS_ify (brk))
: "a1");
__curbrk = newbrk;
if (newbrk < addr)
{
__set_errno (ENOMEM);
return -1;
}
return 0;
}
weak_alias (__brk, brk)

View File

@ -1,5 +1,6 @@
/* Copyright (C) 1996, 1997 Free Software Foundation, Inc. /* Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library. This file is part of the GNU C Library.
Contributed by Pat Beirne <patb@corelcomputer.com>
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
@ -27,7 +28,38 @@
.text .text
ENTRY(__clone) ENTRY(__clone)
/* Somebody needs to write this. */ @ sanity check args
cmp r0, #0
cmpne r1, #0
moveq r0, #-EINVAL
beq PLTJMP(syscall_error)
@ insert the args onto the new stack
sub r1, r1, #8
str r3, [r1, #4]
@ save the function pointer as the 0th element
str r0, [r1]
@ do the system call
@ get flags
mov r0, r2
@ new sp is already in r1
swi SYS_ify(clone)
cmp r0, #0
blt PLTJMP(syscall_error)
beq thread_start
@ else, thread was launched...
mov pc, lr
thread_start:
@ pick the function arg and call address off the stack and execute
ldr r0, [sp, #4]
mov lr, pc
ldr pc, [sp]
@ and we are done, passing the return value through r0
bl PLTJMP(_exit)
PSEUDO_END (__clone) PSEUDO_END (__clone)
weak_alias (__clone, clone) weak_alias (__clone, clone)

View File

@ -0,0 +1,75 @@
/* Copyright (C) 1997, 1998 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
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 <stddef.h>
#include <signal.h>
#include <sizes.h>
#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
# define SYS_SIGLIST __new_sys_siglist
# define SYS_SIGABBREV __new_sys_sigabbrev
#else
# define SYS_SIGLIST _sys_siglist
# define SYS_SIGABBREV _sys_sigabbrev
#endif
#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
asm (".data; .globl __old_sys_siglist; __old_sys_siglist:");
#endif
const char *const SYS_SIGLIST[NSIG] =
{
#define init_sig(sig, abbrev, desc) [sig] desc,
#include "siglist.h"
#undef init_sig
};
#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
asm (".type __old_sys_siglist,%object;.size __old_sys_siglist,"
OLD_SIGLIST_SIZE_STR "*" PTR_SIZE_STR);
asm (".data; .globl __old_sys_sigabbrev; __old_sys_sigabbrev:");
#endif
const char *const SYS_SIGABBREV[NSIG] =
{
#define init_sig(sig, abbrev, desc) [sig] abbrev,
#include "siglist.h"
#undef init_sig
};
#if defined HAVE_ELF && defined PIC && defined DO_VERSIONING
asm (".type __old_sys_sigabbrev,%object;.size __old_sys_sigabbrev,"
OLD_SIGLIST_SIZE_STR "*" PTR_SIZE_STR);
extern const char *const *__old_sys_siglist;
extern const char *const *__old_sys_sigabbrev;
strong_alias (__old_sys_siglist, _old_sys_siglist)
symbol_version (__old_sys_siglist, _sys_siglist, GLIBC_2.0);
symbol_version (_old_sys_siglist, sys_siglist, GLIBC_2.0);
symbol_version (__old_sys_sigabbrev, sys_sigabbrev, GLIBC_2.0);
strong_alias (__new_sys_siglist, _new_sys_siglist)
default_symbol_version (__new_sys_siglist, _sys_siglist, GLIBC_2.1);
default_symbol_version (_new_sys_siglist, sys_siglist, GLIBC_2.1);
default_symbol_version (__new_sys_sigabbrev, sys_sigabbrev, GLIBC_2.1);
#else
weak_alias (_sys_siglist, sys_siglist)
weak_alias (_sys_sigabbrev, sys_sigabbrev)
#endif