On Fri, Oct 26, 2018 at 05:24:26PM +0200, Christian Weisgerber wrote:
> 
> Remaining failures from the switch to lld:
> 
> mail/evolution-rss      edbus-private not found
> net/telepathy/folks     edbus-private not found
> productivity/glabels    edbus-private not found

I took a look at glabels, and I am assuming others ports have similar
problem.

The error log is:

/usr/bin/libtool  --tag=CC   --mode=link cc ...
warning: could not find a edbus-private library
Link error: edbus-private not found!
 at /usr/libdata/perl5/LT/Library.pm line 137.
        LT::Library::resolve_library(LT::Library=HASH(0x126c6fa79898), 
ARRAY(0x126c06720070), 1, undef, "LT::Program") called at 
/usr/libdata/perl5/LT/Mode/Link/Program.pm line 84
        LT::Linker::Program::link(LT::Linker::Program=HASH(0x126c6fa76868), 
LT::Program=HASH(0x126c329be310), ARRAY(0x126c0aee3cd0), 
LT::OSConfig=HASH(0x126c975caac0), ARRAY(0x126c06720070), 
LT::Library::Stash=HASH(0x126c06720028), ARRAY(0x126c0aee3f88), 
ARRAY(0x126c10a22058), ...) called at 
/usr/libdata/perl5/LT/Mode/Link/Program.pm line 28
        LT::Program::link(LT::Program=HASH(0x126c329be310), 
ARRAY(0x126c0aee3cd0), LT::OSConfig=HASH(0x126c975caac0), 
ARRAY(0x126c06720070), LT::Library::Stash=HASH(0x126c06720028), 
ARRAY(0x126c0aee3f88), ARRAY(0x126c10a22058), LT::Parser=HASH(0x126c329be598), 
...) called at /usr/libdata/perl5/LT/Mode/Link.pm line 235
        LT::Mode::Link::run(LT::Mode::Link=HASH(0x126c329beb50), 
ARRAY(0x126c0aee3cd0), LT::Options=HASH(0x126c0aee3b20), 
LT::OSConfig=HASH(0x126c975caac0)) called at /usr/bin/libtool line 428

it is libtool that generate an error because it didn't found
edbus-private library.

This particular library comes from databases/evolution-data-server :

$ pkg_locate edbus-private
evolution-data-server-3.28.5:databases/evolution-data-server:/usr/local/lib/evolution-data-server/libedbus-private.so


So with ld.lld, libtool is unable to found the library.

I am able to reproduce the problem with just the following command line:

$ libtool --tag=CC --mode=link cc -v -o test -lebook-1.2
warning: could not find a edbus-private library
Link error: edbus-private not found!
...


For what I understood, libtool uses objdump -p libebook-1.2.so to found
the path dependencies (I have ktraced libtool).

On pre-ld.lld system, I have the following output:

$ objdump -p /usr/local/lib/libebook-1.2.so.21.0
...
Dynamic Section:
  NEEDED      libedata-book-1.2.so.18.0
  ...
  NEEDED      libedbus-private.so
  ...
  RPATH       /usr/local/lib/evolution-data-server
  ...

But on post-ld.lld, the output is slightly different:

$ objdump -p /usr/local/lib/libebook-1.2.so.21.0
...
Dynamic Section:
  RUNPATH     /usr/local/lib/evolution-data-server
  NEEDED      libedata-book-1.2.so
  ...
  NEEDED      libedbus-private.so
  ...


So ld.lld uses RUNPATH instead of RPATH, and as libtool only uses RPATH
to infer no standard directories... it fail to found the library.

The following diff on libtool permits to productivity/glabels to build.


Index: LT/Library.pm
===================================================================
RCS file: /cvs/src/usr.bin/libtool/LT/Library.pm,v
retrieving revision 1.12
diff -u -p -r1.12 Library.pm
--- LT/Library.pm       21 Sep 2015 08:49:06 -0000      1.12
+++ LT/Library.pm       27 Oct 2018 07:26:13 -0000
@@ -191,7 +191,7 @@ sub inspect
        return @deps;
 }
 
-# give the list of RPATH directories
+# give the list of RPATH/RUNPATH directories
 sub findrpaths
 {
        my $self = shift;
@@ -203,16 +203,20 @@ sub findrpaths
                say "warning: library was specified that could not be found: 
$self->{key}";
                return;
        }
-       tsay {"inspecting $filename for non standard RPATH..."};
+       tsay {"inspecting $filename for non standard RPATH/RUNPATH..."};
        open(my $fh, '-|', "objdump", "-p", "--", $filename);
        while (<$fh>) {
                if (m/RPATH\s+(.*)$/) {
                        @dirs = split(":", $1);
                        last;
                }
+               if (m/RUNPATH\s+(.*)$/) {
+                       @dirs = split(":", $1);
+                       last;
+               }
        }
        tsay {"found ", (@dirs == 0) ? 'none ' : '',
-               "RPATH for $filename\n@dirs"};
+               "RPATH/RUNPATH for $filename\n@dirs"};
        return @dirs;
 }
 

Thanks.
-- 
Sebastien Marie

Reply via email to