Discussion:
init_priority attribute and libstdc++
Václav Zeman
2014-08-17 19:56:33 UTC
Permalink
Hi.

I want to use the init_priority(prio) attribute
(https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Attributes.html#C_002b_002b-Attributes)
to initialize stuff in my library early so that users of the library can
use the library during their own static objects construction. However,
my library uses standard C++ library facilities like std::string,
std::vector<>, etc. The question is:

What is the lowest priority for init_priority attribute that I can use
to still have libstdc++ initialize itself before my library is initialized?
--
VZ
Václav Zeman
2014-08-18 19:04:43 UTC
Permalink
I'm on my phone so can't send plain text mail to the list, or check the
code, but I'm pretty sure the answer is 101
Anything lower than that is reserved for the implementation so libstdc++
would use that. Nothing in string or vector needs dynamic init anyway IIRC
Some paths of my library's initialization might try to print warnings or
errors. I have hit a SIGSEGV with the following test case, which uses
std::cerr:

~~~~
#include <iostream>

struct S1
{
S1() { std::cerr << __FUNCTION__ << "\n"; }
} static s1 __attribute__ ((__init_priority__ (65535/2)));


int
main ()
{
return 0;
}
~~~~

The stack trace is

~~~~
#0 0x00007ffff7b6a559 in std::ostream::sentry::sentry(std::ostream&) ()
from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#1 0x00007ffff7b6ac19 in std::basic_ostream<char,
std::char_traits<char> >& std::__ostream_insert<char,
std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char>
&, char const*, long)
() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#2 0x00007ffff7b6b077 in std::basic_ostream<char,
std::char_traits<char> >& std::operator<< <std::char_traits<char>
(std::basic_ostream<char, std::char_traits<char> >&, char const*) ()
from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3 0x000000000040081d in S1::S1 (this=0x601172 <s1>) at test.cxx:5
#4 0x00000000004007d6 in __static_initialization_and_destruction_0
(__initialize_p=1, __priority=32767) at test.cxx:6
#5 0x00000000004007eb in _GLOBAL__sub_I.32767_main(void) () at test.cxx:13
#6 0x000000000040087d in __libc_csu_init ()
#7 0x00007ffff7731e55 in __libc_start_main (main=0x40077d <main()>,
argc=1, argv=0x7fffffffe2c8, init=0x400830 <__libc_csu_init>,
fini=<optimized out>, rtld_fini=<optimized out>,
stack_end=0x7fffffffe2b8) at libc-start.c:246
#8 0x00000000004006b9 in _start ()
~~~~

Is this expected?
Hi.
I want to use the init_priority(prio) attribute
(https://gcc.gnu.org/onlinedocs/gcc/C_002b_002b-Attributes.html#C_002b_002b-Attributes)
to initialize stuff in my library early so that users of the library can
use the library during their own static objects construction. However,
my library uses standard C++ library facilities like std::string,
What is the lowest priority for init_priority attribute that I can use
to still have libstdc++ initialize itself before my library is
initialized?
--
VZ
Loading...