Package: glibc / 2.41-10

any/local-ldconfig-ignore-ld.so.diff Patch series | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
diff --git a/elf/ldconfig.c b/elf/ldconfig.c
index 4211f4c..6425f8e 100644
--- a/elf/ldconfig.c
+++ b/elf/ldconfig.c
@@ -450,6 +450,25 @@ chroot_stat (const char *real_path, const char *path, struct stat64 *st)
   return ret;
 }
 
+static const char * const ld_sonames[] =
+{
+  "ld-kfreebsd-x86-64.so.1",
+  "ld-linux-aarch64.so.1",
+  "ld-linux-aarch64_be.so.1",
+  "ld-linux-armhf.so.3",
+  "ld-linux-ia64.so.2",
+  "ld-linux-mipsn8.so.1",
+  "ld-linux-riscv64-lp64.so.1"
+  "ld-linux-riscv64-lp64d.so.1"
+  "ld-linux-x32.so.2",
+  "ld-linux-x86-64.so.2",
+  "ld-linux.so.2",
+  "ld-linux.so.3",
+  "ld.so.1",
+  "ld64.so.1",
+  "ld64.so.2",
+};
+
 /* Create a symbolic link from soname to libname in directory path.  */
 static void
 create_links (const char *real_path, const char *path, const char *libname,
@@ -460,6 +477,7 @@ create_links (const char *real_path, const char *path, const char *libname,
   struct stat stat_lib, stat_so, lstat_so;
   int do_link = 1;
   int do_remove = 1;
+  int i;
   /* XXX: The logics in this function should be simplified.  */
 
   /* Get complete path.  */
@@ -488,6 +506,18 @@ create_links (const char *real_path, const char *path, const char *libname,
 	  error (0, 0, _("Can't stat %s\n"), full_libname);
 	  return;
 	}
+
+      /* Do not change the symlink pointer to the dynamic linker except for
+	 non-existing symlinks, as it might break multiarch systems.  */
+      for (i = 0; i < sizeof (ld_sonames) / sizeof (ld_sonames[0]); i++)
+	if (__glibc_unlikely(!strcmp(soname, ld_sonames[i])))
+	  {
+	    if (opt_verbose)
+	      error (0, 0, _("%s is the dynamic linker, ignoring\n"),
+			     full_libname);
+	    do_link = 0;
+	  }
+
       if (stat_lib.st_dev == stat_so.st_dev
 	  && stat_lib.st_ino == stat_so.st_ino)
 	/* Link is already correct.  */