summary refs log tree commit diff
path: root/elf
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2004-07-06 04:26:42 +0000
committerUlrich Drepper <drepper@redhat.com>2004-07-06 04:26:42 +0000
commitce6e047fbb353e1d2faf15ab104a19db609b622b (patch)
tree3cf56ba767e54e26c5a7bfedc235728d457c9093 /elf
parent2dd18ce2b2dfecc737479548f5b6d1784d90fe79 (diff)
downloadglibc-ce6e047fbb353e1d2faf15ab104a19db609b622b.tar.gz
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.
Diffstat (limited to 'elf')
-rw-r--r--elf/dl-init.c4
-rw-r--r--elf/dl-misc.c2
-rw-r--r--elf/dl-open.c9
-rw-r--r--elf/dl-profile.c2
-rw-r--r--elf/dl-support.c2
-rw-r--r--elf/rtld.c4
6 files changed, 19 insertions, 4 deletions
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)
     {