Just a note on the severity, I've marked this as a "blocker" because it seems
quite basic and it makes it impossible for us to use GCC/G++ to generate a
thread safe shared object for use with JNI.  Please adjust as appropriate.

I'm not sure if this is a g++ bug or a libstdc++ bug, I've followed David
Edelsohn's suggestion that it's a library problem, but it's triggered by a
difference in a compiler option and the resulting initialization code, with the
complications produced by AIX xcoff linking thrown in for good measure.

I've reduced this to a three file example.  The first file contains a main and
tries to use a static string declared in the second (header) file which it
includes.  The third file contains the actual definition of the static string. 
If I compile this with -pthread it dies with a SEGV because the string objects
are uninitialized and it's trying to follow a null pointer.  Compiled without
-pthread it works just fine.  David and I have comfirmed this with multiple
versions of the OS (5.2, 5.3) and gcc (4.1.1, 4.1.2, 4.2).  According to him it
works in 4.3, but since that's still a development version it's not really a
viable option for production software yet.

I'd love to hear that this isn't a bug and that we just need to change some
copilation or link flag, but 

[EMAIL PROTECTED] aix_gcc_problem]$ g++ -v
Using built-in specs.
Target: powerpc-ibm-aix5.3.0.0
Configured with: ../gcc-4.1.1/configure --prefix=/usr/local
--enable-languages=c,c++ --enable-long-long --enable-threads=aix
--enable-version-specific-runtime-libs --enable-shared --with-as=/usr/bin/as
--with-ld=/usr/bin/ld --with-ar=/usr/bin/ar
Thread model: aix
gcc version 4.1.1


[EMAIL PROTECTED] aix_gcc_problem]$ cat main.cpp
#include <iostream>
#include <string>
#include <exception>

#include <StatusMessageIDs_mini.h>

using namespace std;

namespace foo {
   extern const string a;
}

namespace foo {
   extern const string a = "Hello world!";
}

int main(int argc, char **argv)
{
    std::cout << foo::a << std::endl;

    std::cout << Res::InvalidDayOfWeek << std::endl;

    for (int i = 0 ; i < argc ; ++i)
        std::cout << argv[i] << std::endl;
}


[EMAIL PROTECTED] aix_gcc_problem]$ cat StatusMessageIDs_mini.h
#ifndef STATUSMESSAGEIDS_INCLUDE_GUARD
#define STATUSMESSAGEIDS_INCLUDE_GUARD

#include <string>

namespace Res  // contains all resource ids
{
    typedef const std::string ID;

    extern ID InvalidDayOfWeek;
} // namespace Res

#endif // STATUSMESSAGEIDS_INCLUDE_GUARD

[EMAIL PROTECTED] aix_gcc_problem]$ cat StatusMessageIDs_mini.cpp
#include "StatusMessageIDs_mini.h"

namespace Res  // contains all resource ids
{
     extern ID InvalidDayOfWeek("engine.status.agorai.invalidDayOfWeek");
} // namespace Res

[EMAIL PROTECTED] aix_gcc_problem]$ cat example.sh
#!/bin/bash

CXX=g++
CXX_OPTS="-fPIC -Wall -Werror -mminimal-toc -ggdb3"
#CXX_OPTS="-pthread $CXX_OPTS"

rm -f *.[oa] example

$CXX $CXX_OPTS -I. -o main.o -c main.cpp

$CXX $CXX_OPTS -o StatusMessageIDs_mini.o -c StatusMessageIDs_mini.cpp

/usr/bin/ar cr libexample.a ./StatusMessageIDs_mini.o
/usr/bin/ranlib libexample.a

$CXX $CXX_OPTS main.o ./libexample.a -o example

echo
./example a b c


-- 
           Summary: SegV on AIX 5.3 due to uninit'ed static object when
                    using -pthread
           Product: gcc
           Version: 4.1.1
            Status: UNCONFIRMED
          Severity: blocker
          Priority: P3
         Component: libstdc++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: tom dot culliton at oracle dot com
 GCC build triplet: powerpc-ibm-aix5.3.0.0
  GCC host triplet: powerpc-ibm-aix5.3.0.0
GCC target triplet: powerpc-ibm-aix5.3.0.0


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=31282

Reply via email to