[Bug 1824721] Re: g++-8 in disco is broken with libstdc++6 from gcc9 and libstdc++fs
Jonathan Wakely
1824721 at bugs.launchpad.net
Tue Apr 16 10:56:29 UTC 2019
The GCC 8 std::filesystem (and std::experimental::filesystem) symbols
are in libstdc++fs.a which is only provided as a static library, so link
order does matter. If you don't tell the linker to use it after the
objects that require it, then no symbols from libstdc++fs.a will be
used.
In GCC 9 the std::experimental::filesystem symbols are still in
libstdc++fs.a but the std::filesystem symbols are in libstdc++.so.6.0.26
now, but they're incompatible with the GCC 8 definitions. In your
problematic link no symbols were used from libstdc++fs.a, so the linker
finds the GCC 9 ones in libstdc++.so.6.0.25 and uses them, but that
leads to crashes.
It would have been possible to make the GCC 8 and 9 std::filesystem
symbols mangle differently, and maybe I should do that for GCC 8.4, but
for now the short answer is "C++17 support in GCC 8 is experimental, the
onus is on you to link correctly".
Since this problem is specific to Ubuntu, due to mixing gcc-8 and
libstdc++.so.6.0.26, another possibility would be for Ubuntu's gcc-8 to
reorder the linker arguments. If -lstdc++fs is given it could be moved
to after the object files (but before the implicit -lstdc++ option that
g++ adds).
Another option would be to make g++ simply link to -lstdc++fs
implicitly, as it does for -lstdc++. Unless the user adds -Wl,--whole-
archive (and doesn't follow it with -Wl,--no-whole-archive) that should
be harmless because the symbols in libstdc++fs.a will only be used if
actually needed.
--
You received this bug notification because you are a member of Ubuntu
Foundations Bugs, which is subscribed to gcc-8 in Ubuntu.
https://bugs.launchpad.net/bugs/1824721
Title:
g++-8 in disco is broken with libstdc++6 from gcc9 and libstdc++fs
Status in gcc-8 package in Ubuntu:
Incomplete
Bug description:
There is a significant incompatibility here which leaves the default
C++ compiler broken with C++17 std::filesystem usage. Unfortunately,
there isn't an obvious workaround since there's only one libstdc++6
package, and it's using the non-default and unreleased GCC9 version of
libstdc++, making it impossible to use the compatible GCC8 version of
the library.
% cat testpath.cpp
#include <filesystem>
int main()
{
std::filesystem::path p("test");
}
g++-9 -std=c++17 -lstdc++fs -g3 -o testpath testpath.cpp
% ./testpath
% g++-8 -std=c++17 -lstdc++fs -g3 -o testpath testpath.cpp
% ./testpath
zsh: segmentation fault (core dumped) ./testpath
% gdb testpath
GNU gdb (Ubuntu 8.2.91.20190405-0ubuntu3) 8.2.91.20190405-git
Copyright (C) 2019 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Type "show copying" and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from testpath...
(gdb) run
Starting program: /tmp/testpath
Program received signal SIGSEGV, Segmentation fault.
0x000055555555649b in std::vector<std::filesystem::__cxx11::path::_Cmpt, std::allocator<std::filesystem::__cxx11::path::_Cmpt> >::~vector (this=0x23, __in_chrg=<optimised out>) at /usr/include/c++/8/bits/stl_vector.h:567
567 std::_Destroy(this->_M_impl._M_start, this->_M_impl._M_finish,
(gdb) bt
#0 0x000055555555649b in std::vector<std::filesystem::__cxx11::path::_Cmpt, std::allocator<std::filesystem::__cxx11::path::_Cmpt> >::~vector (this=0x23, __in_chrg=<optimised out>) at /usr/include/c++/8/bits/stl_vector.h:567
#1 0x0000555555556314 in std::filesystem::__cxx11::path::~path (this=0x3, __in_chrg=<optimised out>)
at /usr/include/c++/8/bits/fs_path.h:208
#2 0x0000555555556f5c in std::filesystem::__cxx11::path::_Cmpt::~_Cmpt (this=0x3, __in_chrg=<optimised out>)
at /usr/include/c++/8/bits/fs_path.h:643
#3 0x0000555555556f77 in std::_Destroy<std::filesystem::__cxx11::path::_Cmpt> (__pointer=0x3)
at /usr/include/c++/8/bits/stl_construct.h:98
#4 0x0000555555556e27 in std::_Destroy_aux<false>::__destroy<std::filesystem::__cxx11::path::_Cmpt*> (
__first=0x3, __last=0x0) at /usr/include/c++/8/bits/stl_construct.h:108
#5 0x0000555555556a98 in std::_Destroy<std::filesystem::__cxx11::path::_Cmpt*> (__first=0x3, __last=0x0)
at /usr/include/c++/8/bits/stl_construct.h:137
#6 0x00005555555567a9 in std::_Destroy<std::filesystem::__cxx11::path::_Cmpt*, std::filesystem::__cxx11::path::_Cmpt> (__first=0x3, __last=0x0) at /usr/include/c++/8/bits/stl_construct.h:206
#7 0x00005555555564b1 in std::vector<std::filesystem::__cxx11::path::_Cmpt, std::allocator<std::filesystem::__cxx11::path::_Cmpt> >::~vector (this=0x7fffffffe310, __in_chrg=<optimised out>)
at /usr/include/c++/8/bits/stl_vector.h:567
#8 0x0000555555556314 in std::filesystem::__cxx11::path::~path (this=0x7fffffffe2f0, __in_chrg=<optimised out>)
at /usr/include/c++/8/bits/fs_path.h:208
#9 0x0000555555556230 in main () at testpath.cpp:5
(gdb) quit
A debugging session is active.
Inferior 1 [process 2414] will be killed.
Quit anyway? (y or n) y
To manage notifications about this bug go to:
https://bugs.launchpad.net/ubuntu/+source/gcc-8/+bug/1824721/+subscriptions
More information about the foundations-bugs
mailing list