about summary refs log tree commit diff
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>1998-08-27 20:42:04 +0000
committerUlrich Drepper <drepper@redhat.com>1998-08-27 20:42:04 +0000
commit5f62394167f5df4565e6e07e1e16c56021626e50 (patch)
tree2d21615bf816ac7cc3b9cdf9b90a1e68b43a7680
parentf787edde1dcd0f35feff9c8fd6384bd564558180 (diff)
downloadglibc-5f62394167f5df4565e6e07e1e16c56021626e50.tar.gz
glibc-5f62394167f5df4565e6e07e1e16c56021626e50.tar.xz
glibc-5f62394167f5df4565e6e07e1e16c56021626e50.zip
Update.
	Call _dl_new_object with extra argument.
	Call _dl_new_object with extra argument.
	but the main one if new argument is nonzero.
	* elf/ldsodefs.h: Adjust for _dl_new_object change.
	(dl_main): Call _dl_new_object with extra argument.
-rw-r--r--ChangeLog6
-rw-r--r--elf/dl-load.c5
-rw-r--r--elf/dl-object.c7
-rw-r--r--elf/ldsodefs.h8
-rw-r--r--elf/rtld.c2
-rw-r--r--sysdeps/unix/sysv/linux/dl-origin.h6
6 files changed, 20 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index 3605250234..b1f0fa7d12 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -12,13 +12,17 @@
 	(_dl_map_object_from_fd): Define static is EXTERNAL_MAP_FROM_FD is
 	not defined.
 	Check EI_OSABI and EI_ABIVERSION fields in header.
+	Call _dl_new_object with extra argument.
 	(_dl_map_object): Call decompose_path with correct argument.
 	Call expand_dynamic_string_token instead of local_strdup to also
 	expand DST.
+	Call _dl_new_object with extra argument.
 	* elf/dl-object.c (_dl_new_object): Determine l_origin for all maps
-	but the main one.
+	but the main one if new argument is nonzero.
+	* elf/ldsodefs.h: Adjust for _dl_new_object change.
 	* elf/dl-support.c: Define _dl_origin_path.
 	* elf/rtld.c: Likewise.  Set _dl_origin_path based on LD_ORIGIN_PATH.
+	(dl_main): Call _dl_new_object with extra argument.
 
 	* elf/dl-close (_dl_close): Free l_name and l_origin.
 
diff --git a/elf/dl-load.c b/elf/dl-load.c
index 8e6a8537a3..81c1d8ba2e 100644
--- a/elf/dl-load.c
+++ b/elf/dl-load.c
@@ -739,7 +739,7 @@ _dl_map_object_from_fd (char *name, int fd, char *realname,
 #endif
 
   /* Enter the new object in the list of loaded objects.  */
-  l = _dl_new_object (realname, name, l_type);
+  l = _dl_new_object (realname, name, l_type, loader != NULL);
   if (! l)
     lose (ENOMEM, "cannot create shared object descriptor");
   l->l_opencount = 1;
@@ -1290,7 +1290,8 @@ _dl_map_object (struct link_map *loader, const char *name, int preloaded,
 
 	  /* Enter the new object in the list of loaded objects.  */
 	  if ((name_copy = local_strdup (name)) == NULL
-	      || (l = _dl_new_object (name_copy, name, type)) == NULL)
+	      || (l = _dl_new_object (name_copy, name, type,
+				      loader != NULL)) == NULL)
 	    _dl_signal_error (ENOMEM, name,
 			      "cannot create shared object descriptor");
 	  /* We use an opencount of 0 as a sign for the faked entry.  */
diff --git a/elf/dl-object.c b/elf/dl-object.c
index f2ef8163ce..e91beac926 100644
--- a/elf/dl-object.c
+++ b/elf/dl-object.c
@@ -33,7 +33,7 @@ struct link_map *_dl_default_scope[5];
 
 struct link_map *
 internal_function
-_dl_new_object (char *realname, const char *libname, int type)
+_dl_new_object (char *realname, const char *libname, int type, int find_origin)
 {
   struct link_map *new = malloc (sizeof *new);
   struct libname_list *newname = malloc (sizeof *newname);
@@ -62,9 +62,8 @@ _dl_new_object (char *realname, const char *libname, int type)
       l->l_next = new;
     }
 
-  /* The REALNAME is "" for the main link map.  This name must be determined
-     specially.  */
-  if (realname[0] == '\0')
+  /* Don't try to find the origin for the main map.  */
+  if (! find_origin)
     new->l_origin = NULL;
   else
     {
diff --git a/elf/ldsodefs.h b/elf/ldsodefs.h
index 847d5cec12..b36fcd8725 100644
--- a/elf/ldsodefs.h
+++ b/elf/ldsodefs.h
@@ -166,7 +166,7 @@ extern void _dl_sysdep_output (int fd, const char *string, ...);
    descriptor for this.  All arguments are `const char *'; args until
    a null pointer are concatenated to form the message to print.  If
    NEW_LINE is nonzero it is assumed that the message starts on a new
-   line.*/
+   line.  */
 extern void _dl_debug_message (int new_line, const char *string, ...);
 
 /* OS-dependent function to write a message on the standard output.
@@ -356,9 +356,11 @@ extern struct link_map **_dl_object_relocation_scope (struct link_map *map)
 
 
 /* Allocate a `struct link_map' for a new object being loaded,
-   and enter it into the _dl_loaded list.  */
+   and enter it into the _dl_loaded list.  If find origin is nonzero
+   determine the origin of the file.  */
 extern struct link_map *_dl_new_object (char *realname, const char *libname,
-					int type) internal_function;
+					int type, int find_origin)
+     internal_function;
 
 /* Relocate the given object (if it hasn't already been).
    SCOPE is passed to _dl_lookup_symbol in symbol lookups.
diff --git a/elf/rtld.c b/elf/rtld.c
index 3b3dfbf669..600f062b3c 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -420,7 +420,7 @@ of this helper program; chances are you did not intend to run this program.\n\
     {
       /* Create a link_map for the executable itself.
 	 This will be what dlopen on "" returns.  */
-      main_map = _dl_new_object ((char *) "", "", lt_executable);
+      main_map = _dl_new_object ((char *) "", "", lt_executable, 0);
       if (main_map == NULL)
 	_dl_sysdep_fatal ("cannot allocate memory for link map\n", NULL);
       main_map->l_phdr = phdr;
diff --git a/sysdeps/unix/sysv/linux/dl-origin.h b/sysdeps/unix/sysv/linux/dl-origin.h
index eef067814a..7f7d86c404 100644
--- a/sysdeps/unix/sysv/linux/dl-origin.h
+++ b/sysdeps/unix/sysv/linux/dl-origin.h
@@ -30,15 +30,15 @@ get_origin (void)
   char *result;
 
   if (readlink ("/proc/self/exe", linkval, PATH_MAX) != -1
-      && result[0] != '[')
+      && linkval[0] != '[')
     {
       /* We can use this value.  */
       char *last_slash = strrchr (linkval, '/');
-      result = (char *) malloc (linkval - last_slash + 1);
+      result = (char *) malloc (last_slash - linkval + 1);
       if (result == NULL)
 	result = (char *) -1;
       else
-	*((char *) __mempcpy (result, linkval, linkval - last_slash)) = '\0';
+	*((char *) __mempcpy (result, linkval, last_slash - linkval)) = '\0';
     }
   else
     {