diff options
| author | Ulrich Drepper <drepper@redhat.com> | 2004-07-06 04:26:42 +0000 |
|---|---|---|
| committer | Ulrich Drepper <drepper@redhat.com> | 2004-07-06 04:26:42 +0000 |
| commit | ce6e047fbb353e1d2faf15ab104a19db609b622b (patch) | |
| tree | 3cf56ba767e54e26c5a7bfedc235728d457c9093 | |
| parent | 2dd18ce2b2dfecc737479548f5b6d1784d90fe79 (diff) | |
| download | glibc-ce6e047fbb353e1d2faf15ab104a19db609b622b.tar.xz glibc-ce6e047fbb353e1d2faf15ab104a19db609b622b.zip | |
Update.
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.
34 files changed, 297 insertions, 124 deletions
@@ -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_CANC |
