diff options
author | Patrick Palka <ppalka@redhat.com> | 2022-11-16 08:53:51 -0500 |
---|---|---|
committer | Patrick Palka <ppalka@redhat.com> | 2022-11-16 08:53:51 -0500 |
commit | ec59848074ba8c4310cbadb603822bfaeff03a32 (patch) | |
tree | 137b51eb3c81cb951f57c7665fb74c2712c756fc /libstdc++-v3 | |
parent | c5e8c6c193d9a1ab80ef1a05e5158ddf35d54009 (diff) | |
download | gcc-ec59848074ba8c4310cbadb603822bfaeff03a32.zip gcc-ec59848074ba8c4310cbadb603822bfaeff03a32.tar.gz gcc-ec59848074ba8c4310cbadb603822bfaeff03a32.tar.bz2 |
libstdc++: Fix stream initialization with static library [PR107701]
When linking with a static library, the linker seems to discard a
constituent .o object (including its global initializers) if nothing
defined in the object is referenced by the program (unless e.g.
--whole-archive is used). This behavior breaks iostream with static
libstdc++.a (on systems that support init priorities) because we define
the global initializer for the standard stream objects in a separate TU
(ios_init.cc) from the stream object definitions (globals_io.cc).
This patch fixes this by moving the stream initialization object into
the same TU that defines the stream objects, so that any use of the
streams prevents the linker from discarding this global initializer.
PR libstdc++/107701
libstdc++-v3/ChangeLog:
* include/std/iostream (__ioinit): Adjust comment.
* src/c++98/globals_io.cc: Include "io_base_init.h" here
instead of ...
* src/c++98/ios_init.cc: ... here.
* src/c++98/ios_base_init.h (__ioinit): More comments.
* testsuite/17_intro/static.cc: dg-do run instead of just link.
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/include/std/iostream | 2 | ||||
-rw-r--r-- | libstdc++-v3/src/c++98/globals_io.cc | 2 | ||||
-rw-r--r-- | libstdc++-v3/src/c++98/ios_base_init.h | 1 | ||||
-rw-r--r-- | libstdc++-v3/src/c++98/ios_init.cc | 2 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/17_intro/static.cc | 2 |
5 files changed, 5 insertions, 4 deletions
diff --git a/libstdc++-v3/include/std/iostream b/libstdc++-v3/include/std/iostream index ff78e1c..0c62e9a 100644 --- a/libstdc++-v3/include/std/iostream +++ b/libstdc++-v3/include/std/iostream @@ -74,7 +74,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION // For construction of filebuffers for cout, cin, cerr, clog et. al. // When the init_priority attribute is usable, we do this initialization - // in the compiled library instead (src/c++98/ios_init.cc). + // in the compiled library instead (src/c++98/globals_io.cc). #if !__has_attribute(__init_priority__) static ios_base::Init __ioinit; #endif diff --git a/libstdc++-v3/src/c++98/globals_io.cc b/libstdc++-v3/src/c++98/globals_io.cc index 04fecb2..bfd808b 100644 --- a/libstdc++-v3/src/c++98/globals_io.cc +++ b/libstdc++-v3/src/c++98/globals_io.cc @@ -69,6 +69,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION fake_wostream wclog; #endif +#include "ios_base_init.h" + _GLIBCXX_END_NAMESPACE_VERSION } // namespace diff --git a/libstdc++-v3/src/c++98/ios_base_init.h b/libstdc++-v3/src/c++98/ios_base_init.h index 1c71038..b600ec3 100644 --- a/libstdc++-v3/src/c++98/ios_base_init.h +++ b/libstdc++-v3/src/c++98/ios_base_init.h @@ -7,6 +7,7 @@ // sufficiently early (so that it happens before any other global // constructor when statically linking with libstdc++.a), instead of // doing so in (each TU that includes) <iostream>. +// This needs to be done in the same TU that defines the stream objects. #if __has_attribute(init_priority) static ios_base::Init __ioinit __attribute__((init_priority(90))); #endif diff --git a/libstdc++-v3/src/c++98/ios_init.cc b/libstdc++-v3/src/c++98/ios_init.cc index 4016fca..1b5132f 100644 --- a/libstdc++-v3/src/c++98/ios_init.cc +++ b/libstdc++-v3/src/c++98/ios_init.cc @@ -75,8 +75,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION extern wostream wclog; #endif -#include "ios_base_init.h" - ios_base::Init::Init() { if (__gnu_cxx::__exchange_and_add_dispatch(&_S_refcount, 1) == 0) diff --git a/libstdc++-v3/testsuite/17_intro/static.cc b/libstdc++-v3/testsuite/17_intro/static.cc index ffa7ecb..a0d6ed0 100644 --- a/libstdc++-v3/testsuite/17_intro/static.cc +++ b/libstdc++-v3/testsuite/17_intro/static.cc @@ -1,4 +1,4 @@ -// { dg-do link { target c++11 } } +// { dg-do run { target c++11 } } // { dg-require-static-libstdcxx } // { dg-options "-static-libstdc++" } |