about summary refs log tree commit diff
path: root/elf
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>1995-06-08 09:00:23 +0000
committerRoland McGrath <roland@gnu.org>1995-06-08 09:00:23 +0000
commit5bf62f2d3a8af353fac661b224fc1604d4de51ea (patch)
treed71b6ad14564a99917f2d4133a8685df94d24c61 /elf
parent75598ca67e469359c3c0b6b8704dae17bf2b9d89 (diff)
downloadglibc-5bf62f2d3a8af353fac661b224fc1604d4de51ea.tar.gz
glibc-5bf62f2d3a8af353fac661b224fc1604d4de51ea.tar.xz
glibc-5bf62f2d3a8af353fac661b224fc1604d4de51ea.zip
Thu Jun 8 02:50:26 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
	* elf/rtld.c [! NDEBUG] (__assert_perror_fail): New function.

	* hurd/hurdstartup.c (_hurd_startup): Fancier kludge to guess phdr
 	and user entry point addresses.

	* elf/dl-load.c (open_path): Don't do strlen on DIRPATH if it's null.
	(_dl_map_object): DT_RPATH value is relative to DT_STRTAB value.

	* Makerules (install-lib.so): Don't include libc.so.
	[$(build-shared)=yes] (install): Depend on the installed libc.so file.
	[$(build-shared)=yes] (install-no-libc.a): Make this, rather than
	install, depend on the installed $(install-lib.so) files.
	[$(build-shared)=yes] (install-lib.so): Append libc.so after that rule.

	* sysdeps/mach/hurd/dl-sysdep.c (_dl_sysdep_start): Add kludge to
 	allocate high addresses to avoid random mappings appearing there.
	(mmap): Comment out mask; always pass zero.

Tue Jun  6 13:34:53 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>

	* sysdeps/i386/dl-machine.h (ELF_MACHINE_USER_ADDRESS_MASK): New macro.
	* sysdeps/mach/hurd/dl-sysdep.c (mmap): Use it as mask in vm_map call.

	* elf/dl-error.c (_dl_catch_error): Clear *ERRSTRING and *OBJNAME
 	when successful.

	* sysdeps/mach/hurd/dl-sysdep.c (threadvars): New static variable.
	(__hurd_threadvar_max, __hurd_threadvar_stack_offset): Define these
	variables, using the `threadvars' buffer.

	* elf/dl-reloc.c: Don't dereference L->l_prev when it's null.
	* sysdeps/i386/dl-runtime.c: Likewise.

	* elf/rtld.c (dl_main): Add missing NULL terminating argument in
 	_dl_sysdep_fatal call.
	(__assert_fail): Likewise.

	* locale/Makefile (localedef-modules): Renamed ctype to
 	locale-ctype so as not to conflict with the object file for
 	ctype/ctype.c in the build directory.

	* sysdeps/i386/dl-machine.h (elf_machine_rel): If MAP->l_type is
 	lt_interpreter, first undo relocation done during bootstrapping.
Diffstat (limited to 'elf')
-rw-r--r--elf/dl-error.c1
-rw-r--r--elf/dl-load.c6
-rw-r--r--elf/dl-reloc.c6
-rw-r--r--elf/rtld.c22
4 files changed, 28 insertions, 7 deletions
diff --git a/elf/dl-error.c b/elf/dl-error.c
index b5af2e323f..a5c861190f 100644
--- a/elf/dl-error.c
+++ b/elf/dl-error.c
@@ -46,6 +46,7 @@ _dl_catch_error (const char **errstring,
   if (errcode == 0)
     {
       (*operate) ();
+      *errstring = *objname = NULL;
       return 0;
     }
 
diff --git a/elf/dl-load.c b/elf/dl-load.c
index bb1ad972d4..c48286f938 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -54,7 +54,7 @@ open_path (const char *name, size_t namelen,
 	   const char *dirpath,
 	   char **realname)
 {
-  char buf[strlen (dirpath) + 1 + namelen];
+  char *buf;
   const char *p;
   int fd;
 
@@ -65,6 +65,7 @@ open_path (const char *name, size_t namelen,
       return -1;
     }
 
+  buf = alloca (strlen (dirpath) + 1 + namelen);
   do
     {
       dirpath = p;
@@ -166,7 +167,8 @@ _dl_map_object (struct link_map *loader, const char *name,
       fd = -1;
       if (loader && loader->l_info[DT_RPATH])
 	trypath ((const char *) (loader->l_addr +
-				 loader->l_info[DT_RPATH]->d_un.d_ptr));
+				 loader->l_info[DT_STRTAB]->d_un.d_ptr +
+				 loader->l_info[DT_RPATH]->d_un.d_val));
       if (fd == -1 && ! _dl_secure)
 	trypath (getenv ("LD_LIBRARY_PATH"));
       if (fd == -1)
diff --git a/elf/dl-reloc.c b/elf/dl-reloc.c
index a3590ff749..7cbed389b8 100644
--- a/elf/dl-reloc.c
+++ b/elf/dl-reloc.c
@@ -69,7 +69,8 @@ _dl_relocate_object (struct link_map *l, int lazy)
     real_next = l->l_next;
     if (l->l_info[DT_SYMBOLIC])
       {
-	l->l_prev->l_next = real_next;
+	if (l->l_prev)
+	  l->l_prev->l_next = real_next;
 	l->l_next = _dl_loaded;
 	scope = l;
       }
@@ -88,7 +89,8 @@ _dl_relocate_object (struct link_map *l, int lazy)
 
     /* Restore list frobnication done above for DT_SYMBOLIC.  */
     l->l_next = real_next;
-    l->l_prev->l_next = l;
+    if (l->l_prev)
+      l->l_prev->l_next = l;
   }
 
   if (l->l_info[DT_JMPREL] && lazy)
diff --git a/elf/rtld.c b/elf/rtld.c
index c36409a995..7855c59052 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -144,8 +144,8 @@ command line to load and run an ELF executable file; this is like executing\n\
 that file itself, but always uses this helper program from the file you\n\
 specified, instead of the helper program file specified in the executable\n\
 file you run.  This is mostly of use for maintainers to test new versions\n\
-of this helper program; chances are you did not intend to run this program.\n"
-			      );
+of this helper program; chances are you did not intend to run this program.\n",
+			      NULL);
 
 	  rtld_command = 1;
 	  interpreter_name = _dl_argv[0];
@@ -289,9 +289,25 @@ __assert_fail (const char *assertion,
   _dl_sysdep_fatal ("BUG IN DYNAMIC LINKER ld.so: ",
 		    file, ": ", _itoa (line, buf + sizeof buf - 1, 10, 0),
 		    ": ", function ?: "", function ? ": " : "",
-		    "Assertion `", assertion, "' failed!\n");
+		    "Assertion `", assertion, "' failed!\n",
+		    NULL);
 
 }
 weak_symbol (__assert_fail)
 
+void
+__assert_perror_fail (int errnum,
+		      const char *file, unsigned int line,
+		      const char *function)
+{
+  char buf[64];
+  buf[sizeof buf - 1] = '\0';
+  _dl_sysdep_fatal ("BUG IN DYNAMIC LINKER ld.so: ",
+		    file, ": ", _itoa (line, buf + sizeof buf - 1, 10, 0),
+		    ": ", function ?: "", function ? ": " : "",
+		    "Unexpected error: ", strerror (errnum), "\n", NULL);
+
+}
+weak_symbol (__assert_perror_fail)
+
 #endif