Bug 9307 - Fails to load shared libraries located not in public place
: Fails to load shared libraries located not in public place
Status: ASSIGNED
: Sisyphus
(All bugs in Sisyphus/rpm-build-perl)
: unstable
: all Linux
: P2 normal
Assigned To:
:
:
:
:
:
  Show dependency tree
 
Reported: 2006-03-24 12:13 by
Modified: 2014-11-17 01:39 (History)


Attachments


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2006-03-24 12:13:57
http://lists.altlinux.org/pipermail/devel/2006-March/030452.html

При поиске зависимостей в %buildroot не учитывается, что бинарные модули могут
иметь установленный RPATH. Без этого не удается загрузить требуемые библиотеки.
------- Comment #1 From 2006-08-15 19:37:36 -------
Попробуйте
%define __spec_autodep_custom_pre export 
LD_LIBRARY_PATH=%buildroot%_libdir/libsvn_swig
------- Comment #2 From 2007-04-07 20:38:53 -------
ping
------- Comment #3 From 2008-11-05 10:18:33 -------
на subversion 1.5.4 ошибка с этими исправлениями сохраняется
------- Comment #4 From 2012-10-07 23:13:09 -------
Я проверил сборку subversion-1.6.17-alt2 с указанным в 1-ом комментарии
define'ом и сборка прошла успешной. Поэтому мне кажется, что blocker тут не
очень уместен.

В принципе, можно улучшить perl.req, заставив его искать lib*.so.* файлы
рекурсивно по всем каталогам в %buildroot%_libdir и добавлять все такие
найденные каталоги в LD_LIBRARY_PATH. Как-то так:

diff --git a/perl.req b/perl.req
index c6e2967..df23bbd 100755
--- a/perl.req
+++ b/perl.req
@@ -4,6 +4,7 @@ use strict;

 use Config qw(%Config);
 use PerlReq::Utils qw(argv inc explode mod2dep path2dep);
+use File::Find;

 sub pod2usage {
     eval { require Pod::Usage } or die $@;
@@ -188,10 +189,16 @@ sub do_deparse {
         }
 # adjust LD_LIBRARY_PATH if there are libraries inside buildroot
 # spotted by Yury Konovalov
-        for my $libdir ("/usr/lib64", "/usr/lib") {
-            next unless glob "$ENV{RPM_BUILD_ROOT}$libdir/lib*.so*";
+        my %lib_paths = ();
+        find ( sub {
+            next unless (/^lib.*\.so\..*$/ );
+            next if (exists $lib_paths{$File::Find::dir}
+                || $File::Find::dir =~ m{^$ENV{RPM_BUILD_ROOT}/usr/lib/debug}
);
+            $lib_paths{$File::Find::dir}++;
+        }, "$ENV{RPM_BUILD_ROOT}/usr/lib64", "$ENV{RPM_BUILD_ROOT}/usr/lib");
+        if (keys %lib_paths) {
             $ENV{LD_LIBRARY_PATH} .= ":" if $ENV{LD_LIBRARY_PATH};
-            $ENV{LD_LIBRARY_PATH} .= "$ENV{RPM_BUILD_ROOT}$libdir";
+            $ENV{LD_LIBRARY_PATH} .= join ":", keys %lib_paths;
         }
     }
     my @pipe = ($X, shebang_options($fname));
------- Comment #5 From 2014-11-16 21:46:37 -------
Ещё актуально?
------- Comment #6 From 2014-11-17 01:39:08 -------
(In reply to comment #5)
> Ещё актуально?

Актуально, но, видимо, уже не очень срочно.