[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: dpkg-shlibdeps couldn't find library ... warning vs error



Hi!

On Wed, 2019-06-26 at 14:58:34 -0400, Crim, Christopher wrote:
> I am trying to understand the regex rules in the function split_soname from 
> dkpg-shlibdeps.pl.  Working with an old corporate code base that has yet to 
> adopt any versioning, all of the shared objects are named <object>.so.  When 
> attempting to package on a box that does not yet have the dependent packages 
> installed dpkg-shlibdeps will throw warnings, "dpkg-shlibdeps: warning: 
> couldn't find library <lib>.so needed by ..." but packaging will still succeed.  
> We have few shared objects that have ".so." as part of their name.  When dpkg-
> shlibdeps encounters these dependencies the warning becomes an error, "dpkg-
> shlibdeps: error: couldn't find library <lib>.so needed by ..." and packaging 
> fails.  I traced this down to the split_soname function which checks 2 regex 
> comparisons.  The shared objects that only throw warnings fall into the "else" 
> clause of the function.  The ones that fail fall into the first if clause which 
> as regex 1.  What were these regexs meant to match?

If the installed packages have no shlibs or symbols file information
then dpkg-shlibdeps cannot know what dependency information to inject,
which means the generated binaries will end up with missing/incorrect
dependencies. See below for the distinction.

> regex 1 (/^(.*)\.so\.(.*)$/):
> was this meant to capture shared objects with so number and revisons such as 
> libc.6 or libbz2.so.1.0.4?  If so, should the values after "so" be restricted 
> to numbers? 

It cannot be restricted to numbers only because the version might
include other characters.

This format is the one used commonly for public and stable shared
libraries, where the format is <name>.so.<version>, and then there's
at least one symlink of the form <name>.so pointing to the former and
used by other objects to link to, that gets them the latest <version>.

The key here is that the SONAME might only include part of the
SOVERSION, depending on where the <name>.so symlink points to, so you
could have:

  libfoo.so.1.2.3
  libfoo.so.1
  libfoo.so → libfoo.1

Because these are public interfaces they are expected to have
dependency information available.

> regex 2 (/^(.*)-(\d.*)\.so$/)
> The terminating so on this regex helps limit its capture but again should the 
> groups be limited to digits only?

This is the format commonly used for private and/or unstable shared
libraries, where the whole version is encoded in the SONAME. So you
could have:

  libbar-1.2.3.so
  libbar.so → libbar-1.2.3.so (optionally, otherwise you might be
                               required to specify the whole SONAME)

As these are private/unstable interfaces they are to be used at your
own risk, so that's why they are just warnings.

>  I have tried searching for inforamtion related to to naming conventions for 
> shared library names but the best I can come up with is that they need to be 
> prefixed with "lib" and suffixed with ".so" and possibly the so number and 
> revision.  A name such as "libcom.debian.foo.bar.so" should be valid.  If not 
> I would appreciate being pointed to such requirements.

I'm not sure now, there's anywhere properly documenting these details.
I don't think the debian-policy manual contains rationale for these.
I've for now locallt documented the split_soname() function, willcheck
whether one of the man pages can also be improved.

Hope that helps. Even though I'm not sure it resolved your issue at
hand? :)

Thanks,
Guillem


Reply to: