From ce6e047fbb353e1d2faf15ab104a19db609b622b Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 6 Jul 2004 04:26:42 +0000 Subject: Update. 2004-07-05 Ulrich Drepper * 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. --- elf/dl-init.c | 4 ++++ elf/dl-misc.c | 2 +- elf/dl-open.c | 9 +++++++-- elf/dl-profile.c | 2 +- elf/dl-support.c | 2 ++ elf/rtld.c | 4 ++++ 6 files changed, 19 insertions(+), 4 deletions(-) (limited to 'elf') diff --git a/elf/dl-init.c b/elf/dl-init.c index c06c71b..e700dff 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 41ef261..08d6495 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 70f2fb2..4500249 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 8afa835..0a4aba1 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 0b2d024..2b53770 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 diff --git a/elf/rtld.c b/elf/rtld.c index 2e7a9b6..3def030 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) { -- cgit v1.1