diff options
34 files changed, 297 insertions, 124 deletions
diff --git a/ChangeLog b/ChangeLog index 44484f0f85..95218d9252 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,31 @@ +2004-07-05 Ulrich Drepper <drepper@redhat.com> + + * elf/dl-init.c: Don't define and use _dl_starting_up if + HAVE_INLINED_SYSCALLS is defined and the variable is not used. + * elf/dl-support.c: Likewise. + * elf/rtld.c: Likewise. + * elf/dl-misc.c (_dl_debug_vdprintf): Use writev syscall directly + if HAVE_INLINED_SYSCALLS is defined. + * sysdeps/powerpc/powerpc64/dl-machine.h: Don't rest _dl_starting_up + here. + * sysdeps/powerpc/powerpc32/dl-start.S: Likewise. + * sysdeps/unix/sysv/linux/configure.in: Define HAVE_INLINED_SYSCALLS. + * config.h.in: Add entry for HAVE_INLINED_SYSCALLS. + + * sysdeps/posix/profil.c: If compiled for ld.so, omit code which + is needed to stop profiling. + * elf/dl-open.c (dl_open_worker): If a newly opened object is to be + profile make sure it cannot be unloaded. + + * sysdeps/unix/sysv/linux/dl-origin.c: Inline readlink syscall. + + * sysdeps/unix/sysv/linux/fcntl.c: If compiled without cancellation + support, make sure the helper function is inlined. + * sysdeps/unix/sysv/linux/pread.c: Likewise. + * sysdeps/unix/sysv/linux/pwrite.c: Likewise. + * sysdeps/unix/sysv/linux/i386/fcntl.c: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c: Likewise. + 2004-07-05 Jakub Jelinek <jakub@redhat.com> * include/string.h (ffs): Add libc_hidden_builtin_proto. diff --git a/config.h.in b/config.h.in index 86b1e39a7e..c02d691883 100644 --- a/config.h.in +++ b/config.h.in @@ -208,6 +208,9 @@ /* Defined of libidn is available. */ #undef HAVE_LIBIDN +/* Define if inlined system calls are available. */ +#undef HAVE_INLINED_SYSCALLS + /* */ diff --git a/elf/dl-init.c b/elf/dl-init.c index c06c71bbeb..e700dffb3a 100644 --- a/elf/dl-init.c +++ b/elf/dl-init.c @@ -24,9 +24,11 @@ /* Type of the initializer. */ typedef void (*init_t) (int, char **, char **); +#ifndef HAVE_INLINED_SYSCALLS /* Flag, nonzero during startup phase. */ extern int _dl_starting_up; extern int _dl_starting_up_internal attribute_hidden; +#endif static void @@ -143,7 +145,9 @@ _dl_init (struct link_map *main_map, int argc, char **argv, char **env) r->r_state = RT_CONSISTENT; _dl_debug_state (); +#ifndef HAVE_INLINED_SYSCALLS /* Finished starting up. */ INTUSE(_dl_starting_up) = 0; +#endif } INTDEF (_dl_init) diff --git a/elf/dl-misc.c b/elf/dl-misc.c index 41ef26131d..08d64956b8 100644 --- a/elf/dl-misc.c +++ b/elf/dl-misc.c @@ -247,7 +247,7 @@ _dl_debug_vdprintf (int fd, int tag_p, const char *fmt, va_list arg) } /* Finally write the result. */ -#ifdef INTERNAL_SYSCALL +#ifdef HAVE_INLINED_SYSCALLS INTERNAL_SYSCALL_DECL (err); INTERNAL_SYSCALL (writev, err, 3, fd, &iov, niov); #elif RTLD_PRIVATE_ERRNO diff --git a/elf/dl-open.c b/elf/dl-open.c index 70f2fb20bc..450024948a 100644 --- a/elf/dl-open.c +++ b/elf/dl-open.c @@ -297,8 +297,13 @@ dl_open_worker (void *a) GLRO(dl_relocate_object) (l, l->l_scope, 1, 1); if (old_profile_map == NULL && GL(dl_profile_map) != NULL) - /* We must prepare the profiling. */ - GLRO(dl_start_profile) (); + { + /* We must prepare the profiling. */ + GLRO(dl_start_profile) (); + + /* Prevent unloading the object. */ + GL(dl_profile_map)->l_flags_1 |= DF_1_NODELETE; + } } else #endif diff --git a/elf/dl-profile.c b/elf/dl-profile.c index 8afa8350c2..0a4aba1be5 100644 --- a/elf/dl-profile.c +++ b/elf/dl-profile.c @@ -358,7 +358,7 @@ _dl_start_profile (void) return; } - /* We don't need the file desriptor anymore. */ + /* We don't need the file descriptor anymore. */ __close (fd); /* Pointer to data after the header. */ diff --git a/elf/dl-support.c b/elf/dl-support.c index 0b2d0243de..2b53770605 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -86,8 +86,10 @@ struct r_scope_elem *_dl_global_scope[2] = { &_dl_initial_searchlist, NULL }; to be the global scope. */ struct r_scope_elem *_dl_main_searchlist = &_dl_initial_searchlist; +#ifndef HAVE_INLINED_SYSCALLS /* Nonzero during startup. */ int _dl_starting_up = 1; +#endif /* Get architecture specific initializer. */ #include <dl-procinfo.c> diff --git a/elf/rtld.c b/elf/rtld.c index 2e7a9b6867..3def0306e2 100644 --- a/elf/rtld.c +++ b/elf/rtld.c @@ -79,6 +79,7 @@ INTDEF(_dl_argv) /* Nonzero if we were run directly. */ unsigned int _dl_skip_args attribute_relro attribute_hidden; +#ifndef HAVE_INLINED_SYSCALLS /* Set nonzero during loading and initialization of executable and libraries, cleared before the executable's entry point runs. This must not be initialized to nonzero, because the unused dynamic @@ -88,6 +89,7 @@ unsigned int _dl_skip_args attribute_relro attribute_hidden; never be called. */ int _dl_starting_up = 0; INTVARDEF(_dl_starting_up) +#endif /* This is the structure which defines all variables global to ld.so (except those which cannot be added for some reason). */ @@ -720,8 +722,10 @@ dl_main (const ElfW(Phdr) *phdr, /* Process the environment variable which control the behaviour. */ process_envvars (&mode); +#ifndef HAVE_INLINED_SYSCALLS /* Set up a flag which tells we are just starting. */ INTUSE(_dl_starting_up) = 1; +#endif if (*user_entry == (ElfW(Addr)) ENTRY_POINT) { diff --git a/nptl/ChangeLog b/nptl/ChangeLog index ca178dffc5..f96550a979 100644 --- a/nptl/ChangeLog +++ b/nptl/ChangeLog @@ -1,3 +1,20 @@ +2004-07-05 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/unix/sysv/linux/i386/sysdep-cancel.h: Define NO_CANCELLATION + if no cancellation support is needed. + * sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/sh/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h: Likewise. + * sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h: Likewise. + + * sysdeps/unix/sysv/linux/powerpc/lowlevellock.h: Define __NR_futex + only if not already defined. + 2004-07-05 Jakub Jelinek <jakub@redhat.com> * sysdeps/unix/sysv/linux/x86_64/lowlevellock.h (lll_unlock): Use diff --git a/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h index 0dead61c6a..8142455781 100644 --- a/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h +++ b/nptl/sysdeps/unix/sysv/linux/i386/sysdep-cancel.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek <jakub@redhat.com>, 2002. @@ -99,30 +99,30 @@ L(ENDFDE): \ .previous -#ifdef SHARED +# ifdef SHARED /* NUL-terminated augmentation string. Note "z" means there is an augmentation value later on. */ -# define AUGMENTATION_STRING .string "zR" -# define AUGMENTATION_PARAM \ +# define AUGMENTATION_STRING .string "zR" +# define AUGMENTATION_PARAM \ /* Augmentation value length. */ \ .uleb128 1; \ /* Encoding: DW_EH_PE_pcrel + DW_EH_PE_sdata4. */ \ .byte 0x1b; -# define AUGMENTATION_PARAM_FDE \ +# define AUGMENTATION_PARAM_FDE \ /* No augmentation data. */ \ .uleb128 0; -# define START_SYMBOL_REF(name) \ +# define START_SYMBOL_REF(name) \ /* PC-relative start address of the code. */ \ .long L(name##START)-. -#else +# else /* No augmentation. */ -# define AUGMENTATION_STRING .ascii "\0" -# define AUGMENTATION_PARAM /* nothing */ -# define AUGMENTATION_PARAM_FDE /* nothing */ -# define START_SYMBOL_REF(name) \ +# define AUGMENTATION_STRING .ascii "\0" +# define AUGMENTATION_PARAM /* nothing */ +# define AUGMENTATION_PARAM_FDE /* nothing */ +# define START_SYMBOL_REF(name) \ /* Absolute start address of the code. */ \ .long L(name##START) -#endif +# endif /* Callframe description for syscalls without parameters. This is very simple. The only place the stack pointer is changed is when the old @@ -373,7 +373,7 @@ #elif !defined __ASSEMBLER__ -/* This code should never be used but we define it anyhow. */ # define SINGLE_THREAD_P (1) +# define NO_CANCELLATION 1 #endif diff --git a/nptl/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h index 619f28c4aa..63aaa96eb0 100644 --- a/nptl/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h +++ b/nptl/sysdeps/unix/sysv/linux/ia64/sysdep-cancel.h @@ -216,7 +216,7 @@ __GC_##name: \ #elif !defined __ASSEMBLER__ -/* This code should never be used but we define it anyhow. */ # define SINGLE_THREAD_P (1) +# define NO_CANCELLATION 1 #endif diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h b/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h index ead89ba931..2bee000730 100644 --- a/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h +++ b/nptl/sysdeps/unix/sysv/linux/powerpc/lowlevellock.h @@ -26,7 +26,9 @@ #include <atomic.h> -#define __NR_futex 221 +#ifndef __NR_futex +# define __NR_futex 221 +#endif #define FUTEX_WAIT 0 #define FUTEX_WAKE 1 #define FUTEX_REQUEUE 3 diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h index 41e6af4749..7f5ba4aeef 100644 --- a/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h +++ b/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h @@ -1,5 +1,5 @@ /* Cancellable system call stubs. Linux/PowerPC version. - Copyright (C) 2003 Free Software Foundation, Inc. + Copyright (C) 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Franz Sirl <Franz.Sirl-kernel@lauterbach.com>, 2003. @@ -109,7 +109,7 @@ #elif !defined __ASSEMBLER__ -/* This code should never be used but we define it anyhow. */ # define SINGLE_THREAD_P (1) +# define NO_CANCELLATION 1 #endif diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h index c7fe41dea9..aa993b9a58 100644 --- a/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h +++ b/nptl/sysdeps/unix/sysv/linux/powerpc/powerpc64/sysdep-cancel.h @@ -1,5 +1,5 @@ /* Cancellable system call stubs. Linux/PowerPC64 version. - Copyright (C) 2003 Free Software Foundation, Inc. + Copyright (C) 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Franz Sirl <Franz.Sirl-kernel@lauterbach.com>, 2003. @@ -109,7 +109,7 @@ #elif !defined __ASSEMBLER__ -/* This code should never be used but we define it anyhow. */ # define SINGLE_THREAD_P (1) +# define NO_CANCELLATION 1 #endif diff --git a/nptl/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h index bbbd30b71f..09dac2c90b 100644 --- a/nptl/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h +++ b/nptl/sysdeps/unix/sysv/linux/s390/s390-32/sysdep-cancel.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. +/* Copyright (C) 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. @@ -109,7 +109,7 @@ L(pseudo_end): #elif !defined __ASSEMBLER__ -/* This code should never be used but we define it anyhow. */ # define SINGLE_THREAD_P (1) +# define NO_CANCELLATION 1 #endif diff --git a/nptl/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h index 2daf5944e4..f8eb6a9ebc 100644 --- a/nptl/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h +++ b/nptl/sysdeps/unix/sysv/linux/s390/s390-64/sysdep-cancel.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2003 Free Software Foundation, Inc. +/* Copyright (C) 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek <jakub@redhat.com>, 2003. @@ -122,7 +122,7 @@ extern int __local_multiple_threads attribute_hidden; #elif !defined __ASSEMBLER__ -/* This code should never be used but we define it anyhow. */ # define SINGLE_THREAD_P (1) +# define NO_CANCELLATION 1 #endif diff --git a/nptl/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h index 581046c007..fc3c2340b6 100644 --- a/nptl/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h +++ b/nptl/sysdeps/unix/sysv/linux/sh/sysdep-cancel.h @@ -241,7 +241,7 @@ #elif !defined __ASSEMBLER__ -/* This code should never be used but we define it anyhow. */ # define SINGLE_THREAD_P (1) +# define NO_CANCELLATION 1 #endif diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h index 193f21013c..5edf4b3772 100644 --- a/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h +++ b/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sysdep-cancel.h @@ -107,7 +107,7 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler2) \ #elif !defined __ASSEMBLER__ -/* This code should never be used but we define it anyhow. */ # define SINGLE_THREAD_P (1) +# define NO_CANCELLATION 1 #endif diff --git a/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h index cc2c2e95eb..d8c65aeffd 100644 --- a/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h +++ b/nptl/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h @@ -101,7 +101,7 @@ SYSCALL_ERROR_HANDLER_ENTRY(__syscall_error_handler2) \ #elif !defined __ASSEMBLER__ -/* This code should never be used but we define it anyhow. */ # define SINGLE_THREAD_P (1) +# define NO_CANCELLATION 1 #endif diff --git a/nptl/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h b/nptl/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h index f8d726ddd8..d47c1b80dc 100644 --- a/nptl/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h +++ b/nptl/sysdeps/unix/sysv/linux/x86_64/sysdep-cancel.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Jakub Jelinek <jakub@redhat.com>, 2002. @@ -132,7 +132,7 @@ extern int __local_multiple_threads attribute_hidden; #elif !defined __ASSEMBLER__ -/* This code should never be used but we define it anyhow. */ # define SINGLE_THREAD_P (1) +# define NO_CANCELLATION 1 #endif diff --git a/sysdeps/generic/configure b/sysdeps/generic/configure index a01e019ec4..47f9ec0d5e 100755 --- a/sysdeps/generic/configure +++ b/sysdeps/generic/configure @@ -13,15 +13,28 @@ if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. */ -#include <assert.h> + which can conflict with char $ac_func (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef $ac_func + /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" @@ -45,18 +58,28 @@ char (*f) () = $ac_func; int main () { - +return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -69,7 +92,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 diff --git a/sysdeps/posix/profil.c b/sysdeps/posix/profil.c index d789c121cd..3c2e1dfa07 100644 --- a/sysdeps/posix/profil.c +++ b/sysdeps/posix/profil.c @@ -1,5 +1,5 @@ /* Low-level statistical profiling support function. Mostly POSIX.1 version. - Copyright (C) 1996,97,98,2002 Free Software Foundation, Inc. + Copyright (C) 1996,97,98,2002, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -62,10 +62,13 @@ profil_count (void *pc) int __profil (u_short *sample_buffer, size_t size, size_t offset, u_int scale) { - static struct sigaction oact; - static struct itimerval otimer; struct sigaction act; struct itimerval timer; +#ifndef IS_IN_rtld + static struct sigaction oact; + static struct itimerval otimer; +# define oact_ptr &oact +# define otimer_ptr &otimer if (sample_buffer == NULL) { @@ -88,6 +91,12 @@ __profil (u_short *sample_buffer, size_t size, size_t offset, u_int scale) || __sigaction (SIGPROF, &oact, NULL) < 0) return -1; } +#else + /* In ld.so profiling should never be disabled once it runs. */ + //assert (sample_buffer != NULL); +# define oact_ptr NULL +# define otimer_ptr NULL +#endif samples = sample_buffer; nsamples = size / sizeof *samples; @@ -97,13 +106,13 @@ __profil (u_short *sample_buffer, size_t size, size_t offset, u_int scale) act.sa_handler = (sighandler_t) &profil_counter; act.sa_flags = SA_RESTART; __sigfillset (&act.sa_mask); - if (__sigaction (SIGPROF, &act, &oact) < 0) + if (__sigaction (SIGPROF, &act, oact_ptr) < 0) return -1; timer.it_value.tv_sec = 0; timer.it_value.tv_usec = 1; timer.it_interval = timer.it_value; - return __setitimer (ITIMER_PROF, &timer, &otimer); + return __setitimer (ITIMER_PROF, &timer, otimer_ptr); } weak_alias (__profil, profil) diff --git a/sysdeps/powerpc/powerpc32/dl-start.S b/sysdeps/powerpc/powerpc32/dl-start.S index 527982bfdf..d72202d4a4 100644 --- a/sysdeps/powerpc/powerpc32/dl-start.S +++ b/sysdeps/powerpc/powerpc32/dl-start.S @@ -1,5 +1,5 @@ /* Machine-dependent ELF startup code. PowerPC version. - Copyright (C) 1995-2000, 2002 Free Software Foundation, Inc. + Copyright (C) 1995-2000, 2002, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -83,7 +83,6 @@ ENTRY(_dl_start_user) lwz r7,_dl_fini@got(r31) /* Now, call the start function in r30... */ mtctr r30 - lwz r26,_dl_starting_up@got(r31) /* Pass the stack pointer in r1 (so far so good), pointing to a NULL value. (This lets our startup code distinguish between a program linked statically, which linux will call with argc on top of the stack which will hopefully @@ -98,8 +97,6 @@ ENTRY(_dl_start_user) stw r31,4(r1) stw r31,8(r1) stw r31,12(r1) -/* Clear _dl_starting_up. */ - stw r31,0(r26) /* Go do it! */ bctr END(_start) diff --git a/sysdeps/powerpc/powerpc64/dl-machine.h b/sysdeps/powerpc/powerpc64/dl-machine.h index 3edbadf6a4..2a090ec96e 100644 --- a/sysdeps/powerpc/powerpc64/dl-machine.h +++ b/sysdeps/powerpc/powerpc64/dl-machine.h @@ -194,6 +194,15 @@ elf_machine_dynamic (void) strong_alias (_dl_runtime_resolve, _dl_profile_resolve); #endif +#ifdef HAVE_INLINED_SYSCALLS +/* We do not need _dl_starting_up. */ +# define DL_STARTING_UP_DEF +#else +# define DL_STARTING_UP_DEF \ +".LC__dl_starting_up:\n" \ +" .tc _dl_starting_up_internal[TC],_dl_starting_up_internal\n" +#endif + /* Initial entry point code for the dynamic linker. The C function `_dl_start' is the real entry point; its return value is the user @@ -239,17 +248,16 @@ elf_machine_dynamic (void) "_dl_start_user:\n" \ " .quad ._dl_start_user, .TOC.@tocbase, 0\n" \ " .previous\n" \ -" .section \".toc\",\"aw\"\n" \ -".LC__dl_starting_up:\n" \ -" .tc _dl_starting_up_internal[TC],_dl_starting_up_internal\n" \ -".LC__rtld_global:\n" \ -" .tc _rtld_global[TC],_rtld_global\n" \ -".LC__dl_argc:\n" \ -" .tc _dl_argc[TC],_dl_argc\n" \ -".LC__dl_argv:\n" \ -" .tc _dl_argv_internal[TC],_dl_argv_internal\n" \ -".LC__dl_fini:\n" \ -" .tc _dl_fini[TC],_dl_fini\n" \ +" .section \".toc\",\"aw\"\n" \ +DL_STARTING_UP_DEF \ +".LC__rtld_global:\n" \ +" .tc _rtld_global[TC],_rtld_global\n" \ +".LC__dl_argc:\n" \ +" .tc _dl_argc[TC],_dl_argc\n" \ +".LC__dl_argv:\n" \ +" .tc _dl_argv_internal[TC],_dl_argv_internal\n" \ +".LC__dl_fini:\n" \ +" .tc _dl_fini[TC],_dl_fini\n" \ " .previous\n" \ " .globl ._dl_start_user\n" \ " .type ._dl_start_user,@function\n" \ @@ -291,8 +299,7 @@ elf_machine_dynamic (void) " addi 6,6,8\n" \ /* Pass a termination function pointer (in this case _dl_fini) in \ r7. */ \ -" ld 7,.LC__dl_fini@toc(2)\n" \ -" ld 26,.LC__dl_starting_up@toc(2)\n" \ +" ld 7,.LC__dl_fini@toc(2)\n" \ /* Pass the stack pointer in r1 (so far so good), pointing to a NULL \ value. This lets our startup code distinguish between a program \ linked statically, which linux will call with argc on top of the \ @@ -307,8 +314,6 @@ elf_machine_dynamic (void) " std 31,8(1)\n" \ " std 31,16(1)\n" \ " std 31,24(1)\n" \ -/* Clear _dl_starting_up. */ \ -" stw 31,0(26)\n" \ /* Now, call the start function descriptor at r30... */ \ " .globl ._dl_main_dispatch\n" \ "._dl_main_dispatch:\n" \ diff --git a/sysdeps/unix/common/configure b/sysdeps/unix/common/configure index 9112edee33..7bbc9cb2e5 100755 --- a/sysdeps/unix/common/configure +++ b/sysdeps/unix/common/configure @@ -10,15 +10,12 @@ if test "${ac_cv_check_symbol_sys_siglist+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" - -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + int main () { @@ -29,11 +26,21 @@ extern char *sys_siglist[]; puts(*sys_siglist); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -42,10 +49,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_check_symbol_sys_siglist=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_check_symbol_sys_siglist=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext fi if test "$ac_cv_check_symbol_sys_siglist" = yes; then @@ -63,15 +72,12 @@ if test "${ac_cv_check_symbol__sys_siglist+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" - -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + int main () { @@ -82,11 +88,21 @@ extern char *_sys_siglist[]; puts(*_sys_siglist); _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -95,10 +111,12 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 ac_cv_check_symbol__sys_siglist=yes else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + ac_cv_check_symbol__sys_siglist=no fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext fi if test "$ac_cv_check_symbol__sys_siglist" = yes; then @@ -120,15 +138,12 @@ if test "${libc_cv_ctype_glue+set}" = set; then else for ctype in _ctype_ __ctype_ __ctype _ctype__ _ctype _locp; do cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" -#include "confdefs.h" +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ #include <ctype.h> -#ifdef F77_DUMMY_MAIN -# ifdef __cplusplus - extern "C" -# endif - int F77_DUMMY_MAIN() { return 1; } -#endif int main () { @@ -139,11 +154,21 @@ $ctype[13]; _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -152,9 +177,11 @@ if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 libc_cv_ctype_glue="$ctype"; break else echo "$as_me: failed program was:" >&5 -cat conftest.$ac_ext >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext done fi diff --git a/sysdeps/unix/configure b/sysdeps/unix/configure index 75dc5896a0..b910353cd9 100755 --- a/sysdeps/unix/configure +++ b/sysdeps/unix/configure @@ -14,15 +14,28 @@ if eval "test \"\${$as_ac_var+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext cat >>conftest.$ac_ext <<_ACEOF /* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case <limits.h> declares $ac_func. + For example, HP-UX 11i <limits.h> declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + /* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func (); below. */ -#include <assert.h> + which can conflict with char $ac_func (); below. + Prefer <limits.h> to <assert.h> if __STDC__ is defined, since + <limits.h> exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include <limits.h> +#else +# include <assert.h> +#endif + +#undef $ac_func + /* Override any gcc2 internal prototype to avoid an error. */ #ifdef __cplusplus extern "C" @@ -46,18 +59,28 @@ char (*f) () = $ac_func; int main () { - +return f != $ac_func; ; return 0; } _ACEOF rm -f conftest.$ac_objext conftest$ac_exeext if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 - (eval $ac_link) 2>&5 + (eval $ac_link) 2>conftest.er1 ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 echo "$as_me:$LINENO: \$? = $ac_status" >&5 (exit $ac_status); } && - { ac_try='test -s conftest$ac_exeext' + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 (eval $ac_try) 2>&5 ac_status=$? @@ -70,7 +93,8 @@ sed 's/^/| /' conftest.$ac_ext >&5 eval "$as_ac_var=no" fi -rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext fi echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 diff --git a/sysdeps/unix/sysv/linux/configure b/sysdeps/unix/sysv/linux/configure index 89484200ce..d059143396 100644 --- a/sysdeps/unix/sysv/linux/configure +++ b/sysdeps/unix/sysv/linux/configure @@ -43,7 +43,6 @@ if test "${libc_cv_linux2010+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" >&6 else cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -172,7 +171,6 @@ echo $ECHO_N "checking for kernel header at least $minimum_kernel... $ECHO_C" >& decnum=`echo "$minimum_kernel.0.0.0" | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/(\1 * 65536 + \2 * 256 + \3)/'`; abinum=`echo "$minimum_kernel.0.0.0" | sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1,\2,\3/'`; cat >conftest.$ac_ext <<_ACEOF -#line $LINENO "configure" /* confdefs.h. */ _ACEOF cat confdefs.h >>conftest.$ac_ext @@ -379,3 +377,9 @@ ${ac_prefix}/include directory out of the way." >&2;} echo "${ECHO_T}ok" >&6 fi fi + +# We have inlined syscalls. +cat >>confdefs.h <<\_ACEOF +#define HAVE_INLINED_SYSCALLS 1 +_ACEOF + diff --git a/sysdeps/unix/sysv/linux/configure.in b/sysdeps/unix/sysv/linux/configure.in index f0a7fb1231..e3fccb4c9b 100644 --- a/sysdeps/unix/sysv/linux/configure.in +++ b/sysdeps/unix/sysv/linux/configure.in @@ -305,3 +305,6 @@ ${ac_prefix}/include directory out of the way.]) AC_MSG_RESULT(ok) fi fi + +# We have inlined syscalls. +AC_DEFINE(HAVE_INLINED_SYSCALLS) diff --git a/sysdeps/unix/sysv/linux/dl-origin.c b/sysdeps/unix/sysv/linux/dl-origin.c index f7512340a1..a7fa53ea1d 100644 --- a/sysdeps/unix/sysv/linux/dl-origin.c +++ b/sysdeps/unix/sysv/linux/dl-origin.c @@ -24,6 +24,7 @@ #include <unistd.h> #include <sys/param.h> #include <ldsodefs.h> +#include <sysdep.h> #include <dl-dst.h> @@ -37,9 +38,11 @@ _dl_get_origin (void) char linkval[PATH_MAX]; char *result; int len; + INTERNAL_SYSCALL_DECL (err); - if ((len = __readlink ("/proc/self/exe", linkval, sizeof (linkval))) > 0 - && linkval[0] != '[') + len = INTERNAL_SYSCALL (readlink, err, 3, "/proc/self/exe", linkval, + sizeof (linkval)); + if (! INTERNAL_SYSCALL_ERROR_P (len, err) && len > 0 && linkval[0] != '[') { /* We can use this value. */ assert (linkval[0] == '/'); diff --git a/sysdeps/unix/sysv/linux/fcntl.c b/sysdeps/unix/sysv/linux/fcntl.c index a6793bc526..ab8d9cfb9c 100644 --- a/sysdeps/unix/sysv/linux/fcntl.c +++ b/sysdeps/unix/sysv/linux/fcntl.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -26,6 +26,9 @@ int +#ifdef NO_CANCELLATION +static inline __attribute ((always_inline)) +#endif __fcntl_nocancel (int fd, int cmd, ...) { va_list ap; diff --git a/sysdeps/unix/sysv/linux/i386/fcntl.c b/sysdeps/unix/sysv/linux/i386/fcntl.c index f47d98e6bf..2b3db38e53 100644 --- a/sysdeps/unix/sysv/linux/i386/fcntl.c +++ b/sysdeps/unix/sysv/linux/i386/fcntl.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2000, 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -32,6 +32,9 @@ int __have_no_fcntl64; int +#ifdef NO_CANCELLATION +static inline __attribute ((always_inline)) +#endif __fcntl_nocancel (int fd, int cmd, ...) { va_list ap; @@ -65,16 +68,15 @@ __fcntl_nocancel (int fd, int cmd, ...) /* Check if we can represent the values with the smaller type. */ if ((off64_t) fl.l_start != fl64->l_start) { + eoverflow: __set_errno (EOVERFLOW); return -1; } fl.l_len = (off_t) fl64->l_len; /* Check if we can represent the values with the smaller type. */ if ((off64_t) fl.l_len != fl64->l_len) - { - __set_errno (EOVERFLOW); - return -1; - } + goto eoverflow: + fl.l_type = fl64->l_type; fl.l_whence = fl64->l_whence; fl.l_pid = fl64->l_pid; @@ -101,10 +103,8 @@ __fcntl_nocancel (int fd, int cmd, ...) fl.l_start = (off_t) fl64->l_start; /* Check if we can represent the values with the smaller type. */ if ((off64_t) fl.l_start != fl64->l_start) - { - __set_errno (EOVERFLOW); - return -1; - } + goto eoverflow: + fl.l_len = (off_t)fl64->l_len; /* Check if we can represent the values with the smaller type. */ if ((off64_t) fl.l_len != fl64->l_len) diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c b/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c index f629a35fb4..4b60a163ce 100644 --- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c +++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/fcntl.c @@ -26,6 +26,9 @@ int +#ifdef NO_CANCELLATION +static inline __attribute ((always_inline)) +#endif __fcntl_nocancel (int fd, int cmd, ...) { va_list ap; diff --git a/sysdeps/unix/sysv/linux/pread.c b/sysdeps/unix/sysv/linux/pread.c index 9e17f1f916..90057f3f40 100644 --- a/sysdeps/unix/sysv/linux/pread.c +++ b/sysdeps/unix/sysv/linux/pread.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1997,1998,1999,2000,2002,2003 Free Software Foundation, Inc. +/* Copyright (C) 1997-2000,2002,2003,2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -44,6 +44,9 @@ static ssize_t __emulate_pread (int fd, void *buf, size_t count, static ssize_t +#ifdef NO_CANCELLATION +inline __attribute ((always_inline)) +#endif do_pread (int fd, void *buf, size_t count, off_t offset) { ssize_t result; diff --git a/sysdeps/unix/sysv/linux/pwrite.c b/sysdeps/unix/sysv/linux/pwrite.c index 35b6231708..f4eb2f5544 100644 --- a/sysdeps/unix/sysv/linux/pwrite.c +++ b/sysdeps/unix/sysv/linux/pwrite.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1997,1998,1999,2000,2002,2003 Free Software Foundation, Inc. +/* Copyright (C) 1997-2000,2002,2003,2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997. @@ -44,6 +44,9 @@ static ssize_t __emulate_pwrite (int fd, const void *buf, size_t count, static ssize_t +#ifdef NO_CANCELLATION +inline __attribute ((always_inline)) +#endif do_pwrite (int fd, const void *buf, size_t count, off_t offset) { ssize_t result; |