On Wed, Apr 28, 2004 at 03:35:07PM +0400, Dmitry V. Levin wrote: [...] > > @@ -770,10 +790,27 @@ search_dir (const struct dir_entry *entr > > continue; > > } > > > > + > > + /* A link may just point to itself. */ > > + if (is_link) > > + { > > + /* 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. */ > > + const char *real_base_name = basename (real_file_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); > > > > - /* Links will just point to itself. */ > > if (is_link) > > { > > free (soname); > > > > libMesaGL.so - это тоже ссылка (на libGL.so.1.4.501). Судя по > > комментарию, такая ссылка должна была бы игнорироваться, но на самом > > деле этого не происходит из-за третьей части написанного здесь условия > > (strncmp (real_base_name, soname, len) != 0). > > По идее автора этого изменения, ссылка libMesaGL.so должна игнорироваться > только в случае, если она ссылается на libMesaGL.so.* Там всё ещё страннее - похоже, readlink() там нигде не вызывается, поэтому real_file_name - это имя самой ссылки, а не то, на что она показывает. Т.е., любая ссылка, имя которой не совпадает с soname, и при этом не заканчивается на ".so" _или_ не начинается с soname, будет считаться обычным файлом библиотеки (вне зависимости от того, куда эта ссылка показывает). Первые две проверки (на полное совпадение с soname и на *.so) мне понятны. А вот третья выглядит как-то странно. Возможно, подразумевалось что-то такое: --- glibc-2.3.3-200404190147/elf/ldconfig.c.alt-ldconfig-links 2004-04-28 15:48:26 +0400 +++ glibc-2.3.3-200404190147/elf/ldconfig.c 2004-04-28 16:25:53 +0400 @@ -801,9 +801,9 @@ search_dir (const struct dir_entry *entr 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) + if ((len < strlen (".so") + || strcmp (real_base_name + len - strlen (".so"), ".so") != 0) + && strncmp (real_base_name, soname, len) != 0) is_link = 0; } } Хотя всё равно непонятно, зачем это нужно. Чтение ChangeLog ситуацию особо не проясняет: 2003-08-26 Jakub Jelinek * elf/ldconfig.c (search_dir): When checking for GNU-style .so link file use the real file name, not the resolved name we got by following the symlinks. 2003-08-25 Jakub Jelinek * elf/ldconfig.c (search_dir): Treat symlink as regular file if it won't point to itself unless it is .so symlink for the linker.