From: GNU Libc Maintainers Date: Sat, 1 Jun 2024 21:16:35 +0000 (+0200) Subject: local-ldconfig-ignore-ld.so X-Git-Tag: archive/raspbian/2.38-12+rpi1^2~13 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=b9a2c70c96a5396018545534d777699022ce6796;p=glibc.git local-ldconfig-ignore-ld.so Gbp-Pq: Topic any Gbp-Pq: Name local-ldconfig-ignore-ld.so.diff --- diff --git a/elf/ldconfig.c b/elf/ldconfig.c index 203abfcdb..1ba9c7ed6 100644 --- a/elf/ldconfig.c +++ b/elf/ldconfig.c @@ -459,6 +459,25 @@ chroot_stat (const char *real_path, const char *path, struct stat *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, @@ -469,6 +488,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. */ @@ -497,6 +517,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. */