tech-pkg archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: libstdc++.so and mysterious build errors
> On Sun 23 Oct 2022 at 16:34:03 +0200, Havard Eidnes wrote:
>> At this point there are at least two ways forwards that i can
>> see:
>>
>> 1) It's an operator error to let old libstdc++.so libraries lay around
>> (or perhaps specifically libstdc++.so.7*), and I should just remove
>> those and proceed with life.
>
> It has been my policy for a while (just because of incompatible changes
> in the C++ libraries) that if I have to compile one package with a newer
> gcc, I delete all packages and recompile them with the same gcc. I
> usually rebuild my chroot environment for this occasion to make sure it
> is clean.
Well, yes... However, that's possibly what one can do on an
individual basis, possibly by manipulating /etc/mk.conf midway
(after the new gcc is installed). I'm not sure we can translate
that properly into "what should pkgsrc do for a bulk build".
I can of course do as indicated above and remove libstdc++.so
version 6, 7 and 8 from /usr/lib, remove any binary packages
which lists any of those libstdc++.so's as REQUIRED (yes, there
were some), and re-start the entire bulk build.
I am however not entirely convinced that will sort out this
problem properly either. The reason is that e.g. in the main R
package, ${PREFIX}/lib/R/library/grDevices/libs/cairo.so gets
installed, and via a dynamic dependency via libpangocairo-1.0.so,
libpangoft2-1.0.so, libharfbuzz.so and then libgraphite2.so, the
latter has a dynamic libstdcc++.so.9 dependency which is found in
/usr/lib, since libgraphite2.so is most probably built with the
in-tree c++ compiler.
Once I've removed /usr/lib/libstdc++.so.7, whenever the R module
mentioned earlier is loaded, you can end up with two different major
versions of libstdc++.so dynamically loaded due to the divergent major
shared library version numbering scheme between pkgsrc gcc and in-tree
gcc. That sounds to me like a recipe for disaster, but what do I know
-- is some trick used so that this isn't really a problem? Or will
symbols now without warning or error resolve to just one of them? Or
will you get a dynamic linker error message when the latter is
attempted loaded?
I guess I will find out.
>> 2) Find a way to put the library directory of gcc (in this case
>> /usr/pkg/gcc10/lib) earlier in the RPATH. This should preferably
>> be done in a robust and "pkgsrc-ish" way.
>
> Many years ago I used a FreeBSD system where I had 2 different gcc
> versions installed. They had the same library names, but they were not
> compatible. Of course, one of them was first in the system-wide search
> path. So, programs compiled with the other version were suddenly
> mysteriously broken. It cost me some time to find out what was going
> on.
>
> This event has brought me to crusade against library search paths.
> System-wide (like in FreeBSD or Linux) they are clearly no good. But
> per-executable (like we have with NetBSD's --rpath) is also not good
> enough. It can still cause the wrong version of a library to be used.
>
> ELF actually supports storing full paths to shared libraries, but our
> tools strip the path if it is given. I did some experiments with
> creating executables with full dependency paths, and with some tricks
> this is already possible. It would however be nicer if the tools didn't
> work against us here.
Indeed. But I can see problems arising from such a scheme as well, in
that you then either can't easily execute built binaries from inside
the build tree, or forcing externally-maintained packages (what we
have with pkgsrc) to have to implement a "re-link" step before
installation to avoid having installed binaries pointing into the
build directory.
But what do I know, I've not tried following that path myself.
Regards,
- Håvard
Home |
Main Index |
Thread Index |
Old Index