You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
While the rules make sure to link against a rather old glibc, this is not true for libstdc++, which comes as part of gcc. The default build mode links against libstdc++ dynamically. When running on a host that has a version that is too old, things break. We can of course work around this by linking statically. But if dynamic linking is not reliable from a portability perspective, IMHO it would be cleaner to drop support for dynamically linking libstdc++ completely.
Bazel can handle dynamic libraries well: put the appropriate symlink into the runfiles dir and set RPATH properly, so that the library is found at runtime. I think using that in the gcc-toolchain rules should be possible.
Version
Development (host) and target OS/architectures:
Host: Ubuntu 22.04
Target: Debian Buster
Architecture: both x86_64
Output of bazel --version:
bazel 5.3.1
Version of the Aspect rules, or other relevant rules from your WORKSPACE or MODULE.bazel file:
Language(s) and/or frameworks involved:
How to reproduce
# checkout branch where the C++ examples uses std::filesystem
git clone https://github.com/ahans/gcc-toolchain.git
cd gcc-toolchain
git switch use-filesystem
bazel build //examples/hello_world_cpp
# now try to run in a Debian Buster container
docker run -v $HOME:$HOME --workdir $(pwd) -ti debian:buster bazel-bin/examples/hello_world_cpp/hello_world_cpp
# results in:# bazel-bin/examples/hello_world_cpp/hello_world_cpp: /usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by bazel-bin/examples/hello_world_cpp/hello_world_cpp)# Replacing buster with bullseye makes it work. Bullseye ships with gcc 10.2, so that does support # std::filesystem; gcc 8.x from buster does not
Any other information?
No response
Fund our work
Sponsor our open source work by donating a bug bounty
The text was updated successfully, but these errors were encountered:
Hi @ahans, there are side effects in statically linking libstdc++. The 2 main ones are:
Binary sizes, which increase remote cache transfers significantly.
Inability to run sanitizers.
One trick to carry the stdlibc++ shared object provided by the sysroot with the binary is to set no_libstdcxx feature on your targets and then add @sysroot_x86_64//:libstdcxx to the deps. Notice that you would need a select to link against the correct target libstdc++.
What happened?
While the rules make sure to link against a rather old glibc, this is not true for libstdc++, which comes as part of gcc. The default build mode links against libstdc++ dynamically. When running on a host that has a version that is too old, things break. We can of course work around this by linking statically. But if dynamic linking is not reliable from a portability perspective, IMHO it would be cleaner to drop support for dynamically linking libstdc++ completely.
Bazel can handle dynamic libraries well: put the appropriate symlink into the runfiles dir and set RPATH properly, so that the library is found at runtime. I think using that in the gcc-toolchain rules should be possible.
Version
Development (host) and target OS/architectures:
Host: Ubuntu 22.04
Target: Debian Buster
Architecture: both x86_64
Output of
bazel --version
:bazel 5.3.1
Version of the Aspect rules, or other relevant rules from your
WORKSPACE
orMODULE.bazel
file:Language(s) and/or frameworks involved:
How to reproduce
Any other information?
No response
Fund our work
The text was updated successfully, but these errors were encountered: