title: g++ doesn't resolve pthread_once used in stdlibc++
body: <p>I was static linking a program using gtest, stdlibc++ and pthread, the link command is as follows </p>
  
  <p>g++ -static -L/usr/local/lib -o test run_test.o -lgtest -lstdc++ -lgcc -lgcc_eh -lpthread -lc </p>
  
  <p>it can produce the binary but it crashes every time, when I trace the core dump </p>
  
  <pre>
  
      #0  0x0000000000000000 in ?? ()
      #1  0x000000000048bf11 in __gthread_once (__func=0x48beb0 , 
          __once=)
          at /home/abuild/rpmbuild/BUILD/gcc-4.8.5/obj-x86_64-suse-linux/x86_64-suse-linux/libstdc++-v3/include/x86_64-suse-linux/bits/gthr-default.h:699
      #2  std::locale::_S_initialize () at ../../../../../libstdc++-v3/src/c++98/locale_init.cc:276
      #3  0x000000000048bf53 in std::locale::locale (this=0x7e3a98 )
          at ../../../../../libstdc++-v3/src/c++98/locale_init.cc:210
      #4  0x000000000045798c in basic_streambuf (this=)
          at /home/abuild/rpmbuild/BUILD/gcc-4.8.5/obj-x86_64-suse-linux/x86_64-suse-linux/libstdc++-v3/include/streambuf:466
      #5  stdio_sync_filebuf (__f=0x7dd580 , this=)
          at /home/abuild/rpmbuild/BUILD/gcc-4.8.5/obj-x86_64-suse-linux/x86_64-suse-linux/libstdc++-v3/include/ext/stdio_sync_filebuf.h:77
      #6  std::ios_base::Init::Init (this=) at ../../../../../libstdc++-v3/src/c++98/ios_init.cc:85
      #7  0x00000000004028fe in __static_initialization_and_destruction_0 (__initialize_p=1, __priority=65535)
          at /usr/include/c++/4.8/iostream:74
      #8  0x0000000000402927 in _GLOBAL__sub_I_main () at run_test.cpp:7
      #9  0x00000000004ac017 in __libc_csu_init (argc=argc@entry=1, argv=argv@entry=0x7ffcdf8db6d8, envp=0x7ffcdf8db6e8)
          at elf-init.c:88
      #10 0x00000000004ababd in __libc_start_main (main=0x4028ae , argc=1, argv=0x7ffcdf8db6d8, 
          init=0x4abfa0 , fini=0x4ac030 , rtld_fini=0x0, stack_end=0x7ffcdf8db6c8)
          at libc-start.c:244
      #11 0x00000000004027c7 in _start () at ../sysdeps/x86_64/start.S:122
  
  </pre>
  
  <p>and disassembled the binary found in std::locale::_S_initialize () the generated binary callq 0 instead of invoke the address of pthread_once.</p>
  
  <pre>
  
        48bf0c:   e8 ef 40 b7 ff          callq  0 
  
  </pre>
  
  <p>used objdump to dump the symbol table and found </p>
  
  <pre>
  
      0000000000000000  w      *UND*  0000000000000000 pthread_once
      0000000000000000  w      *UND*  0000000000000000 __pthread_once
  
  </pre>
  
  <p>It shows that linker know pthread_once is undefined weak symbol and refuse to resolve it. I have to add linker option -Wl,--undefined=pthread_once to force linker to resolve pthread_once to avoid crash. </p>
  
  <p>Does anyone know why linker doesn't resolve pthread_once ?</p>