Raphael Hertzog writes:
> On Sun, 02 Dec 2007, Matthias Klose wrote:
> > > > The gcj-4.X packages fail to build with this version of dpkg:
> > > >
> > > > dpkg-shlibdeps: failure: no dependency information found for
> > > > /usr/lib64/libgcj_bc.so.1 (used by
> > > > debian/gcj-4.3/usr/lib/gcc/x86_64-linux-gnu/4.3/ecj1).
> > > > dh_shlibdeps: command returned error code 512
>
> Hum, /usr/lib64 is scanned after /usr/lib so it means that
> debian/gcj-4.3/usr/lib/gcc/x86_64-linux-gnu/4.3/ecj1 has a RPATH pointing
> to /usr/lib64 ...
>
> Is that true ? Is there a good reason for this ?
maybe not; but this kind of thing is hardcoded upstream, so you'll see
this in other packages as well.
> > > I must say that I find the construction of the libgcj-bc package very
> > > fragile. It doesn't contain the library it's supposed to contain but only
> > > a symlink to the library which is contained in another package (libgcj8-1
> > > on i386).
> >
> > This is done to build code which is independent of the libgcj
> > soversion (see /usr/lib/gcj/). On the contrary, that is rather stable
> > than fragile.
>
> What's the purpose of the package ? Avoiding to hardcode a version in
> build-depends ? Why can't you add this symlink+shlibs directly into libgcj8-1
> ?
>
> Since the soname is different, it shouldn't create any problem.
no, then all the -gcj packages would depend on libgcj8-1, not on
libgcj-bc.
>From the patch introducing libgcj_bc.so:
"Currently, binaries built with GCJ's "Binary Compatibility" ABI link
against the same SONAME as binaries built with the C++ ABI. This is
problematic because changes to the Java class libraries frequently
break C++ ABI compatibility: we need to bump the SONAME with each
release, but changing the SONAME itself breaks BC-ABI applications
which would otherwise be compatible. If the two ABIs are to continue
to co-exist, we need different SONAMEs for them.
This solution works by creating a shared library called libgcj_bc.so
which contains empty, "fake" declarations of all the symbols that
BC-ABI applications are allowed to reference in libgcj. At compilation
time, if -findirect-dispatch is specified, gcj will link with -lgcj_bc
instead of -lgcj. The linker will find libgcj_bc.so, which has an
SONAME of libgcj_bc.so.1.
However, libgcj_bc.so.1 itself is actually a symlink to the real
libgcj.so. So at runtime, the dynamic linker loads the real library to
resolve the libgcj_bc.so.1 SONAME.
This approach also has the side-benefit of ensuring that BC
applications only link against legitimate BC-ABI symbols."
> > > Why don't you ship the shlibs file in the package that provides the
> > > library ?
> > >
> > > On i386:
> > > libgcj8-1: /usr/lib/libgcj.so.81.0.0
> > >
> > > If you had done that, you wouldn't not have had that failure because
> > > dpkg-shlibdeps fallbacks to the realpath of the library when the
> > > first match doesn't give back a package.
> >
> > It is shipped in the same package. libgcj_bc is a different library
> > than libgcjX-Y which is used when building with -findirect-dispatch.
> > You can better see this by looking at the libgcj_bc.so file in the
> > libgcj8-dev package.
>
> I don't follow you:
> $ dpkg -L libgcj-bc
> /.
> /usr
> /usr/lib
> /usr/share
> /usr/share/doc
> /usr/share/lintian
> /usr/share/lintian/overrides
> /usr/share/lintian/overrides/libgcj-bc
> /usr/lib/libgcj_bc.so.1
> /usr/share/doc/libgcj-bc
>
> There's no library in that package. There's only the symlink and the
> shlibs.
>
> And the symlink points to a lib in libgc8-1:
> $ ls -al /usr/lib/libgcj_bc.so.1
> lrwxrwxrwx 1 root root 12 2007-09-05 08:47 /usr/lib/libgcj_bc.so.1 ->
> libgcj.so.81
> $ dpkg -S /usr/lib/libgcj.so.81
> libgcj8-1: /usr/lib/libgcj.so.81
>
> Granted there's another file libgcj_bc.so file in
> /usr/lib/gcc/i486-linux-gnu/4.2/libgcj_bc.so but it seems unrelated for
> our case.
>
> > > Anyway, I think I'll modify the code to not report a lib found though an
> > > official symlink like those (instead I'll resolve the directory symlink
> > > beforehand). Expect a fix later this week.
> >
> > Thanks. Many upstream build systems do hardcode /usr/lib64 for x86_64,
> > and /usr/lib32 is used as a synonym for /emul/<something> ...
>
> Resolving symlinks is not without problems however. Think of people with
> symlinks like "/usr -> /scratch/usr". So it's not easy to implement it
> properly.
Special-casing /lib{32,64} and /usr/lib{32,64} would be very welcome.
Matthias
--
To UNSUBSCRIBE, email to [EMAIL PROTECTED]
with a subject of "unsubscribe". Trouble? Contact [EMAIL PROTECTED]