about summary refs log tree commit diff
path: root/elf/ldconfig.c
diff options
context:
space:
mode:
Diffstat (limited to 'elf/ldconfig.c')
-rw-r--r--elf/ldconfig.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/elf/ldconfig.c b/elf/ldconfig.c
index 444dc73750..64c4f64727 100644
--- a/elf/ldconfig.c
+++ b/elf/ldconfig.c
@@ -787,16 +787,33 @@ search_dir (const struct dir_entry *entry)
 	  continue;
 	}
 
-      /* Links will just point to itself.  */
+
+      /* A link may just point to itself.  */
       if (is_link)
 	{
-	  free (soname);
-	  soname = xstrdup (direntry->d_name);
-	}
+	  /* If the path the link points to isn't its soname and it is not
+	     .so symlink for ld(1) only, we treat it as a normal file.  */
+	  char *real_base_name = basename (real_name);
+
+	  if (strcmp (real_base_name, soname) != 0)
+	    {
+	      len = strlen (real_base_name);
+	      if (len < strlen (".so")
+		  || strcmp (real_base_name + len - strlen (".so"), ".so") != 0
+		  || strncmp (real_base_name, soname, len) != 0)
+		is_link = 0;
+	    }
+        }
 
       if (real_name != real_file_name)
 	free (real_name);
 
+      if (is_link)
+	{
+	  free (soname);
+	  soname = xstrdup (direntry->d_name);
+	}
+
       if (flag == FLAG_ELF
 	  && (entry->flag == FLAG_ELF_LIBC5
 	      || entry->flag == FLAG_ELF_LIBC6))