summary refs log tree commit diff
path: root/elf/rtld.c
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1998-06-07 14:06:56 +0000
committerUlrich Drepper <drepper@redhat.com>1998-06-07 14:06:56 +0000
commitc0fb8a563c1c49e5fbec9bc22deac618910a3ff4 (patch)
treee7db886672cef990feba6c4357ebece5a820d7cf /elf/rtld.c
parent737547be99fd9afffbdf3f7ac817da0a06fffc9e (diff)
downloadglibc-c0fb8a563c1c49e5fbec9bc22deac618910a3ff4.tar.gz
glibc-c0fb8a563c1c49e5fbec9bc22deac618910a3ff4.tar.xz
glibc-c0fb8a563c1c49e5fbec9bc22deac618910a3ff4.zip
Update.
1998-06-07 13:32  Ulrich Drepper  <drepper@cygnus.com>

	* libc.map: Add _dl_profile.
	* elf/dl-reloc.c (_dl_relocate_object): Take extra argument, pass
	this to ELF_DYNAMIC_RELOCATE.
	Always allocate array for relocation result if LD_PROFILE is defined.
	* elf/ldsodefs.h: Adjust prototypes.
	* elf/dl-open.c (_dl_open): Call relocation function with extra
	argument.
	* elf/rtld.c: Likewise.
	* elf/dl-profile.c (_dl_mcount): Don't mark as internal function.
	Correct loop condition.
	* elf/dynamic-link.h: Don't examine _dl_profile variable, pass
	consider_profile to runtime setup function.
	* sysdeps/i386/dl-machine.h (elf_machine_runtime_setup): Use
	_dl_runtime_profile for all shared objects if LD_PROFILE is defined.

	* elf/dl-support.c: Define __libc_stack_end.
	* elf/rtld.c: Likewise.
	* sysdeps/generic/libc-start.c: Store last stack address in
	__libc_stack_end.
	* sysdeps/i386/dl-machine.h (_dl_start_user): Store stack address.
	* sysdeps/i386/elf/start.s: Call __libc_start_main with extra argument.

	* elf/elf.h: Include <features.h>, not <sys/cdefs.h>.
	Include <stdint.h>, not <inttypes.h>.

	* elf/sprof.c: Implement flat profiling.

	* libio/fgetc.c: Call _IO_cleanup_region_end with 0 and call
	_IO_funlockfile explicitly.
	* libio/fileops.c: Likewise.
	* libio/fputc.c: Likewise.
	* libio/freopen.c: Likewise.
	* libio/freopen64.c: Likewise.
	* libio/fseek.c: Likewise.
	* libio/fseeko.c: Likewise.
	* libio/fseeko64.c: Likewise.
	* libio/ftello.c: Likewise.
	* libio/ftello64.c: Likewise.
	* libio/getc.c: Likewise.
	* libio/getchar.c: Likewise.
	* libio/iofclose.c: Likewise.
	* libio/iofflush.c: Likewise.
	* libio/iofgetpos.c: Likewise.
	* libio/iofgetpos64.c: Likewise.
	* libio/iofgets.c: Likewise.
	* libio/iofputs.c: Likewise.
	* libio/iofread.c: Likewise.
	* libio/iofsetpos.c: Likewise.
	* libio/iofsetpos64.c: Likewise.
	* libio/ioftell.c: Likewise.
	* libio/iofwrite.c: Likewise.
	* libio/iogetdelim.c: Likewise.
	* libio/iogets.c: Likewise.
	* libio/ioputs.c: Likewise.
	* libio/ioseekoff.c: Likewise.
	* libio/ioseekpos.c: Likewise.
	* libio/iosetbuffer.c: Likewise.
	* libio/iosetvbuf.c: Likewise.
	* libio/ioungetc.c: Likewise.
	* libio/iovsprintf.c: Likewise.
	* libio/iovsscanf.c: Likewise.
	* libio/oldfileops.c: Likewise.
	* libio/oldiofclose.c: Likewise.
	* libio/peekc.c: Likewise.
	* libio/putc.c: Likewise.
	* libio/putchar.c: Likewise.
	* libio/rewind.c: Likewise.

	* malloc/mtrace.c: Pretty print.

	* misc/mntent.h (struct mentent): Make string elements const char *.

	* nis/nis_printf.c: Optimize I/O a little bit.

	* signal/Makefile (distribute): Add sigset-cvt-mask.h.
	* sysdeps/generic/sigset-cvt-mask.h: New file.
	* sysdeps/unix/sysv/linux/sigset-cvt-mask.h: New file.
	* sysdeps/unix/sysv/sysv4/sigset-cvt-mask.h: New file.
	* sysdeps/posix/sigvec.c: Rewrite the use definitions from
	sigset-cvt-mask.h to do the dirty work.
	Patches by Joe Keane.

	* sysdeps/posix/mkstemp.c: Save one precious byte of rodata.

	* sysdeps/unix/sysv/linux/i386/sysdep.h: Rewrite PSEUDO etc to make
	syscall_error label in case of PIC anonymous.
	* sysdeps/unix/sysv/linux/i386/i686/sysdep.h: Likewise.
	* sysdeps/unix/sysv/linux/i386/clone.S: Adapt for this change.
	* sysdeps/unix/sysv/linux/i386/mmap.S: Adapt for this change.
	* sysdeps/unix/sysv/linux/i386/s_pread64.S: Adapt for this change.
	* sysdeps/unix/sysv/linux/i386/s_pwrite64.S: Adapt for this change.
	* sysdeps/unix/sysv/linux/i386/socket.S: Adapt for this change.
	* sysdeps/unix/sysv/linux/i386/syscall.S: Adapt for this change.
Diffstat (limited to 'elf/rtld.c')
-rw-r--r--elf/rtld.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/elf/rtld.c b/elf/rtld.c
index fe676f7005..58f9da8ef8 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -93,6 +93,9 @@ const char *_dl_inhibit_rpath;		/* RPATH values which should be
    never be called.  */
 int _dl_starting_up;
 
+/* This variable contains the lowest stack address ever used.  */
+void *__libc_stack_end;
+
 static void dl_main (const ElfW(Phdr) *phdr,
 		     ElfW(Half) phent,
 		     ElfW(Addr) *user_entry);
@@ -201,7 +204,7 @@ relocate_doit (void *a)
   struct relocate_args *args = (struct relocate_args *) a;
 
   _dl_relocate_object (args->l, _dl_object_relocation_scope (args->l),
-		       args->lazy);
+		       args->lazy, 0);
 }
 
 static void
@@ -852,6 +855,11 @@ of this helper program; chances are you did not intend to run this program.\n\
        know that because it is self-contained).  */
 
     struct link_map *l;
+    int consider_profiling = _dl_profile != NULL;
+
+    /* If we are profiling we also must do lazy reloaction.  */
+    lazy |= consider_profiling;
+
     l = _dl_loaded;
     while (l->l_next)
       l = l->l_next;
@@ -859,7 +867,8 @@ of this helper program; chances are you did not intend to run this program.\n\
       {
 	if (l != &_dl_rtld_map)
 	  {
-	    _dl_relocate_object (l, _dl_object_relocation_scope (l), lazy);
+	    _dl_relocate_object (l, _dl_object_relocation_scope (l), lazy,
+				 consider_profiling);
 	    *_dl_global_scope_end = NULL;
 	  }
 	l = l->l_prev;
@@ -875,7 +884,7 @@ of this helper program; chances are you did not intend to run this program.\n\
     if (_dl_rtld_map.l_opencount > 0)
       /* There was an explicit ref to the dynamic linker as a shared lib.
 	 Re-relocate ourselves with user-controlled symbol definitions.  */
-      _dl_relocate_object (&_dl_rtld_map, &_dl_default_scope[2], 0);
+      _dl_relocate_object (&_dl_rtld_map, &_dl_default_scope[2], 0, 0);
   }
 
   {